Фундаментальные основы хакерства




Идентификация стартовых функций - часть 4


и быстро убедиться, что это именно тот CALL, который нам нужен – нет никакой возможности. Впрочем, некоторые зацепки все-таки есть. Так, при неудачной инициализации DllMain возвращает FALSE, и код __DllMainCRTStartup обязательно проверит это значение, в случае чего прыгая аж к концу функции. Подробных ветвлений в теле стартовой функции не так уж много и обычно только одно из них связано с функций, принимающей три аргумента.

.text:1000121C                 push    edi

.text:1000121D                 push    esi

.text:1000121E                 push    ebx

.text:1000121F                 call    _DllMain@12

.text:10001224                 cmp     esi, 1

.text:10001227                 mov     [ebp+arg_4], eax

.text:1000122A                 jnz     short loc_0_10001238

.text:1000122C                 test    eax, eax

.text:1000122E                 jnz     short loc_0_10001267

Листинг 22 Идентификация DllMain по коду неудачной инициализации

Прокрутив экран немного вверх, нетрудно убедиться, что регистры EDI, ESI и EBX содержат lpvReserved, fdwReason и hinstDLL соответственно. А значит, перед нами и есть функция DllMain (Для справки, исходный текст __DllMainCRTStartup содержится в файле "dllcrt0.c", который настоятельно рекомендуется изучить).

Наконец, мы добрались и до функции main

консольных Windows-приложений. Как всегда, выполнение программы начинается не с нее, а c функции mainCRTStartup, инициализирующей кучу, систему ввода-вывода, подготавливающую аргументы командной строки и только потом предающей управление main. Функция main

принимает всего два аргумента: "int main(int argc, char **argv)" – этого слишком мало, чтобы выделить ее среди остальных. Однако приходит на помощь тот факт, что ключи командной строки доступны не только через аргументы, но и через глобальные переменные – __argc

и __argv

соответственно. Поэтому, вызов main обычно выглядит так:

.text:00401293                 push    dword_0_407D14

.text:00401299                 push    dword_0_407D10




Содержание  Назад  Вперед