Как вы знаете, когда мы
Как вы знаете, когда мы запускаем приложением, код вызывается откуда-то из KERNEL32 (т.е. KERNEL делает вызов нашего кода), а потом, если вы помните, когда вызов сделан, адрес возврата лежит на стеке (адрес памяти в ESP). Давайте применим эти знания на практике:
;---[ CUT HERE ]-------------------------------------------------------------
.586p ; Бах... просто так .model flat ; Хехехе, я люблю 32 бита
.data ; Кое-какие данные (их требует ; TASM32/TLINK32)
db ?
.code
start: mov eax,[esp] ; Теперь EAX будет равен BFF8XXXXh ; (в w9X) ; т.е. где-то внутри API ; CreateProcess :) ret ; Возвращаемся в него ;) end start
;---[ CUT HERE ]-------------------------------------------------------------
Ок, это просто. У нас в EAX есть значение, примерно равно BFF8XXXX (XXXX не играет роли, нам не нужно знать его точно. Так как Win32-платформы обычно все округляют до страницы, значит заголовок KERNEL32 находится в начале страницы, и мы можем легко найти его. А как только мы найдем заголовок PE, о котором я и веду речь, мы будем знать адрес KERNEL32. Хммм, наш лимит - 50h страниц. Хехе, не беспокойтесь, далее последует некоторый код ;).
;---[ CUT HERE ]-------------------------------------------------------------
.586p .model flat
extrn ExitProcess:PROC
.data
limit equ 5
db 0
;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·; ; Ненужные и несущественные данные :) ; ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;
.code
test: call delta delta: pop ebp sub ebp,offset delta
mov esi,[esp] and esi,0FFFF0000h call GetK32
push 00000000h call ExitProcess
;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·; ; Грхм, я предполагаю, что вы, по крайней мере, нормальный asm-кодер, то ; ; то есть знаете, что первый блок инструкций предназначается для получения ; ; дельта-смещения (хорошо, это не необходимо в данном примере, как бы то ; ; ни было я хочу придать данному коду сходство с вирусом). Нам интересен ; ; второй блок. Мы помещаем в ESI адрес, откуда было вызвано наше ; ; приложение. Он находится в ESP (если мы, конечно, не трогали стек после ; ; загрузки программы. Вторая инструкция, AND, получает начало страницы, из ; ; которой был вызван наш код. Мы вызываем нашу процедуру, после чего ; ; прерываем процесс ;). ; ;-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·;