【发布时间】:2014-01-17 22:18:13
【问题描述】:
我设法挂钩了我想要的所有东西(API 函数、虚拟方法、“标准”函数),但我想知道如何挂钩 非虚拟 类成员函数(方法)。 要挂钩虚拟方法,您只需要获取 VTable 并对其进行修补(或复制、修改并更改 VPointer)。但是,当方法是NOT virtual时,没有VTable。
首先,我怎样才能从 name 中获取我想要挂钩的方法的地址?我不能使用GetProcAddress(),因为该函数没有导出。唯一的方法似乎是在内存中搜索与函数对应的字节模式。
那么,一旦我得到了地址,我该如何挂钩呢?使用基本方法 (JMP)?如果我只想挂钩一个实例怎么办?我想我会检查我的挂钩函数:如果它是正确的实例,那么就做必须做的事情,否则只执行它而不做任何其他事情。
实际上我正在寻找更好的解决方案,因为我认为上面的解决方案可行,但它们不是很“整洁”,是吗?
谢谢。
【问题讨论】:
-
我不太了解
WinAPI,但您可以使用&ClassName::member_name语法获取成员函数的地址。 -
假设
ClassName不是我可以在我的DLL 中#include的库的一部分(我想注入它),而是它是在我想挂钩的程序中定义的一个类:我可以'不要在我的DLL中写&ClassName:member_name,我会得到一个编译错误。