hook usercall修饰的函数

usercall不是标准的调用约定,用IDA反编译时经常能看到

int __usercall sub_10017FF0@<eax>(int a1@<eax>, int a2@<ecx>, _BYTE *a3, _BYTE *a4)

这样的函数声明,这个是IDA自己定义的,这种使用寄存器传参可能是编译时被编译器优化的结果。

如上例子则表示参数a1使用eax传递,参数a2使用ecx传递的。a2和a4是压栈

要hook这类函数的时候,我们可以写一个stub函数将usercall转换成调用__cdecl修饰的函数.

//
int __cdecl sub_10017FF0 (int a1 , int a2, _BYTE *a3, _BYTE *a4)
{
//......
}

static void __declspec(naked) stub_sub_10017FF0()
{
        __asm
        {
                //按照顺序压入参数
                push [esp + 08h] // a4
                push [esp + 08h] // a3
                push ecx // a2
                push eax // a1
                // 调用实际实现hook代码的函数
                call sub_10017FF0
                //寄存器传参的参数也要pop
                add esp, 4 //  
                pop ecx // a2
                //堆栈平衡,这里有俩个参数是压栈的
                add esp, 4 // a3
                add esp, 4 // a4
                retn
        }
}                                                                             

https://github.com/michael-fadely/usercall-hook

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
,