C++ || Возможно ли хукнуть DrawIndexedPrimitive с обходом OBS?

ANZR

Известный
Автор темы
168
104
Сталкнулся с вопросом. Я смог хукнуть функцию DrawIndexedPrimitive, однако все отрисовки видны в OBS. Возможно ли как-то обойти это?
C++:
HRESULT __stdcall CD3DHook::hkDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimitiveType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount) {
    if (pD3DHook->bInit) {
        if (pWallhack->ChamsStatus) {
            LPDIRECT3DVERTEXBUFFER9 Stream_Data;
            UINT offset = 0;
            UINT stride = 0;
            D3DMATRIX matTrans;
            if (pD3DHook->pD3DDevice->GetStreamSource(0, &Stream_Data, &offset, &stride) == S_OK)
                Stream_Data->Release();
            if (stride == 40 || stride == 44 || stride == 36) {
                pD3DHook->pD3DDevice->SetRenderState(D3DRS_ZENABLE, false);
                pD3DHook->pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
                pD3DHook->pD3DDevice->SetTexture(0, pTextures->Red);
                pD3DHook->oDrawIndexedPrimitive(pDevice, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
                pD3DHook->pD3DDevice->SetRenderState(D3DRS_ZENABLE, true);
                pD3DHook->pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
                pD3DHook->pD3DDevice->SetTexture(0, pTextures->Green);
                pD3DHook->pD3DDevice->GetTransform(D3DTRANSFORMSTATETYPE::D3DTS_VIEW, &matTrans);
                printf_s("%d %d %d %d %d %d\n", PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
            }
        }
    }
    return pD3DHook->oDrawIndexedPrimitive(pDevice, PrimitiveType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);
}

C++:
class CD3DHook
{
public:
    CD3DHook()
    {
        bInit = false;
        oPresent = (tPresent)GetDeviceAddress(17);
        oReset = (tReset)GetDeviceAddress(16);
        oDrawIndexedPrimitive = (tDrawIndexedPrimitive)GetDeviceAddress(82);
        DetourRestoreAfterWith();
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        pSecure->SDetourAttach(&(PVOID&)oPresent, hkPresent);
        pSecure->SDetourAttach(&(PVOID&)oReset, hkReset);
        pSecure->SDetourAttach(&(PVOID&)oDrawIndexedPrimitive, hkDrawIndexedPrimitive);
        DetourTransactionCommit();
    };

    ~CD3DHook()
    {
        DetourRestoreAfterWith();
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)oPresent, hkPresent);
        DetourDetach(&(PVOID&)oReset, hkReset);
        DetourDetach(&(PVOID&)oDrawIndexedPrimitive, hkDrawIndexedPrimitive);
        DetourTransactionCommit();
    };

    bool bInit;
    IDirect3DDevice9* pD3DDevice;
private:
    DWORD FindDevice(DWORD dwLen)
    {
        DWORD dwObjBase = 0;
        char infoBuf[MAX_PATH];
        GetSystemDirectoryA(infoBuf, MAX_PATH);
        strcat_s(infoBuf, MAX_PATH, "\\d3d9.dll");
        dwObjBase = (DWORD)LoadLibraryA(infoBuf);
        while (dwObjBase++ < dwObjBase + dwLen)
        {
            if ((*(WORD*)(dwObjBase + 0x00)) == 0x06C7 &&
                (*(WORD*)(dwObjBase + 0x06)) == 0x8689 &&
                (*(WORD*)(dwObjBase + 0x0C)) == 0x8689)
            {
                dwObjBase += 2;
                break;
            }
        }
        return(dwObjBase);
    };

    DWORD GetDeviceAddress(int VTableIndex)
    {
        PDWORD VTable;
        *(DWORD*)&VTable = *(DWORD*)FindDevice(0x128000);
        return VTable[VTableIndex];
    };

    typedef HRESULT(__stdcall* tPresent)(IDirect3DDevice9*, CONST RECT*, CONST RECT*, HWND, CONST RGNDATA*);
    typedef HRESULT(__stdcall* tReset)(IDirect3DDevice9*, D3DPRESENT_PARAMETERS*);
    typedef HRESULT(__stdcall* tDrawIndexedPrimitive)(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, INT, UINT, UINT, UINT, UINT);

    static HRESULT __stdcall hkPresent(IDirect3DDevice9* pDevice, CONST RECT* pSrcRect, CONST RECT* pDestRect, HWND hDestWindow, CONST RGNDATA* pDirtyRegion);
    static HRESULT __stdcall hkReset(IDirect3DDevice9* pDevice, D3DPRESENT_PARAMETERS* pPresentParams);
    static HRESULT __stdcall hkDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice, D3DPRIMITIVETYPE PrimitiveType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount);

    tPresent oPresent;
    tReset oReset;
    tDrawIndexedPrimitive oDrawIndexedPrimitive;
};
Просто например Функция present спокойно отрисовывает и не виден в OBS
 

sc6ut

неизвестный
Модератор
382
1,075
невидно на обс,бандикам и тд при хуке презента дллки д3д9 и только при записи игры а не экрана
при чем тут DrawIndexedPrimitive я честно хз
длл бандикама кстати тоже хукает функции д3д9 длл, поэтому надо хукать другое место в памяти. к примеру я в ультравх хукаю адресс present+5: https://gitlab.com/samp-plugins/ultrawh/-/blob/main/src/plugin.cpp#L35
 

ANZR

Известный
Автор темы
168
104
невидно на обс,бандикам и тд при хуке презента дллки д3д9 и только при записи игры а не экрана
при чем тут DrawIndexedPrimitive я честно хз
длл бандикама кстати тоже хукает функции д3д9 длл, поэтому надо хукать другое место в памяти. к примеру я в ультравх хукаю адресс present+5: https://gitlab.com/samp-plugins/ultrawh/-/blob/main/src/plugin.cpp#L35
Ну просто например я не знаю, как вообще работает obs bypass, оттуда и такие вопросы)
Отрисовка менюшки и ВХ на записи не виден, но вот все изменения в DrawIndexedPrimitive видны прекрасно. Вот я и думаю, как бы рисовать тот же самый chams wh чтобы его видно не было. Все советовали хукать эту функцию, что я и сделал :D