Есть чья-то длл, в ней экспортируются методы, причем каждый метод начинается с "jmp xxx", так что перехватывать их одно счастье. Проблема в том что я решил писать код на C++, и совершенно без понятия как все правильно записать. Допустим я хочу перехватить такой метод: class UNetworkHandler { public: virtual int __thiscall UNetworkHandler::RequestAuthLogin( unsigned short *Login, unsigned short *Password, int Param); }; Я пишу процедуру-установщик перехвата, Код (Text): LPVOID InstallHook(LPVOID Target,LPVOID Hook){ DWORD OldProt; LPVOID OldTarget; if(!VirtualProtect((char*)Target+1,4,PAGE_EXECUTE_READWRITE,&OldProt))return NULL; OldTarget=((char*)Target+5)+*(LPDWORD)((char*)Target+1); *(LPDWORD)((char*)Target+1)=(char*)Hook-((char*)Target+5); VirtualProtect((char*)Target+1,4,OldProt,&OldProt); return OldTarget; } пишу метод перехватчик Код (Text): class UNetworkHandler_hook { public: virtual int __thiscall RequestAuthLogin( unsigned short *Login, unsigned short *Password, int Param) { __debugbreak(); } }; и пытаюсь вызвать функцию-перехватчик InstallHook(&UNetworkHandler::RequestAuthLogin,&UNetworkHandler_hook::RequestAuthLogin); на этой строчке возникает ошибка преобразования типов. Как это правильно записать?
Код (Text): class TestClass { public: int SomeFunc(int param) { return param; } }; int _tmain(int argc, TCHAR* argv[]) { int (__thiscall TestClass::*pFunc)(int) = &TestClass::SomeFunc; void* pSmth; //pSmth = (void*)pFunc; //fucking compile error __asm { push eax mov eax, dword ptr [pFunc] mov dword ptr [pSmth], eax //everything is cewl because pFunc and pSmth are just four-bytes variables :) pop eax } return 0; }
а еще я заметил, что если передать указатель на импортированный метод в функцию, и при этом не вызывать его, то компилятор вообще не будет его импортировать...