我一直在使用windows dlls中的hotpatching机制研究这种API挂钩方法。
http://www.codeproject.com/KB/winsdk/0xF9EB_Hooking.aspx
我想知道是否有人知道如何扩展它以挂钩非导出函数,例如DLL内部类的C ++构造函数。我已经通过解组来知道地址......我遇到的问题是如何设置正确的调用约定,以便我可以在我的钩子函数中调用原始函数。
我已经到了我的钩子函数被调用的地步......程序崩溃了,因为我无法返回调用原始函数的结果。
让我们假设我们正在讨论使用这样的原型挂钩内部类构造函数:
public __thiscall <class_name>::<class_name>(<single pointer arg to another object>)
答案 0 :(得分:3)
取决于你的模块的加载方式,你通常可以只覆盖各自呼叫站点的相对或绝对地址,否则你需要制作一个蹦床功能,它更容易使用像MS Detours这样的东西。
就基于__thiscall
的类成员函数的正确原型而言,您需要一些技巧,因为通常不能使用__thiscall
外部类。最快最简单的方法是使用__fastcall
并忽略第二个参数。因此,您的第一个定义变为void __fastcall myctor(myobj* pObj)
。
答案 1 :(得分:-1)
将其定义为典型的__stdcall
函数,但在this
寄存器中将有ecx
指针。如果您需要此指针,请使用__asm
关键字获取值:
void __stdcall HookedConstructor( SomeObject *pObject){
HookedClass *pClass;
__asm mov pClass, ecx;
...
}
请注意,您必须在通话开始时执行此操作。否则,ecx
寄存器的值可能会被覆盖。