2014-11-14 8 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

Формат Portable Executable (PE), который использует Windows, на самом деле не поддерживает экспорт или импорт объектов или их методов, поэтому GdiPlus (или любая другая DLL) использует внутренне. Нотация объектов, вероятно, является абстракцией, реализованной в библиотеке импорта для библиотеки DLL.

Если вы посмотрите на экспорт таблице GdiPlus с инструментом Dependency Walker (Windows SDK), или подобным, вы увидите

GdipGetPenColor 
GdipSetPenColor 
etc. 

Так что в основном не отличаются от унаследованного экспорта, как MessageBeep.

+0

Интересно. Не точно отвечает на мой вопрос. Но это потенциально альтернативный путь для получения тех же результатов. Спасибо, я продолжу это и отчитаюсь, если это сработает для меня. – Ultratrunks