Вопрос D3D Hook CreateDevice

Тема в разделе "C, C++", создана пользователем Муззи, 29 июл 2018.

Статус темы:
Закрыта.
  1. Муззи

    Муззи Интересующийся

    Регистрация:
    18 фев 2017
    Сообщения:
    120
    Симпатии:
    7
    Есть готовый хук D3D для GTA SA, в нем есть вот такая функция:
    DirectHook* DirectHook::Init()
    {
        DirectHook* direct = new DirectHook(*(IDirect3DDevice9 **)0xC97C28);
        *(IDirect3DDevice9 **)direct = direct;
    
        return direct;
    }
    Как мне сделать его рабочим во всех D3D9 играх? Я пытался сделать так:
    #define _CRT_SECURE_NO_WARNINGS
    typedef IDirect3D9 * (WINAPI * D3DC9) (UINT);
    
    D3DC9 orig_Direct3DCreate9 = NULL;
    DWORD originAddr = NULL;
    CreateDevice_t orig_CreateDevice;
    
    HRESULT __stdcall HookedD3D9CreateDevice(IDirect3D9* Direct3D, UINT Adapter, D3DDEVTYPE DeviceType,
        HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9 **ppReturnedDeviceInterface);
    
    typedef HRESULT(__stdcall *CreateDevice_t)(IDirect3D9*, UINT, D3DDEVTYPE, HWND, DWORD, D3DPRESENT_PARAMETERS*, IDirect3DDevice9**);
    
    void *DetourFunc(BYTE *src, const BYTE *dst, const int len)
    {
        BYTE *jmp = (BYTE*)malloc(len + 5);
        DWORD dwback;
        VirtualProtectEx(GetCurrentProcess(), 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;
        VirtualProtectEx(GetCurrentProcess(), src, len, dwback, &dwback);
        return (jmp - len);
    }
    
    IDirect3D9* __stdcall FuncDirect3DCreate9(UINT SDKVersion)
    {
        IDirect3D9 *pDevice;
        __asm
        {
            push SDKVersion
            call originAddr
            mov pDevice, eax
        }
        if (pDevice)
        {
    
            DWORD* vTable = (DWORD*)(*(DWORD*)pDevice);
            if (!orig_CreateDevice)
                orig_CreateDevice = (CreateDevice_t)DetourFunc((PBYTE)vTable[16], (PBYTE)HookedD3D9CreateDevice, 5);
    
        }
        return pDevice;
    
    }
    
    DirectHook* DirectHook::Init()
    {   
        char    filename[MAX_PATH];
        GetSystemDirectory(filename, (UINT)(MAX_PATH - strlen("\\d3d9.dll") - 1));
        strcat(filename, "\\d3d9.dll");
        HINSTANCE g_hOrigDll = LoadLibrary(filename);
    
        orig_Direct3DCreate9 = (D3DC9)GetProcAddress(g_hOrigDll, "Direct3DCreate9");
    
        if (orig_Direct3DCreate9 == NULL)
            FreeLibrary(g_hOrigDll);
    
        originAddr = (DWORD)DetourFunc((PBYTE)orig_Direct3DCreate9, (PBYTE)FuncDirect3DCreate9, 5);
    
    
    
        DirectHook* direct = new DirectHook(*(IDirect3DDevice9 **)originAddr);
        *(IDirect3DDevice9 **)direct = direct;
    
        return direct;
    }
    
    Но компилятор выводит ошибку:
    Ошибка    C4996    'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    Подскажите пожалуйста как её исправить и будет ли этот хук, который я попытался адаптировать под другие игры работать, если нет, то что исправить?
     
  2. Dark_Knight

    Dark_Knight Glory to mankind
    Друг

    Регистрация:
    18 мар 2013
    Сообщения:
    3.338
    Симпатии:
    1.640
    0xC97C28IDirect3DDevice9 pointer
    Чтобы заставить его работаьь на других играх надо знать указатель IDirect3DDevice9 и его подставлять.
     
  3. Муззи

    Муззи Интересующийся

    Регистрация:
    18 фев 2017
    Сообщения:
    120
    Симпатии:
    7
    В готовом хуке от слонобойки он сам ищется, я от туда и взял код выше
     
  4. CleanLegend

    Проверенный

    Регистрация:
    28 мар 2013
    Сообщения:
    175
    Симпатии:
    187
    Findpattern или создавать device
    Пример -
     
    Sudak нравится это.
  5. MOR

    MOR Постоянный участник

    Регистрация:
    28 июл 2017
    Сообщения:
    63
    Симпатии:
    115
    Убери это из кода:
    #define _CRT_SECURE_NO_WARNINGS
    И добавь макрос _CRT_SECURE_NO_WARNINGS в настройки проекта.

    Или можешь сделать так, что будет правильнее:
    upload_2018-7-29_16-36-28.png
     
  6. _Vine_

    _Vine_ Интересующийся

    Регистрация:
    6 янв 2016
    Сообщения:
    111
    Симпатии:
    19
    Или дописать в начало кода #pragma warning(disable:4996)
     
  7. Муззи

    Муззи Интересующийся

    Регистрация:
    18 фев 2017
    Сообщения:
    120
    Симпатии:
    7
    Ошибку убрал, но так ничего и не рисует
     
  8. _Vine_

    _Vine_ Интересующийся

    Регистрация:
    6 янв 2016
    Сообщения:
    111
    Симпатии:
    19
    Там ищется указатель на девайс только для гта са используя известный статический указатель.
    Автоматического поиска указателя там нет, автоматический поиск указателя вот:
     
  9. NearBy

    NearBy Участник

    Регистрация:
    3 июл 2018
    Сообщения:
    15
    Симпатии:
    5
    Не легче юзать Vtable ? Ну или делать vmt хук.

    Плохой пример, как мне кажется.
     
    #9 NearBy, 29 июл 2018
    Последнее редактирование модератором: 29 июл 2018
    MOR нравится это.
  10. CleanLegend

    Проверенный

    Регистрация:
    28 мар 2013
    Сообщения:
    175
    Симпатии:
    187
    Хороший пример, в нем полное объяснение. Если хочешь предложить ему лучше,где есть объяснение, то предлагай
     
  11. MOR

    MOR Постоянный участник

    Регистрация:
    28 июл 2017
    Сообщения:
    63
    Симпатии:
    115
    Перехватываем Direct3DCreate9, изменяем адрес в виртуальной таблице IDirect3DDevice9 и возвращаем полученный интерфейс игре. И теперь это будет не detour хук, который постоянно копирует память туда сюда, а это уже будет прямая адресация на функцию-перехватчик. Detour-хуки я бы вообще советовал избегать, особенно в циклах. В данном случае в цикле отрисовки, это несколько тормозит процесс игры.
     
    FYP нравится это.
  12. Муззи

    Муззи Интересующийся

    Регистрация:
    18 фев 2017
    Сообщения:
    120
    Симпатии:
    7
    Всем спасибо по итогу сделал через EndScene.
     
Статус темы:
Закрыта.