我用IDA pro反汇编了一个可执行文件。我的目标是钩住__usercall函数。我知道我需要在我的C++代码中使用inine asm包装__usercall,因为我无法输入该函数。但我不知道这是如何工作的。用内联asm连接用户调用
我知道该函数将一个对象作为参数,一个* Vector3作为参数来存储计算出的值。有没有一种简单的方法可以告诉哪个参数是什么?
(抱歉长码)
char __usercall sub_572EA0<al>(int a1<ecx>, int a2<edx>, int a3<eax>, int a4)
{
int v4; // [email protected]
int v5; // [email protected]
float v6; // [email protected]
char v7; // [email protected]
int v8; // [email protected]
char result; // [email protected]
int v10; // [sp+Ch] [bp-74h]@2
float v11; // [sp+10h] [bp-70h]@4
float v12; // [sp+14h] [bp-6Ch]@4
float v13; // [sp+18h] [bp-68h]@5
float v14; // [sp+1Ch] [bp-64h]@5
float v15; // [sp+20h] [bp-60h]@5
float v16; // [sp+24h] [bp-5Ch]@10
float v17; // [sp+28h] [bp-58h]@10
float v18; // [sp+2Ch] [bp-54h]@10
char v19; // [sp+30h] [bp-50h]@10
float v20; // [sp+3Ch] [bp-44h]@4
float v21; // [sp+40h] [bp-40h]@4
float v22; // [sp+44h] [bp-3Ch]@4
float v23; // [sp+54h] [bp-2Ch]@7
v4 = a3;
v5 = a1;
if (a3)
{
LODWORD(v6) = sub_55A920(*(_DWORD *)(a1 + 208));
if (!sub_53ADD0(
v5,
v6,
v4,
(int)&v10))
{
v7 = sub_4EC240(v4);
sub_4E3ED0(
1,
"Cannot find tag [%s]\n",
v7);
}
}
else
{
sub_572BE0();
*(float *)&v10 = *(float *)(v5 + 20) + v20;
v11 = *(float *)(v5 + 24) + v21;
v12 = *(float *)(v5 + 28) + v22;
}
v8 = dword_8FF12C;
v13 = flt_96A218;
v14 = flt_96A21C;
v15 = flt_96A220;
if (dword_8FF12C == 2047)
v8 = dword_8FF1D0;
sub_462250(
&v23,
&v13,
&v10,
&unk_82D6A0,
v8,
8400899);
if (1.0 == v23
|| (unsigned __int16)sub_492C50(&v23) == *(_DWORD *)(v5 + 208)
|| *(_UNKNOWN **)(v5 + 364) == &unk_FFFFFF
&& (v16 = v13
+ (*(float *)&v10 - v13)
* v23,
v17 = (v11 - v14) * v23 + v14,
v18 = v23 * (v12 - v15) + v15,
sub_4C35B0(
&v16,
v5 + 20,
v5 + 32,
&v19),
sub_432850(
*(_DWORD *)(v5 + 348),
&v19)))
result = sub_550250(a4, &v13, &v10);
else
result = 0;
return result;
}
的ASM是probaly错误的,会是这样的接近?
// 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
}}
这段代码中缺少的一件事是usercall(0x572EA0)的地址。不知道在哪里...
这是程序如何调用该函数。呼叫是在底部: http://i43.tinypic.com/2mez9c8.jpg
你能调试exe,看看目标程序如何调用函数吗? '__usercall'通常意味着函数被编译器优化,它不遵循标准函数调用约定。 – user685684 2012-01-12 09:52:31
@ user685684添加了屏幕截图。我不确定复制哪一部分。对__userfunction的调用发生在屏幕截图的底部(用红色边框标记)。 – w00 2012-01-12 10:16:23
我的意思是,你可以尝试观察那些注册者的价值(通过使用调试器或者只是在钩子函数中打印它们),并猜测它们的含义。 – user685684 2012-01-12 11:29:03