IDA找到一个函数声明如下:
int __thiscall CDialogBuilder::Create(DWORD *this, int a2, int a3, int a4)
{
//.....
}
查看汇编代码调用如下:
.text:10C7184B 00C push [ebp+arg_10] // 参数a4
.text:10C7184E 010 mov ecx, esi // 参数this
.text:10C71850 010 push [ebp+arg_C] // 参数a3
.text:10C71853 014 push [ebp+arg_8] // 参数a2
.text:10C71856 018 call CDialogBuilder__Create
__thiscall是类成员函数调用方式,第一个参数this指针通过寄存器ecx传参,参数a2,a3,a4通过push传参
我们知道_fastcall调用方式,第一个参数通过ecx传参,第二个参数通过edx传参,其它的通过push传参,于是想到这样定义:
int _fastcall CDialogBuilder::Create(DWORD *this, int a2, int a3, int a4)
{
// this=ecx,a2=edx 但是汇编代码中a2是通过push传递的,并非edx,怎么办。。。
}
如果使用 _fastcall 第一个参数this是满足了,但是第二个参数a2因为调用代码是通过push传递的,怎么办
后面突发灵感,_fastcall 调用竟然第二个参数是edx,那我声明函数时,加多一个参数接收edx,调用时原样传递edx,这样参数不变,数据不变,岂不是也能达到目的,于是声明改成这样:
int _fastcall CDialogBuilder::Create(DWORD *this, int edx, int a2, int a3, int a4)
{
// edx纯属占坑用的,没用到...
}
于是完美了,this=ecx,edx=edx,a2=push传的参数 a3=push传的参数 a4=push传的参数
注:假如汇编代码中a2是通过edx传递的,那就不用加多个参数占坑了。
OK hook __thiscall 功能正常了。。。