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


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


таблицы 2 - 7).

Соглашения же cdecl и stdcall предписывают передать все аргументы через стек, включая неявный аргумент this, заносимый в стек в последнюю очередь – после всех явных аргументов (другими словами, this – самый левый аргумент).

Рассмотрим следующий пример:

 

#include <stdio.h>

 

class MyClass{

 public:

void           demo(int a);

// прототип demo в действительности выглядит так demo(this, int a)

 

void __stdcall demo_2(int a, int b);

// прототип demo_2 в действительности выглядит так demo_2(this, int a, int b)

 

void __cdecl   demo_3(int a, int b, int c);

// прототип demo_2 в действительности выглядит так demo_2(this, int a, int b, int c)

 

};

 

// Реализзация функция demo, demo_2, demo_3 для экономии места опущена

 

main()

{

MyClass *zzz = new MyClass;

zzz->demo();

zzz->demo_2();

zzz->demo_3();

}

Листинг 84 Демонстрация передачи неявного аргумента - this

 

Результат компиляции этого примера компилятором Microsoft Visual C++ 6.0 должен выглядеть так (показана лишь функция main, все остальное не представляет на данный момент никакого интереса):

 

main         proc near           ; CODE XREF: start+AFp

push   esi

; Сохраняем ESI в стеке

 

push   1

call   ??2@YAPAXI@Z ; operator new(uint)

; Выделяем один байт для экземпляра объекта

 

mov    esi, eax

; ESI

содержит указатель на экземпляр объекта

 

add    esp, 4

; Выталкиваем аргумент из стека

 

mov    ecx, esi

; Через ECX функции Demo передается указатель this.

; Как мы помним, компилятор Microsoft Visual C++ использует регистр ECX

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

; В данном случае этим аргументом и является указатель this.

; А компилятор Borland C++ 5.x передал бы this через регистр EAX, т.к.

; он отдает ему наибольшее предпочтение (см. таблицу 4)

 

push   1

; Заносим в стек явный аргумент функции. Значит, это не fastcall-функция,

; иначе бы данный аргумент был помещен в регистр EDX.


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