使用GetProcAddress和EasyHook挂钩类方法和构造函数

时间:2014-11-14 22:39:41

标签: c++ hook getprocaddress easyhook

我使用EasyHook从库中挂钩系统API例程(在C ++中)已经取得了很大的成功。这些库总是平坦的,基本上充满了全局可调用的例程。以下是使用User32.dll库中的MessageBeep()的小样本(减去设置代码):

HMODULE hUser32 = GetModuleHandle ( L"User32" );
FARPROC TrampolineMethod;  // This would have been set to my new replacement trampoline method.
TRACED_HOOK_HANDLE hHook = new HOOK_TRACE_INFO();
NTSTATUS status;

status = LhInstallHook(
            GetProcAddress(hUser32, "MessageBeep"),
            TrampolineMethod,
            (PVOID)0x12345678,
            hHook);

这一切都很棒。问题是,我现在需要从类中挂钩方法,而不仅仅是全局函数。我真的不关心对象本身,我真的更感兴趣的是检查方法的参数,就是这样。我不知道如何在函数名参数中语法识别GetProcAddress()的例程,我甚至不确定GetProcAddress()是否支持它。例如,我想将Pen::SetColor()方法挂钩到gdiplus.dll库之外:

HMODULE hGDIPlus = GetModuleHandle ( L"Gdiplus" );
FARPROC TrampolineMethod;  // This would have been set to my new replacement trampoline method.
TRACED_HOOK_HANDLE hHook = new HOOK_TRACE_INFO();
NTSTATUS status;

status = LhInstallHook(
            GetProcAddress(hGDIPlus, "Pen.SetColor"),   // this is probably wrong or not possible here
            TrampolineMethod,
            (PVOID)0x12345678,
            hHook);

这当然不起作用,我不认为 GetProcAddress(hGDIPlus,“Pen.SetColor”)是正确的。如何为GetProcAddress()指定类的成员函数?这甚至可能吗?另外,如果我想挂钩Pen::Pen()等构造函数,那么它会怎样?

1 个答案:

答案 0 :(得分:0)

Windows使用的可移植可执行文件(PE)格式并不真正支持导出或导入对象或其方法,因此这不是GdiPlus(或任何其他DLL)在内部使用的格式。对象表示法可能是在DLL的导入库中实现的抽象。

如果您使用Dependency Walker工具(Windows SDK)或类似工具查看GdiPlus的导出表,您将看到

GdipGetPenColor
GdipSetPenColor
etc.

所以它基本上与传统导出没有什么不同,比如MessageBeep。