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



         

Идентификация аргументов функций - часть 40


MyFunc       proc near           ; CODE XREF: _main+11p

arg_0        = dword      ptr  8

; через стек функции передавался лишь один аргумент

push   ebp

mov    ebp, esp

; Открываем кадр стека

movsx  eax, al

; Borland

сгенерировал более оптимальный код, чем Microsoft, не помещая

; регистр в локальную переменную и экономя тем самым память. Впрочем, если бы

; был задан соответствующий ключ оптимизации, Microsoft Visual C++ поступил

; точно так же.

; Обратите внимание еще и на то, что Borland

обрабатывает аргументы

; в выражениях слева направо в порядке их перечисления в прототипе функции,

; в то время как Microsoft Visual C++ поступает наоборот.

add    edx, eax

add    ecx, edx

; Регистры EDX и CX не были инициализированы, значит, в них функции были

; переданы аргументы.

mov    edx, [ebp+arg_0]

; Загружаем в EDX последний аргумент функции, переданный через стек…

add    ecx, edx

; …складываем еще раз

mov    eax, ecx

; Передаем в EAX (в EAX функция возвращает результат своего завершения)

pop    ebp

retn   4

; Вычищаем за собой стек

MyFunc        endp

Листинг 72

Наконец, результат компиляции WATCOM C должен выглядеть так:

main_        proc near           ; CODE XREF: __CMain+40p

push   18h

call   __CHK

; Проверка стека на переполнение

push   ebx

push   esi

push   edi

; Сохраняем регистры в стеке

mov    ebx, 4

mov    edi, 3

mov    esi, 2

mov    eax, 1

; Смотрите, аргументы передаются через те аргументы, которые мы указали!

; Более того, отметьте, что первый аргумент типа char

передается через

; 32-разрядный регистр EAX! Такое поведение WATCOM-а чрезвычайно

; затрудняет восстановление прототипов функций! В данном случае присвоение

; регистрам значений происходит согласно порядку объявления аргументов

; в прототипе функции, считая справа. Но так, увы, бывает далеко не всегда.

call   MyFunc

push   eax




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