У меня было много успеха, используя EasyHook подключить системные подпрограммы API (в C ++) из библиотек. Эти библиотеки всегда были плоскими и в основном были заполнены глобально вызываемыми процедурами. Вот небольшой пример использования MessageBeep () из библиотеки User32.dll (без кода установки):
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 ()?
Формат Portable Executable (PE), который использует Windows, на самом деле не поддерживает экспорт или импорт объектов или их методов, так что это не то, что GdiPlus (или любая другая DLL) использует внутри. Нотация объекта, вероятно, является абстракцией, реализованной в библиотеке импорта для DLL.
Если вы посмотрите на таблицу экспорта GdiPlus с помощью инструмента Dependency Walker (Windows SDK) или аналогичного, вы увидите
GdipGetPenColor
GdipSetPenColor
etc.
Так что в принципе он ничем не отличается от устаревшего экспорта, такого как MessageBeep.