roman159 Опубликовано 11 ноября, 2014 Поделиться Опубликовано 11 ноября, 2014 http://kekekeng.blogspot.ru/2012/10/d3d_30.html вот тут показан пример для directx 9, а если игра на directx 10, 11 как быть? Ссылка на комментарий Поделиться на другие сайты Поделиться
2zolo2 Опубликовано 11 ноября, 2014 Поделиться Опубликовано 11 ноября, 2014 Меняещь 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; } Ссылка на комментарий Поделиться на другие сайты Поделиться
roman159 Опубликовано 12 ноября, 2014 Автор Поделиться Опубликовано 12 ноября, 2014 (изменено) #include <d3d10.h>typedef IDirect3D10* (__stdcall *DIRECT3DCREATE10)(unsigned int);уже тут подчеркивает IDirect3D10вообще может тут не в версии дело. Я сам точно не знаю. Но после подключения dll игра сразу крашится. А о directx 10,11 я узнал, что в cheat engine в подключенных dll есть всякие d3d11.h d3d10.h Изменено 12 ноября, 2014 пользователем roman159 Ссылка на комментарий Поделиться на другие сайты Поделиться
roman159 Опубликовано 13 ноября, 2014 Автор Поделиться Опубликовано 13 ноября, 2014 #include <d3d10.h>#include <D3DX10.h>#pragma comment(lib,"d3dx10.lib")#pragma comment(lib,"d3d10.lib") typedef IDirect3D10* (__stdcall *DIRECT3DCREATE10)(unsigned int); подчеркивает( помогите, просто я первый раз на c++ что-то делаю, но мне нужна только эта dll. Ссылка на комментарий Поделиться на другие сайты Поделиться
2zolo2 Опубликовано 14 ноября, 2014 Поделиться Опубликовано 14 ноября, 2014 В каком смысле почеркиваеть? может ошибку выдаеть? и ещё ты подключиль d3dx10.lib?Если первый раз, то не легче сначала не много набраться опыта в написаний програм на С++?Если тебе нужна DLL от кода keng, не легче было задать вопрос в теме http://forum.gamehacklab.ru/forum/38-zapros/ , чтоб помогли собрать код на С++? P.S Я пишу на PureBasic и с компиляций на С++ не помогу. Ссылка на комментарий Поделиться на другие сайты Поделиться
roman159 Опубликовано 14 ноября, 2014 Автор Поделиться Опубликовано 14 ноября, 2014 а как вот еще делают, что записывают данные непосредственно в видеокарту? (как раз из-за чего возникает мерцание). И так как данное изображение поверх игры будет около минуты всего, можно и проц нагрузить и что-то там еще) как там сделать? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 14 ноября, 2014 Поделиться Опубликовано 14 ноября, 2014 Не непосредственно в видеокарту. Мерцание возникает из-за того, что оригинальная частота обновления кадров приложения не синхронизирована с частотой обновления накладываемой картинки. Это бывает, когда для наложение используется GDI прием с получением контекста окна и выводом графических команд на него. GDI обновляет окно по-своему, DirectX - по-своему. Отсюда нестыковка и мерцание. Именно поэтому и стали использовать хуки, то есть, перехват функции вывода DirectX, и внедрение своего кода перед непосредственно самим выводом. Это даже не является перехватом, по сути. Это просто наложение одной графической информации поверх другой. Ссылка на комментарий Поделиться на другие сайты Поделиться
roman159 Опубликовано 14 ноября, 2014 Автор Поделиться Опубликовано 14 ноября, 2014 Не непосредственно в видеокарту. Мерцание возникает из-за того, что оригинальная частота обновления кадров приложения не синхронизирована с частотой обновления накладываемой картинки. Это бывает, когда для наложение используется GDI прием с получением контекста окна и выводом графических команд на него. GDI обновляет окно по-своему, DirectX - по-своему. Отсюда нестыковка и мерцание. Именно поэтому и стали использовать хуки, то есть, перехват функции вывода DirectX, и внедрение своего кода перед непосредственно самим выводом. Это даже не является перехватом, по сути. Это просто наложение одной графической информации поверх другой.а как сделать вот способом с мерцанием? Там же можно как-то повысить частоту кадров, что мерцание было, но особо не заметно. Тем более игра онлайновая и в ней встроен механизм всяких проверок на оригинальные dll, и когда что-то меняется в памяти, игра сразу высылает эту информацию на сервер игры и даже могут забанить за стороннее ПО и разбираться никто не будет что к чему. Вот как просто поверх всего сделать пару своих изображений на экране? И говорю так как они должны быть отображены всего около минуты, то можно съесть оперативки (если нужно) и процессор нагрузить. То есть абсолютная "стабильность" не требуется Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 14 ноября, 2014 Поделиться Опубликовано 14 ноября, 2014 Онлайн игра, говоришь? А какого рода информацию ты хочешь выводить? Если что-то, что поможет обмануть других игроков - топай читать правила нашего форума. А по выводу на чужую поверхность с мерцанием и без хуков - читай функции GetDC, SelectObject и другие функции GDI. Ссылка на комментарий Поделиться на другие сайты Поделиться
roman159 Опубликовано 14 ноября, 2014 Автор Поделиться Опубликовано 14 ноября, 2014 Онлайн игра, говоришь? А какого рода информацию ты хочешь выводить? Если что-то, что поможет обмануть других игроков - топай читать правила нашего форума. А по выводу на чужую поверхность с мерцанием и без хуков - читай функции GetDC, SelectObject и другие функции GDI.хочу выводить информацию о каждом игроке. Но это никак не влияет на сам игровой процесс и никак не помогает и не упрощает игру Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 14 ноября, 2014 Поделиться Опубликовано 14 ноября, 2014 Тогда механизм такой1. Находишь окно игры (FindWindow)2. Получаешь контекст устройства этого окна (GetDC)3. Создаешь шрифт (CreateFont)4. Выбираешь его в контекст устройства, найденный выше (SelectObject)5. Создаешь надпись и выводишь ее на выбранный контекст (DrawText или TextOut)6. Уничтожаешь созданный шрифт (DeleteObject)7. Освобождаешь контекст (ReleaseDC)Вот такой алгоритм, если вкратце. Читай про указанные функции, и применяй на практике. Ссылка на комментарий Поделиться на другие сайты Поделиться
zorinchel Опубликовано 3 октября, 2019 Поделиться Опубликовано 3 октября, 2019 В 14.11.2014 в 21:12, Xipho сказал: Вот такой алгоритм, если вкратце. Читай про указанные функции, и применяй на практике. а таким образом можно вывести не текст, а например окно другой программы? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения