2014-11-14 71 views
2

我已经使用EasyHook将系统API例程(使用C++)挂钩到库之外取得了大量成功。这些库一直是扁平的,并且基本上充满了全局可调用的例程。下面是使用MessageBeep()出的User32.dll库(减去设置代码)的一个小样本:使用GetProcAddress和EasyHook挂钩类方法和构造函数

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

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

如果你看一看GdiPlus的用的Dependency Walker工具(Windows SDK中),或类似的导出表,你会看到

GdipGetPenColor 
GdipSetPenColor 
etc. 

所以基本上没有超过传统出口不同,喜欢的MessageBeep。

+0

有趣。不完全回答我的问题。但它可能是获得相同结果的另一种途径。谢谢,我会追求这一点,并报告它是否适合我。 – Ultratrunks 2014-11-14 23:16:10