元の投稿:
挿入されたDLL内からメンバー関数を迂回しようとしています。フックしようとしている関数のアドレスを取得しましたが、迂回ライブラリを介してフックするための適切な構文または方法を理解できません。エラーを表示している行にエラーメッセージを付けてコメントしました。
メンバー関数フックの迂回例のソースを読みました。これがこのコードの基になっていますが、何らかの理由で機能していません。
どんな助けでも大歓迎です、ありがとう!
#include <windows.h>
#include <detours.h>
class CDetour
{
public:
bool My_MemFn(unsigned int unk1);
static bool (CDetour::* Real_MemFn)(unsigned int);
};
bool CDetour::My_MemFn(unsigned int unk1)
{
/* do stuff here */
return (this->*Real_MemFn)(unk1);
}
typedef bool (CDetour::* MemFn_t)(unsigned int unk1);
MemFn_t CDetour::Real_MemFn= *(MemFn_t *)((void*)0x23234545);
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)CDetour::Real_MemFn, *(PBYTE*)&CDetour::My_MemFn); // ERROR: C2440: 'type cast' : cannot convert from 'bool __thiscall CDetour::* )(unsigned int)' to 'PBYTE *'
DetourTransactionCommit();
break;
}
}
return TRUE;
}
解決:
#include <windows.h>
#include <detours.h>
typedef void (__thiscall * CClassFunction_t)(void *__this, unsigned int unk1);
CClassFunction_t Real_CClassFunction;
void __fastcall Mine_CClassFunction(void *__this, int edx, unsigned int unk1)
{
Real_CClassFunction(__this, unk1);
}
template<typename T>
void HookFunction(const char *module, char *signature, T &fn_real, PVOID fn_mine)
{
HookFunction<T>(DetourFindFunction(module, signature), fn_real, fn_mine);
}
template<typename T>
void HookFunction(DWORD address, T &fn_real, PVOID fn_mine)
{
HookFunction<T>(reinterpret_cast<PVOID>(address), fn_real, fn_mine);
}
template<typename T>
void HookFunction(PVOID target, T &fn_real, PVOID fn_mine)
{
fn_real = reinterpret_cast<T>(target);
HookFunction<T>(fn_real, fn_mine);
}
template<typename T>
void HookFunction(T &fn_real, PVOID fn_mine)
{
DetourAttach(&(PVOID&)fn_real, fn_mine);
}
void ApplyHooks()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DWORD function_address = 0x12345678;
HookFunction<CClassFunction_t>(address, Real_CClassFunction, Mine_CClassFunction);
DetourTransactionCommit();
}
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
{
DisableThreadLibraryCalls(hInstance);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ApplyHooks, 0, 0, 0);
break;
}
}
return TRUE;
}