使用 GetProcAddress 和 EasyHook 来挂钩类方法和构造函数
Using GetProcAddress and EasyHook to hook class methods and constructors
我使用 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::P en() 这样的构造函数,这会是什么样子?
Windows使用的可移植可执行文件(PE)格式并不真正支持导出或导入对象或其方法,因此GdiPlus(或任何其他DLL)在内部使用的内容并非如此。对象表示法可能是在 DLL 的导入库中实现的抽象。
如果您使用Dependency Walker工具(Windows SDK)或类似工具查看GdiPlus的导出表,您将看到
GdipGetPenColor
GdipSetPenColor
etc.
因此,它基本上与传统导出(如MessageBeep)没有什么不同。
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 在 UML 类图中为C++类添加构造函数和析构函数
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 两个父类的构造函数的序列
- 使用带有虚函数的类的构造函数进行大括号初始化
- 在模板化类的构造函数中调用构造函数
- 如何将我编写的对象传递到另一个类的构造函数中?
- 在初始化列表之外手动调用基类的构造函数
- 在C++中将对象从另一个类传递到另一个类的构造函数?
- 使第二个类的构造函数成为第一个类中的友元函数
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 根据参数数调用 mixin 基类的构造函数
- 使用迭代器的模板类的构造函数
- 定义类模板构造函数的两种方法之间的区别
- 复制列表类的构造函数,而无需在实现中使用任何方法
- 目标C类方法==C++构造函数
- 为什么模板化类在初始化列表中识别另一个类的构造函数,但在方法主体中却不识别?
- 为什么基类的构造函数方法被调用两次?
- C++:在基类的构造函数中调用重写的方法