我最近一直在研究绕道函数(仅在Linux中(,到目前为止,我取得了巨大的成功。我正在开发自己的绕道课程,直到我发现这个。我对代码进行了一些现代化改造并将其转换为C++(当然是一个类(。该代码就像任何其他绕道实现一样,它将原始函数地址替换为我自己指定的"钩子"函数的JMP。它还为原始功能创建了一个"蹦床"。
一切都完美无缺,但我想做一个简单的调整。我用纯C++编程,不使用全局函数,所有内容都包含在类中(就像Java/C#一样(。问题是这种绕道方法打破了我的模式。"hook"函数需要是静态/非类函数。
我想做的是实现对_thiscall钩子的支持(使用 GCC _thiscall 约定应该非常简单(。我没有成功修改此代码以使用_thiscall钩子。我想要的最终结果就是这样简单的东西; PatchAddress(void * target, void * hook, void * class);
.我不要求任何人为我做这件事,但我想知道如何解决/处理我的问题?
只需要增加"补丁"大小(即它现在是 5 个字节,我应该需要额外的 5 个字节?(,然后在我使用 JMP 调用(对我的钩子函数(之前,我将我的"this"指针推送到堆栈(这应该就像我将其调用为成员函数一样(。举例说明:
push 'my class pointer'
jmp <my hook function>
而不仅仅是直接/仅调用"jmp"。这是正确的方法,还是下面还有其他需要考虑的东西(注意:我不关心对 VC++ 的支持_thiscall(?
注意:这是我对上述代码的实现:标头:源代码,使用 libudis86
我尝试了几种不同的方法,其中包括 JIT 编译(使用 libjit(,它被证明是成功的,但该方法没有提供足够的性能使其可用。相反,我转向了libffi,它用于在运行时动态调用函数。libffi 库有一个闭包 API(ffi_prep_closure_loc
(,它使我能够为每个生成的闭包提供我的 'this' 指针。所以我使用了一个静态回调函数并将void
指针转换为我的对象类型,从那里我可以调用任何我想要的非静态函数!