我设法挂钩了我想要的一切(API函数,虚拟方法,“标准”函数),但我想知道如何挂钩非虚拟类成员函数(方法)。 要挂钩虚拟方法,您只需要获取VTable并对其进行修补(或复制,修改它并更改VPointer)。但是,当方法非虚拟时,没有VTable。
首先,如何从名称中获取我要挂钩的方法的地址?我无法使用GetProcAddress()
,因为未导出该函数。唯一的方法似乎是在内存中搜索与该函数对应的字节模式。
然后,一旦我得到地址,我该如何挂钩?使用基本方法(JMP)?如果我只想挂钩一个实例怎么办?我想我会检查我的挂钩功能:如果它是正确的实例,那么就要做必须完成的事情,否则只需执行它而不做任何其他事情。
实际上我正在寻找更好的解决方案,因为我认为上面的解决方案可行,但它们不是很“整洁”,是吗?
谢谢。
答案 0 :(得分:1)
大多数情况下,根本无法转移静态解析的功能。您是否听说过名为 inlining 的优化?即使没有发生这种情况,COMDAT折叠也可能使您感兴趣的功能完全不可能。
强烈推荐阅读:Raymond Chen's "Why does the debugger show me the wrong function?"