【问题标题】:Hooking a _userpurge function c++挂钩 _userpurge 函数 c++
【发布时间】:2023-03-28 01:55:01
【问题描述】:

我想从 x86 可执行文件中挂钩一个函数。这是用 IDA 的 hex-rays 插件反编译的函数原型:

int __userpurge sub_43CE70<eax>(int a1<eax>, int a2, char a3, int a4, int a5, int a6)

所以函数接受eax作为第一个参数并返回同一个寄存器。

我尝试了以下函数作为包装器:

int the_wrapper(int a2, unsigned a3, int a4, int a5, int a6)
{
    int a1;
    _asm
    {
        mov [a1], eax
    };
    char bString[50];
    sprintf(bString,"a1: %u, a2: %u, a3: %d, a4: %d, a5: %d, a6: %d",a1,a2,a3,a4,a5,a6);
    logs(bString);
    int rtn;
    _asm{
        push a6
        push a5
        push a4
        push a3
        push a2
        mov eax, [a1]
        call the_function
        mov [rtn], eax
    };
    return rtn;
}

由于某种原因,每次调用该函数时它都无法正常工作并崩溃。

【问题讨论】:

    标签: x86 hook reverse-engineering ida


    【解决方案1】:

    您需要使用与您尝试包装的函数相同的calling convention 来声明您的包装器。

    根据约定(最常见的是cdeclstdcall,但它也取决于包装代码的编译器)清理堆栈的是调用者或被调用者。如果您不使用正确的约定,您很容易出现堆栈损坏和崩溃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 2011-11-05
      • 2013-01-06
      • 1970-01-01
      • 2011-09-27
      相关资源
      最近更新 更多