Перейти к содержанию

Рекомендуемые сообщения

Всем привет .Столкнулся с такой проблемой , как vmt hook для directx (да в интернете полно инфы и исходников).
Но что бы я не пытался собрать , всё не работало .Крч , как не старался , ничего не получилось .
Написал только обычный хук сплайсингом (работает прекрасно, сам никак не нарадуюсь(но он палится)).
Кто может подробно объяснить , как это сделать ?Я был бы очень благодарен .

Ссылка на комментарий
Поделиться на другие сайты

36 минут назад, gamehikker сказал:

но он палится

А VMT хук не палится?

36 минут назад, gamehikker сказал:

Крч , как не старался , ничего не получилось

Какие действия ты предпринял? Что именно тебе непонятно? Прочитай про то, что такое VMT и где она хранится.

36 минут назад, gamehikker сказал:

да в интернете полно инфы

Так и попробуй ее почитать, а не копировать исходники и сетовать на то, что ничего не работает.

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, uhx сказал:

А VMT хук не палится?

Какие действия ты предпринял? Что именно тебе непонятно? Прочитай про то, что такое VMT и где она хранится.

Так и попробуй ее почитать, а не копировать исходники и сетовать на то, что ничего не работает.

ухъ как ти всё перефразировал !1

uintptr_t *a=(uintptr_t *)*(uintptr_t *)d3d9device;
//a[42] - адрес функции endscene

