【问题标题】:Hooking/Detour Virtual Functions挂钩/绕行虚拟功能
【发布时间】:2011-09-11 07:28:03
【问题描述】:

我一直在尝试在类对象中正确挂钩/绕行虚函数,并且在调用不同的函数方面取得了成功,但就@的方式而言,我必须做一些不正确的事情987654321@关键字被传递给函数。

我读过一篇关于以类似方式挂钩 D3D 函数的文章,其中提到编译器会将 int Class::method(int) 之类的函数转换为 int method(Class* this, int),但如果我将 vtable 中的地址替换为以下函数如此定义,“this”的地址不正确,因此可能不正确。

编译器如何布局成员函数,是否可以将其表示为非成员函数形式,以便我可以将 vtable 中的地址设置为这样的函数并能够引用适当的对象?

【问题讨论】:

    标签: windows hook virtual-functions


    【解决方案1】:

    您需要将您的函数定义为thiscall。它通过ecx 寄存器上的this。按照您的做法,该函数在堆栈上期待 this 并读取可能属于另一个参数的错误值。

    【讨论】:

    • 我之前尝试过这样做,但编译器告诉我不允许使用 thiscall 指定非静态非成员函数。当我像我提到的那样指定一个函数时,我实际上并没有使用this 关键字作为参数名称。指定.a 局部变量并通过原始汇编工作从ecx 寄存器设置其值?我想我会看看像Class* obj = this 这样的程序集在实际成员函数中的外观,然后尝试复制它。
    • 嗯,这并没有像我预期的那样工作,因为没有 thiscall 约定的函数在开头清除了 ecx 寄存器。我想我必须定义另一个类并在 vtable 中使用它的函数来保留thiscall,除非有更好的方法。
    • 如果这不起作用,您可以尝试创建一个虚拟类并稍后进行强制转换。正如您所说,另一种选择是放入所有汇编代码。您可以使用 naked 函数来做到这一点。
    • 我最终做了虚拟类建议并实例化了一个实例,这样我就可以通过它的 vtable 获取函数的地址(并且工作正常),但是裸函数听起来是个好主意,因为它避免了不必要的步骤,让我得到我需要的东西。谢谢。
    猜你喜欢
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多