【问题标题】:How to hook __usercall, __userpurge (__spoils) functions?如何挂钩 __usercall、__userpurge (__spoils) 函数?
【发布时间】:2016-03-15 20:41:11
【问题描述】:

知道任何关于挂钩__usercall 类型函数的知识吗? 我成功连接了__thiscall__stdcall__cdecl 电话,但这对我来说已经足够了。

知道有人为__usercall 挂钩库或如何使用转换为__stdcall__cdecl 来挂钩此类函数吗?

我首先要挂钩的功能是:

int __usercall func<eax>(int a<eax>, int b<ecx>, int c, unsigned int d, signed int e);

【问题讨论】:

    标签: c hook reverse-engineering detours usercall


    【解决方案1】:

    使用将其转换为__stdcall 的包装器。

    int __stdcall func_hook_payload(int a, int b, int c, unsigned int d, signed int e);
    
    // Wrapper for
    // int __usercall func<eax>(int a<eax>, int b<ecx>, int c, unsigned int d, signed int e);
    __declspec(naked) void func_hook()
    {__asm{
        push ebp
        mov ebp, esp
        push dword ptr[ebp + 0x0C] // or just push e
        push dword ptr[ebp + 0x08] // d
        push dword ptr[ebp + 0x04] // c
        push ecx // b
        push eax // a
        call func_hook_payload
        leave
        ret // note: __usercall is cdecl-like
    }}
    

    【讨论】:

    • 您确定要这样做吗?你不应该 pop 来自迂回函数被调用者的参数吗?
    • @Svisstack:是的,我确定。试试看吧。
    • 我正在尝试,但也许在我的第二个包装器 __stdcall 到 __usercall 中可能有问题,调试器在调用原始用户调用函数后说访问冲突(因为我必须有结果)嗯,可能我做错了参数。
    • 你能看看这个stackoverflow.com/questions/4102981/… 吗?
    • Abyx 我该怎么称呼它?通过 func_hook_payload?还是func_hook?我从未见过这样的函数内部的函数。
    【解决方案2】:

    当所有其他方法都失败时.. 使用调试器遍历它。

    当你进入调用时,尤其要注意这些,比如 ESP,然后在函数返回之前再次注意......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-14
      • 2022-01-23
      • 1970-01-01
      • 2020-03-28
      • 2011-11-05
      • 2014-10-13
      • 2013-01-06
      • 1970-01-01
      相关资源
      最近更新 更多