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

рисуем в чужом directx приложении

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

Меняещь 9, на нужное число 10, 11 и еще смотри документацию для directx 10, 11 и разбирай код, чтоб потом глупых вопросов не задовать.

Пример для 10, могут быть ошибки. Если первый раз, то по тренируйся сначала на directx 9, keng хорошо все описал и записал видео.



#include 
#include 
#pragma comment(lib,"d3dx10.lib")


typedef IDirect3D10* (__stdcall *DIRECT3DCREATE10)(unsigned int);
typedef long (__stdcall *PRESENT10)(IDirect3DDevice10* self, const RECT*, const RECT*, HWND, void*);


PRESENT9 g_D3D10_Present = 0;
BYTE g_codeFragment_p10[5] = {0, 0, 0, 0, 0};
BYTE g_jmp_p10[5] = {0, 0, 0, 0, 0};
DWORD g_savedProtection_p10 = 0;
DWORD present10 = 0;
bool indicator = 0;
D3DRECT rec = {10, 10, 120, 30};
ID3DXFont *m_font = 0;
RECT fontRect = {10, 15, 120, 120};
D3DCOLOR bkgColor = 0;
D3DCOLOR fontColor = 0;


void DrawIndicator(void* self)
{
        IDirect3DDevice10* dev = (IDirect3DDevice10*)self;
        dev->BeginScene(); 
  D3DXCreateFont(dev, 12, 0, FW_BOLD, 0, 0, 1, 0, 0, 0 | FF_DONTCARE, TEXT("Arial"), &m_font);  
  if(indicator)
  {
   bkgColor = D3DCOLOR_XRGB(0, 0, 255);
   fontColor = D3DCOLOR_XRGB(0, 255, 255);
  }
  else
  {
   bkgColor = D3DCOLOR_XRGB(255, 0, 0);
   fontColor = D3DCOLOR_XRGB(255, 0, 0);
  }
        dev->Clear(1, &rec, D3DCLEAR_TARGET, bkgColor, 1.0f, 0);
  m_font->DrawText(0, "keng.gamehacklab.ru", -1, &fontRect, 0, fontColor);
        dev->EndScene();
}


void GetDevice10Methods()
{
 HWND hWnd = CreateWindowA("STATIC","dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0);
 HMODULE hD3D10 = LoadLibrary("d3d10");
 DIRECT3DCREATE10 Direct3DCreate10 = (DIRECT3DCREATE9)GetProcAddress(hD3D10, "Direct3DCreate10");
 IDirect3D10* d3d = Direct3DCreate10(D3D_SDK_VERSION);
    D3DDISPLAYMODE d3ddm;
    d3d->GetAdapterDisplayMode(0, &d3ddm);
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = 1;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;
 IDirect3DDevice9* d3dDevice = 0;
    d3d->CreateDevice(0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3dDevice);
 DWORD* vtablePtr = (DWORD*)(*((DWORD*)d3dDevice));
 present10 = vtablePtr[17] - (DWORD)hD3D10;
 d3dDevice->Release();
 d3d->Release();
 FreeLibrary(hD3D10);
 CloseHandle(hWnd);
}


long __stdcall HookedPresent10(IDirect3DDevice10* self, const RECT* src, const RECT* dest, HWND hWnd, void* unused)
{
 BYTE* codeDest = (BYTE*)g_D3D10_Present;
 codeDest[0] = g_codeFragment_p10[0];
 *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p10 + 1));
 DrawIndicator(self);
 DWORD res = g_D3D10_Present(self, src, dest, hWnd, unused);
 codeDest[0] = g_jmp_p10[0];
 *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p10 + 1));
 return res;
}


void HookDevice10Methods()
{
 HMODULE hD3D10 = GetModuleHandle("d3d10.dll");
 g_D3D10_Present = (PRESENT10)((DWORD)hD3D10 + present10);
 g_jmp_p10[0] = 0xE9;
 DWORD addr = (DWORD)HookedPresent10 - (DWORD)g_D3D10_Present - 5;
 memcpy(g_jmp_p10 + 1, &addr, sizeof(DWORD));
 memcpy(g_codeFragment_p10, g_D3D10_Present, 5);
 VirtualProtect(g_D3D10_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p10);
 memcpy(g_D3D10_Present, g_jmp_p10, 5);
}


DWORD __stdcall TF(void* lpParam)
{
 GetDevice10Methods();
 HookDevice10Methods();
 return 0;
}


DWORD __stdcall KeyboardHook(void* lpParam)
{
        while(1)
        {
                if(GetAsyncKeyState(VK_F1))   
                {
                        indicator = !indicator;
                        Beep(500,200);
                }
                Sleep(100);
        }     
        return 0;
}


int __stdcall DllMain(HINSTANCE hInst, DWORD  ul_reason_for_call, void* lpReserved)
{
        switch (ul_reason_for_call)   
        {
        case DLL_PROCESS_ATTACH:
   CreateThread(0, 0, &TF, 0, 0, 0);
   CreateThread(0, 0, &KeyboardHook, 0, 0, 0);
        }
        return 1;
}

