我使用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()等构造函数,那么它会怎样?
答案 0 :(得分:0)
Windows使用的可移植可执行文件(PE)格式并不真正支持导出或导入对象或其方法,因此这不是GdiPlus(或任何其他DLL)在内部使用的格式。对象表示法可能是在DLL的导入库中实现的抽象。
如果您使用Dependency Walker工具(Windows SDK)或类似工具查看GdiPlus的导出表,您将看到
GdipGetPenColor
GdipSetPenColor
etc.
所以它基本上与传统导出没有什么不同,比如MessageBeep。