通过hotpatching挂钩... dll中的非导出类方法

时间:2011-10-28 23:31:14

标签: reverse-engineering

我一直在使用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>)

2 个答案:

答案 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寄存器的值可能会被覆盖。