Поделиться сообщением


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

#include <d3d10.h>typedef IDirect3D10* (__stdcall *DIRECT3DCREATE10)(unsigned int);

уже тут подчеркивает IDirect3D10

вообще может тут не в версии дело. Я сам точно не знаю. Но после подключения dll игра сразу крашится. А о directx 10,11 я узнал, что в cheat engine в подключенных dll есть всякие d3d11.h d3d10.h

Изменено пользователем roman159

Поделиться сообщением


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

#include <d3d10.h>#include <D3DX10.h>#pragma comment(lib,"d3dx10.lib")#pragma comment(lib,"d3d10.lib") typedef IDirect3D10* (__stdcall *DIRECT3DCREATE10)(unsigned int);
 

подчеркивает( помогите, просто я первый раз на c++ что-то делаю, но мне нужна только эта dll.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В каком смысле почеркиваеть? может ошибку выдаеть? и ещё ты подключиль d3dx10.lib?

Если первый раз, то не легче сначала не много набраться опыта в написаний програм на С++?

Если тебе нужна DLL от кода keng, не легче было задать вопрос в теме http://forum.gamehacklab.ru/forum/38-zapros/ , чтоб помогли собрать код на С++?

P.S Я пишу на PureBasic и с компиляций на С++ не помогу.

Поделиться сообщением


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

а как вот еще делают, что записывают данные непосредственно в видеокарту? (как раз из-за чего возникает мерцание). И так как данное изображение поверх игры будет около минуты всего, можно и проц нагрузить и что-то там еще) как там сделать?

Поделиться сообщением


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

Не непосредственно в видеокарту. Мерцание возникает из-за того, что оригинальная частота обновления кадров приложения не синхронизирована с частотой обновления накладываемой картинки. Это бывает, когда для наложение используется GDI прием с получением контекста окна и выводом графических команд на него. GDI обновляет окно по-своему, DirectX - по-своему. Отсюда нестыковка и мерцание. Именно поэтому и стали использовать хуки, то есть, перехват функции вывода DirectX, и внедрение своего кода перед непосредственно самим выводом. Это даже не является перехватом, по сути. Это просто наложение одной графической информации поверх другой.

Поделиться сообщением


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

Не непосредственно в видеокарту. Мерцание возникает из-за того, что оригинальная частота обновления кадров приложения не синхронизирована с частотой обновления накладываемой картинки. Это бывает, когда для наложение используется GDI прием с получением контекста окна и выводом графических команд на него. GDI обновляет окно по-своему, DirectX - по-своему. Отсюда нестыковка и мерцание. Именно поэтому и стали использовать хуки, то есть, перехват функции вывода DirectX, и внедрение своего кода перед непосредственно самим выводом. Это даже не является перехватом, по сути. Это просто наложение одной графической информации поверх другой.

а как сделать вот способом с мерцанием? Там же можно как-то повысить частоту кадров, что мерцание было, но особо не заметно. Тем более игра онлайновая и в ней встроен механизм всяких проверок на оригинальные dll, и когда что-то меняется в памяти, игра сразу высылает эту информацию на сервер игры и даже могут забанить за стороннее ПО и разбираться никто не будет что к чему. Вот как просто поверх всего сделать пару своих изображений на экране? И говорю так как они должны быть отображены всего около минуты, то можно съесть оперативки (если нужно) и процессор нагрузить. То есть абсолютная "стабильность" не требуется

Поделиться сообщением


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

Онлайн игра, говоришь? А какого рода информацию ты хочешь выводить? Если что-то, что поможет обмануть других игроков - топай читать правила нашего форума. А по выводу на чужую поверхность с мерцанием и без хуков - читай функции GetDC, SelectObject и другие функции GDI.

Поделиться сообщением


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

Онлайн игра, говоришь? А какого рода информацию ты хочешь выводить? Если что-то, что поможет обмануть других игроков - топай читать правила нашего форума. А по выводу на чужую поверхность с мерцанием и без хуков - читай функции GetDC, SelectObject и другие функции GDI.

хочу выводить информацию о каждом игроке. Но это никак не влияет на сам игровой процесс и никак не помогает и не упрощает игру

Поделиться сообщением


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

Тогда механизм такой
1. Находишь окно игры (FindWindow)
2. Получаешь контекст устройства этого окна (GetDC)
3. Создаешь шрифт (CreateFont)
4. Выбираешь его в контекст устройства, найденный выше (SelectObject)
5. Создаешь надпись и выводишь ее на выбранный контекст (DrawText или TextOut)
6. Уничтожаешь созданный шрифт (DeleteObject)
7. Освобождаешь контекст (ReleaseDC)

Вот такой алгоритм, если вкратце. Читай про указанные функции, и применяй на практике.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 14.11.2014 в 21:12, Xipho сказал:

Вот такой алгоритм, если вкратце. Читай про указанные функции, и применяй на практике.

а таким образом можно вывести не текст, а например окно другой программы?

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

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

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