Я типа адрес функции найти могу, а потом что делать ?
Никак понять не могу (

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, gamehikker сказал:

Да вот я не знаю , куда ? ...

В виртуальную таблицу. Ты прочитал про неё, или нет? Или как ты вообще собрался ставить VMT Hook если ты даже не знаешь об этом ничего?

У меня есть готовый пример для тебя, но пока ты мне не объяснишь я ничего скидывать не буду. Расскажи мне что такое VMT и как она работает.

Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, uhx сказал:

В виртуальную таблицу. Ты прочитал про неё, или нет? 

Там на английском (с англом всё bad :() . Не понимаю, как найти адрес , значение которого нужно заменить на свой адрес ....

Ссылка на комментарий
Поделиться на другие сайты

Никак до меня не доходит ((
 

	DWORD* pVTable = (DWORD*)g_pd3dDevice;
	pVTable = (DWORD*)pVTable[0];
		DWORD old;
		VirtualProtect(pVTable, 4, PAGE_READWRITE, &old);
		*(DWORD*)pVTable = (DWORD)HookedPresent9;
		VirtualProtect(pVTable, 4, old, &old);

Адрес перезаписывается не там

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, gamehikker сказал:

Адрес перезаписывается не там

Он перезаписывается там, где ты указал. В данном случае это самая первая (нулевая) функция в виртуальной таблице. Чтобы перезаписать, например, EndScene:

DWORD* pVTable = *(DWORD**) g_pd3dDevice;
const int iEndscene = 42;

DWORD old;
// Заметь, в данном случае размер VirtualProtecta надо расширить. Можно просто значение побольше поставить.
VirtualProtect(pVTable, 0x1000, PAGE_READWRITE, &old);

*( pVTable + iEndscene ) = (DWORD) HookedEndscene;

VirtualProtect(pVTable, 0x1000, old, &old);

И вообще, посмотри уроки кенга например, он там нормально рассказывает про виртуальную таблицу и хуки. Правда хук у него другой.

Тебе надо узнать индекс необходимого метода (Present в твоем случае) в виртуальной таблице, можешь погуглить если сам не понимаешь как это найти (можно в отладчике самому найти через pDevice)

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, uhx сказал:

код

Не .Чет нуль реакции .Тестовое приложение даже не повисло(и хук не выполнился) . Я кое-что написал , но вроде перезапись происходит там где надо .Можно в лс ?

Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, gamehikker сказал:

Не .Чет нуль реакции .Тестовое приложение даже не повисло(и хук не выполнился).

Цитируем лишь фразу на которую отвечаем. Если фраза длинная то укороти до то как у меня ( цитата на тебя ). Так же в цитату не бери коды/видео/спойлеры.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, gamehikker сказал:

приложение даже не повисло(и хук не выполнился)

Либо выкладывай весь код, либо решай сам. Откуда мне знать что там у тебя вообще? Погугли, посмотри кенга, я же уже и так многое сказал. Посмотри на UC примеры хуков виртуальных таблиц (там сто раз это всё обсуждалось, плюс на гитхабах в сорцах читов есть готовые классы). В конце концов, разберись вообще с тем что такое виртуальная таблица методов, ибо ты только из-за этого не можешь ничего сделать. А ничего и не получится, если в тупую постоянно брать готовый код.

Ссылка на комментарий
Поделиться на другие сайты

krl-dNzxjM0.jpg
Вот. Не работает .Хук не выполняется. Адрес перезаписывается не там , где надо

Изменено пользователем gamehikker
Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...
В ‎25‎.‎11‎.‎2017 в 19:20, X86Jumps сказал:

создают D3DDevice

Вот у меня остался старый проектик - частично переделанный урок кенга с убранной утечкой памяти(В уроке шрифт создавался в хукнутой Present и не высвобождался, а это очень опасно для функции, которая вызывается 60 раз в секунду(Ну или сколько там ФПС в вашем приложении)) и хуком EndScene вместо Present

Скрытый текст


#include "HackClass.h"
#include <d3dx9.h>
#include <d3d9.h>


// #include <MinHook.h>


#pragma comment(lib, "d3dx9.lib")
#pragma comment(lib, "d3d9.lib")

 

// #pragma comment(lib, "libMinHook-x86-v140-mtd.lib")

 

typedef IDirect3D9*(__stdcall *DIRECT3DCREATE9)(unsigned int);
// EndaaScene() sig:
// \x6A\x20\xB8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x8B\x75
// xxx????x????xx
//  d3d9.dll + 43B60 

HackClass* h = new HackClass;
DWORD * DXvTable;

typedef HRESULT(__stdcall * EndScene)(IDirect3DDevice9* pDevice);
EndScene fnEndScene;
BYTE origCode[5] = { 0,0,0,0,0 };
BYTE jmpCode[5] = { 0,0,0,0,0 };
DWORD oldProtEndScene;
DWORD funcAddr = 0;

LPD3DXFONT pFont;

void FildRect(IDirect3DDevice9* pDevice,int x, int y, int w, int h, int a, int r, int g, int b )
{
    D3DCOLOR color = D3DCOLOR_ARGB(a, r, g, b);
    D3DRECT rect = { x, y, w, h };
    pDevice->Clear(1, &rect, D3DCLEAR_TARGET | D3DCLEAR_TARGET, color, 0, 0);

}

void WriteTextToScreen(IDirect3DDevice9* pDevice,int x, int y,DWORD color, char* txt)
{
    RECT rect;
    SetRect(&rect, x, y, x, y);
    pFont->DrawTextA(NULL, txt, -1, &rect, DT_NOCLIP | DT_LEFT, color);
}


HRESULT __stdcall  HookedEndScene(IDirect3DDevice9* pDevice)
{
    BYTE * CodeDest = (BYTE*)fnEndScene;
    CodeDest[0] = origCode[0];
    *(DWORD*)(CodeDest + 1) = *(DWORD*)(origCode + 1);

    //h->Log("We Hook EndScene yeaah!!!");

    if (pFont)
    {
        pFont->Release();
        pFont = NULL;
    }
    if (!pFont)
    {
        D3DXCreateFontA(pDevice, 14, 0, FW_BOLD, 1, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &pFont);
    }

    WriteTextToScreen(pDevice, 15, 80, D3DCOLOR_ARGB(255, 255, 000, 000), "Type your Text HERE!");
    FildRect(pDevice, 15, 80, 300, 300, 30, 50, 50, 200);

    DWORD res = fnEndScene(pDevice);
    CodeDest[0] = jmpCode[0];
    *(DWORD*)(CodeDest + 1) = *(DWORD*)(jmpCode + 1);

    return res;
}

void  HookDevice()
{
    HWND hWnd = CreateWindowA("STATIC", "WindowsName", 0, 0, 0, 0, 0, 0, 0, 0, 0);
    HMODULE    hD3D9 = GetModuleHandleA("d3d9"); // GetModuleHandleA("d3d9");
    h->Log("D3D9 Library Handle: 0x%x", hD3D9);
    //IDirect3D9*(__stdcall*pDirect3DCreate9)(UINT) = (IDirect3D9*(__stdcall*)(UINT))GetProcAddress(hD3D9, "Direct3DCreate9");
    DIRECT3DCREATE9 pDirect3DCreate9 = (DIRECT3DCREATE9)GetProcAddress(hD3D9, "Direct3DCreate9");

    // Создаем свое устройство
    IDirect3D9* pD3D = pDirect3DCreate9(D3D_SDK_VERSION);

    D3DDISPLAYMODE d3ddm;
    pD3D->GetAdapterDisplayMode(0, &d3ddm);
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = 1;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;

    IDirect3DDevice9 * ppReturnedDeviceInterface = 0; // Да - Это то, что нам нужно!))

    pD3D->CreateDevice(0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &ppReturnedDeviceInterface);

    DXvTable = (DWORD*)(*((DWORD*)ppReturnedDeviceInterface));

    ppReturnedDeviceInterface->Release();
    pD3D->Release();
    FreeLibrary(hD3D9);
    CloseHandle(hWnd);
}

// Пустой поток, я не помню зачем я его делал, но удалять и коментить не стал, только вызов закоментил

DWORD __stdcall NewThread(LPVOID lp)
{


    return 0;
}

DWORD __stdcall HookThread(LPVOID lp)
{
    HookDevice();
    h->Log("Reset() : 0x%x", DXvTable[16]);
    h->Log("Present() : 0x%x", DXvTable[17]);
    h->Log("EndScene() : 0x%x", DXvTable[42]);
    h->Log("DrawIndexPrimitive() : 0x%x", DXvTable[82]);
    funcAddr = DXvTable[42];
    // Пробуем!)
    fnEndScene = (EndScene)((DWORD)funcAddr);
    jmpCode[0] = 0xE9;
    DWORD addr = (DWORD)HookedEndScene - (DWORD)fnEndScene - 5; // Расчитываем джампик
    memcpy(jmpCode + 1, &addr, sizeof(DWORD));
    memcpy(origCode, fnEndScene, 5);
    VirtualProtect(fnEndScene, 5, PAGE_EXECUTE_READWRITE, &oldProtEndScene);
    memcpy(fnEndScene, jmpCode, 5);

    return 0;
}


BOOL __stdcall DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
//    LPDIRECT3DDEVICE9 lpDevice;
//    CreateThread(0, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(NewThread), hModule, 0, 0);
    CreateThread(0, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(HookThread), hModule, 0, 0);
    case DLL_PROCESS_DETACH:

        break;
    }
    
    
    return TRUE;
}

 

P.s.: Ну и соответственно обьявление HackClass и все вызовы Log надо убрать, я морочится не стал) Хотя если интересно, могу скинуть(там не чего особенного). 

P.s.2: Надеюсь сейчас по правилам оформил, очень старался)) Мат из коментов поудалял :D

Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, temtriss сказал:

Надеюсь сейчас по правилам оформил, очень старался)) Мат из коментов поудалял :D

Мат не успел заметить по этому только за BB теги.

 

Ссылка на комментарий
Поделиться на другие сайты

  • 5 недель спустя...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.