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


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


; Поэтому, результат, полученный IDA, надо трактовать так: функции передается не менее

; четырех аргументов. Впрочем, и здесь не все гладко! Ведь никто не мешает вызываемой

; функции залезать в стек материнской так далеко, как она захочет! Может быть,

; нам не передавали никаких аргументов вовсе, а мы самовольно полезли в стек и

; стянули что-то оттуда. Хотя это случается в основном вследствие программистских

; ошибок из-за путаницы с прототипами, считаться с такой возможностью необходимо.

; (Когда ни будь вы все равно с этим встретитесь, так что будьте готовы)

; Число, стоящее после 'arg', выражает смещение аргумента относительно начала

; кадра стека.

; Обратите внимание: сам кадр стека смещен на восемь байт относительно EBP

-

; четыре байта занимает сохраненный адрес возврата, и еще четыре уходят на сохранение

; регистра EBP.

 

push   ebp

mov    ebp, esp

lea    eax, [ebp+arg_8]

; получение указателя на аргумент.

; Внимание: именно указателя на аргумент, а не изволение аргумента-указателя!

; Теперь разберемся – на какой именно аргумент мы получаем указатель.

; IDA

уже вычислила, что этот аргумент смещен на восемь байт относительно

; начала кадра стека. В оригинале выражение, заключенное в скобках выглядело

; как ebp+0x10 – так его и отображает большинство дизассемблеров. Не будь IDA

; такой умной, нам бы пришлось постоянно вручную отнимать по восемь байт от

; каждого такого адресного выражения (впрочем, с этим мы еще поупражняемся)

;

; Логично: на вершине то, что мы клали в стек в последнею очередь.

; Смотрим вызывающую функцию – что ж мы клали-то?

; (см. вариант, откомпилированный Microsoft Visual C++)

; Ага, последними были те два непонятные аргумента, а перед ними в стек

; засылалась структура, состоящая из строки и переменной типа int

; Таким образом, EBP+ARG_8 указывает на строку

 

push   eax

; Засылаем в стек полученный указатель.

; Похоже, что он передается очередной функции.

 

mov    ecx, [ebp+arg_1C]

; Заносим в ECX содержимое аргумента EBP+ARG_1C.


- Начало -  - Назад -  - Вперед -