У меня было много успехов, используя 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()?
Интересно. Не точно отвечает на мой вопрос. Но это потенциально альтернативный путь для получения тех же результатов. Спасибо, я продолжу это и отчитаюсь, если это сработает для меня. – Ultratrunks