2

我使用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()之类的构造函数,这会怎样?

4

1 回答 1

1

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

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

GdipGetPenColor
GdipSetPenColor
etc.

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

于 2014-11-14T22:51:54.403 回答