5) Поиск АПИ.
Когда Винда загружает файл, она в адресное пространство кидает библиотеки, адреса имён которых содержатся в таблице импорта файла. Потом заполняет какие-то таблицы адресами АПИшек. При чём эти таблицы фиксированы. Вспомним нашу прогу(её вид в отладчике):
//******************** Program Entry Point ********
:00401000 A10C104000 mov eax, dword ptr [0040100C]
:00401005 6A00 push 00000000
* Reference To: KERNEL32.ExitProcess, Ord:0000h
|
:00401007 E804000000 Call 00401010 ;всё внимание на эту строчку...
:0040100C 00000000 BYTE 4 DUP(0)
Это вызов АПИ функции ExitProcess из KERNEL32.dll. Неужели вы думаете, что кернел кидают сразу за файл с его функциями???
Нет, просто мы прыгаем на таблицу, а там в определённом поле (смещение 00401010) висит адрес этой функции. Но если мы заразим файл, то там не обязательно будет такая-самая таблица. Ещё меньше вероятность того, что эта таблица содержит адреса всех нужных нам АПИшек. То есть мы прыгнем по тому адресу, а там окажется фигня какая-то. Кстати вот, что видит дизассемблер по смещению
00401010
* Reference To: KERNEL32.ExitProcess, Ord:0000h
|
:00401010 FF2530304000 Jmp dword ptr [00403030]
Вот так. То есть для того, чтоб нам в вирусе использовать АПИ, их адреса нужно найти вручную, то есть, "подражая" загрузчику, найти адреса, забить их себе в "самопальную" таблицу. Сделать это можно многими способами:
- Попытаться найти в импортах адреса LoadLibraryA и GetModuleHandleA. А там найти адреса библиотек и функций
- Найти их в экспорте Кернела
- Найти все в экспорте Кернела
- Другие
Я остановлюсь на 3 варианте. В 1ом есть шанс провалится, во 2ом ИМХО эвристик заставит антивируса визжать.
Я то на нём остановился. Но тут возникает проблема - где этот кернел висит???? Это действительно вопрос!!!!! Адрес кернела тоже надо искать.