Подключение пользовательского вызова с помощью встроенного ассема - PullRequest
0 голосов
/ 12 января 2012

Я разобрал исполняемый файл с IDA pro.Моя цель - подключить функцию __usercall.Я знаю, что мне нужно обернуть __usercall inine asm в мой код C ++, так как я не могу набрать определение функции.Но я просто не уверен, как это работает.

Я знаю, что функция принимает объект в качестве параметра и * Vector3 в качестве параметра, в котором будет сохранено вычисленное значение.Есть ли простой способ определить, какой параметр будет каким? ??close ??

// Don't know what params goes where, ie: where the Vec3 goes and where the object goes
int __stdcall func_hook(param1, param2, param3, param4);

// Where to put the address? -->> 0x572EA0

// char __usercall sub_572EA0<al>(int a1<ecx>, int a2<edx>, int a3<eax>, int a4);
__declspec(naked) void func_hook() 
{__asm{ 
    push ebp 
    mov ebp, esp 
    mov ecx param1
    mov edx param2
    mov eax param3
    push param4
    call func_hook 
    leave 
    ret 
}}

В этом фрагменте кода отсутствует одна вещь - адрес вызова пользователя (0x572EA0).Не уверен, куда это поместить ...


Вот как программа вызывает функцию.Звонок внизу: http://i43.tinypic.com/2mez9c8.jpg

1 Ответ

2 голосов
/ 12 января 2012

эта функция, которую вы перехватываете, равна Borland __fastcall, а не __usercall (на самом деле такого соглашения на самом деле не существует, это всего лишь версия IDA "неизвестного соглашения").

С точки зрения перехвата этого с помощью встроенного asm, ECX, EDX и EAX - это чистые регистры, поэтому нам не нужно их сохранять, и вызов хорошо обрабатывается, поэтому нам не нужно беспокоиться о стеке:

static DWORD the_hook_address = 0x572EA0;
//init this somewhere with the correct (Base + RVA) address in case of module relocation (from ASLR etc.)
__declspec(naked) bool __stdcall the_hook(int a1, int a2, int a3, int a3)
{
    __asm
   {
       MOV ECX,[ESP + 4]//a1
       MOV EDX,[ESP + 8]//a2
       MOV EAX,[ESP + 12]//a3
       PUSH [ESP + 16]//a4
       CALL the_hook_address
       RETN 16 //4 * 4 args
   }
}

Я знаю, что функция принимает объект в качестве параметра, а * Vector3 - в качестве параметра. параметр, в котором будет сохранено вычисленное значение. Есть простой способ сказать, какой параметр будет, что ??

«Легкость» зависит от вашего опыта работы с реверс-инжинирингом и с программой, которую вы REing, в этом случае я бы сказал, что это a1, потому что вы можете видеть, что она перемещается во временную, которая затем вызывается с помощью указателя. нотация (способ представления неизвестных структур IDA) для выделения 3 float с, что обычно используется большинством приложений для векторных компонентов (а также в большинстве векторов есть 3 компонента). Это также очень помогает, если вы действительно можете отладить вызов в действии, посмотреть, какие параметры являются указателями, взглянуть на сайты вызова функций и т. Д. По этой причине я предпочитаю использовать ollydbg для RE, дополняя его графами потоков выполнения IDA для сложного перехода. последовательности (например, 20+ goto с в функции: <) </p>

...