Вопрос Помогите с хуком.

Тема в разделе "C, C++", создана пользователем Apolo11, 19 окт 2016.

  1. Apolo11

    Apolo11 Активный пользователь

    Регистрация:
    17.01.16
    Сообщения:
    31
    Лайки:
    8
    Репутация:
    0
    Хукаю функцию CreateDevice. Хочу проинициализировать собейтовский класс proxyIDirect3DDevice9.

    Что я делаю не так?

    Код (Text):
    unsigned long* pD3DVTable;
        pDirect3D9 = orig_Direct3DCreate9( D3D_SDK_VERSION );
         
        pD3DVTable = (unsigned long*)*(unsigned long*)pDirect3D9;
     
        orig_CreateDevice = (Prototype_CreateDevice)DetourFunc((PBYTE)pD3DVTable[16], (PBYTE)myCreateDevice, 5);
    Код (Text):
    HRESULT __stdcall myCreateDevice ( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow,
                                                      DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters,
                                                      IDirect3DDevice9 **ppReturnedDeviceInterface )
    {

        HRESULT hRes = orig_CreateDevice( Adapter, DeviceType, hFocusWindow, BehaviorFlags, pPresentationParameters,
                                         ppReturnedDeviceInterface );
        __asm pushad

        if ( hRes == D3D_OK )
            *ppReturnedDeviceInterface = new proxyIDirect3DDevice9( *ppReturnedDeviceInterface );
       
        __asm popad

        return hRes;
    }
    Код (Text):
    void *DetourFunc(BYTE *src, const BYTE *dst, const int len)
    {
        BYTE *jmp = (BYTE*)malloc(len+5);
        DWORD dwback;
        VirtualProtect(src, len, PAGE_READWRITE, &dwback);
        memcpy(jmp, src, len); jmp += len;
        jmp[0] = 0xE9;
        *(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
        src[0] = 0xE9;
        *(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
        VirtualProtect(src, len, dwback, &dwback);
        return (jmp-len);
    }
    Сама функа myCreateDevice исполняется. Но когда происходит возвращение, краш.
     
    #1
  2. SR_team

    SR_team BH Team
    BH Team

    Регистрация:
    26.10.13
    Сообщения:
    2.429
    Лайки:
    1.368
    Репутация:
    395
    вот это мне не нравится, но не факт, что оно не правильное.

    В какой момент хукаешь? Надо это сделать до создания девайса, иначе это бесполезная затея
     
    #2
  3. Apolo11

    Apolo11 Активный пользователь

    Регистрация:
    17.01.16
    Сообщения:
    31
    Лайки:
    8
    Репутация:
    0
    Сразу после вызова DllMain. Как только аси лоадер загрузит.
     
    #3
  4. 7eveNka

    7eveNka Известный пользователь

    Регистрация:
    18.01.16
    Сообщения:
    180
    Лайки:
    24
    Репутация:
    8
    Попробуй это говно - memcpy(jmp, src, len); jmp += len;
    ебануть к этому - *ppReturnedDeviceInterface = new proxyIDirect3DDevice9( *ppReturnedDeviceInterface );

    ваше хз что это
     
    #4