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


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


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

 

retn

 

MyFunc       endp

Листинг 79

Поскольку результат компиляции Borland C++ 5.x практически в точности идентичен уже рассмотренному выше примеру от Microsoft Visual C++ 6.x, не будем терять на него время и сразу перейдем к разбору WATCOM C (как всегда – у WATCOM-а есть чему поучиться):

 

main_        proc near           ; CODE XREF: __CMain+40p

 

var_8        = qword      ptr -8

; локальная переменная на 8 байт

 

push   10h

call   __CHK

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

 

fld    ds:dbl_420008

; Закидываем на вершину стека сопроцессора переменную типа double,

; взимаемую из сегмента данных.

; Тип переменной успешно определила сама IDA, предварив его префиксом 'dbl'.

; А если бы не определила – тогда бы мы обратились к опкоду команды FLD.

 

fld    ds:flt_420010

; Закидываем на вершину стека сопроцессора переменную типа float

 

call   MyFunc

; Вызываем MyFunc с передачей двух аргументов через стек сопроцессора,

; значит, ее прототип выглядит так: MyFunc(float a, double b).

 

sub    esp, 8

; Резервируем место для локальной переменной размеров в 8 байт

 

fstp   [esp+8+var_8]

; Стягиваем с вершины стека вещественное типа double

; (тип определяется размером переменной).

 

push   offset unk_420004

call   printf_

; Ага, уже знакомый нам трюк передачи var_8 функции printf!

 

add    esp, 0Ch

retn

main_        endp

 

 

MyFunc       proc near           ; CODE XREF: main_+16p

 

var_C        = qword      ptr -0Ch

var_4        = dword      ptr –4

; IDA

нашла две локальные переменные

 

push   10h

call   __CHK

 

sub    esp, 0Ch

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

 

fstp   [esp+0Ch+var_4]

; Стягиваем с вершины стека сопроцессора вещественное значение типа float

; (оно, как мы помним, было занесено туда последним).

; На всякий случай, впрочем, можно удостоверится в этом, посмотрев опкод

; команды FSTP - D9 5C 24 08.


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