gpt4 book ai didi

c++ - 使用 GetProcAddress 和 EasyHook Hook 类方法和构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:20:31 24 4
gpt4 key购买 nike

我使用 EasyHook 从库中 Hook 系统 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);

一切都很好。问题是,我现在需要从一个类中 Hook 方法,而不仅仅是一个全局函数。我不太关心对象本身,我更感兴趣的是检查方法的参数,仅此而已。我不知道如何在语法上识别 GetProcAddress() 的函数名参数中的例程,我什至不确定 GetProcAddress() 是否支持它。例如,我想从 gdiplus.dll 库中 Hook Pen::SetColor() 方法:

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()?这可能吗?另外,如果我想 Hook 一个构造函数(例如 Pen::Pen()),这看起来会怎样?

最佳答案

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

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

GdipGetPenColor
GdipSetPenColor
etc.

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

关于c++ - 使用 GetProcAddress 和 EasyHook Hook 类方法和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26940054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com