Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用GetProcAddress和EasyHook钩住类方法和构造函数_C++_Hook_Getprocaddress_Easyhook - Fatal编程技术网

C++ 使用GetProcAddress和EasyHook钩住类方法和构造函数

C++ 使用GetProcAddress和EasyHook钩住类方法和构造函数,c++,hook,getprocaddress,easyhook,C++,Hook,Getprocaddress,Easyhook,我已经用它成功地将系统API例程(在C++中)从库中挂钩。这些库一直是扁平的,基本上充满了全局可调用的例程。下面是一个使用User32.dll库(减去设置代码)的小示例: 这一切都很好。问题是,我现在需要将方法从类中挂钩,而不仅仅是一个全局函数。我并不真正关心对象本身,我更感兴趣的是检查方法的参数,就是这样。我不知道如何在GetProcAddress()的函数名参数中语法标识例程,我甚至不确定GetProcAddress()是否支持它。例如,我想从gdiplus.dll库中钩住该方法: HMOD

我已经用它成功地将系统API例程(在C++中)从库中挂钩。这些库一直是扁平的,基本上充满了全局可调用的例程。下面是一个使用User32.dll库(减去设置代码)的小示例:

这一切都很好。问题是,我现在需要将方法从类中挂钩,而不仅仅是一个全局函数。我并不真正关心对象本身,我更感兴趣的是检查方法的参数,就是这样。我不知道如何在GetProcAddress()的函数名参数中语法标识例程,我甚至不确定GetProcAddress()是否支持它。例如,我想从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()?这可能吗?另外,如果我想挂接一个构造函数,比如?

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

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

GdipGetPenColor
GdipSetPenColor
etc.

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

有趣。没有完全回答我的问题。但这可能是获得相同结果的另一种途径。谢谢,如果对我有用的话,我会继续做下去并报告。我说这完全回答了这个问题。PE格式并不真正了解OOP抽象,要钩住任何这样的对象,它需要是GDIPlus.dll周围的COM对象包装器。但是,包装器最终会调用DLL导出,所以钩住它也是一样的,除非你只想勾取特定的COM对象的用法,然后这是关于不同的DLL的不同问题。这里提到的OOP抽象似乎仅仅是C++头语法糖,实际上,它编译为直接调用前面提到的Win32 DLL导出,在运行时没有COM对象或外部OOP抽象。
GdipGetPenColor
GdipSetPenColor
etc.