Перехват метода

Тема в разделе "LANGS.C", создана пользователем GoldFinch, 3 ноя 2008.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Есть чья-то длл, в ней экспортируются методы, причем каждый метод начинается с "jmp xxx", так что перехватывать их одно счастье. Проблема в том что я решил писать код на C++, и совершенно без понятия как все правильно записать.
    Допустим я хочу перехватить такой метод:
    class UNetworkHandler {
    public: virtual int __thiscall UNetworkHandler::RequestAuthLogin(
    unsigned short *Login, unsigned short *Password, int Param);
    };
    Я пишу процедуру-установщик перехвата,
    Код (Text):
    1. LPVOID InstallHook(LPVOID Target,LPVOID Hook){
    2.     DWORD OldProt;
    3.     LPVOID OldTarget;  
    4.     if(!VirtualProtect((char*)Target+1,4,PAGE_EXECUTE_READWRITE,&OldProt))return NULL;
    5.     OldTarget=((char*)Target+5)+*(LPDWORD)((char*)Target+1);
    6.     *(LPDWORD)((char*)Target+1)=(char*)Hook-((char*)Target+5);
    7.     VirtualProtect((char*)Target+1,4,OldProt,&OldProt);
    8.     return OldTarget;
    9. }
    пишу метод перехватчик
    Код (Text):
    1. class UNetworkHandler_hook {
    2. public: virtual int __thiscall RequestAuthLogin(
    3.             unsigned short *Login, unsigned short *Password, int Param) {
    4.                 __debugbreak();
    5.         }
    6. };
    и пытаюсь вызвать функцию-перехватчик
    InstallHook(&UNetworkHandler::RequestAuthLogin,&UNetworkHandler_hook::RequestAuthLogin);
    на этой строчке возникает ошибка преобразования типов.

    Как это правильно записать?
     
  2. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    Код (Text):
    1. class TestClass
    2. {
    3. public:
    4.     int SomeFunc(int param)
    5.     {
    6.         return param;
    7.     }
    8. };
    9.  
    10. int _tmain(int argc, TCHAR* argv[])
    11. {
    12.     int (__thiscall TestClass::*pFunc)(int) = &TestClass::SomeFunc;
    13.     void* pSmth;
    14.     //pSmth = (void*)pFunc; //fucking compile error
    15.     __asm
    16.     {
    17.         push    eax
    18.         mov     eax, dword ptr [pFunc]
    19.         mov     dword ptr [pSmth], eax //everything is cewl because pFunc and pSmth are just four-bytes variables :)
    20.         pop     eax
    21.     }
    22.     return 0;
    23. }
    :)
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    а еще я заметил, что если передать указатель на импортированный метод в функцию, и при этом не вызывать его, то компилятор вообще не будет его импортировать...