эта функция, которую вы перехватываете, равна 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>