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


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


; В общем, как бы там ни было, но с результатами работы IDA

следует обращаться

; очень осторожно.

 

arg_0        = dword      ptr  8

arg_4        = dword      ptr  0Ch

arg_8        = dword      ptr  10h

 

push   ebp

mov    ebp, esp

push   esi

; Это, как видно, сохранение регистра в стеке, а не передача его функции, т.к.

; регистр явным образом не инициализировался ни вызывающей, ни вызываемой

; функцией.

 

mov    esi, [ebp+arg_0]

; Заносим в регистр ESI последней занесенный в стек аргумент

 

add    esi, [ebp+arg_4]

; Складываем содержимое ESI с предпоследним занесенным в стек аргументом

 

mov    eax, [ebp+arg_8]

; Заносим в в EAX пред- предпоследний аргумент и…

 

push   eax          ; const      char *

; …засылаем его в стек.

 

call   _strlen

; Поскольку strlen ожидает указателя на строку, можно с уверенностью

; заключить, что пред- предпоследний аргумент – строка, переданная по ссылке.

 

add    esp, 4

; Вычистка последнего аргумента из стека

 

add    eax, esi

; Как мы помним, в ESI хранится сумма двух первых аргументов,

; а в EAX – возвращенная длина строки. Таким образом, функция суммирует

; два своих аргумента с длиной строки.

 

pop    esi

pop    ebp

retn   0Ch

; Стек чистит вызываемая функция, следовательно, тип вызова stdcall

или PASCAL.

; Будем считать, что это stdcall, тогда прототип функции выглядит так:

; int MyFunc(int a, int b, char *c)

;

; Порядок аргументов вытекает из того, что на вершине стека были две

; переменные типа int, а под ними строка. Поскольку на верху стека лежит

; всегда то, что заносилось в него в последнюю очередь, а по stdcall

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

; следования аргументов

MyFunc       endp

Листинг 61

А теперь рассмотрим, как происходит вызов cdecl функции. Изменим в предыдущем примере ключевое слово stdcall на cdecl:

 

#include <stdio.h>

#include <string.h>

 

__cdecl MyFunc(int a, int b, char *c)




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



Книжный магазин