[C++] Создание Сhameleon WallHack на примере CS:GO
|
|
Ksardas |
Дата: Четверг, 22.06.2017, 14:56 | Сообщение # 1
|
Сообщений: 1311
Статус: Offline
|
Данный метод может быть использован для любой игры. Chameleon Wallhack (он же чамсвх) работает так: когда часть модельки (или вся моделька) находится в прямой видимости игрока она имеет один цвет (к примеру зеленый), когда модельку не видно, она имеет другой цвет (к примеру красный).
Немного теории, как он будет работать: 1) Инъектим наш код (в данном случае в виде .dll) в программу 2) Перехватываем DrawIndexedPrimitive (функция рисует примитивы) 3) Сравниваем количество страйдов, вершин и примитивов с нужными и накладываем нашу текстурку (об этом всем подробнее ниже) 4) Вызываем оригинальный DrawIndexedPrimitive
Начнем. Первым делом подключим необходимые инклуды
Код #include <vector> // для директа #include <d3d9.h> #include <d3dx9core.h> // для перехвата функции endscene #include "detours.h" #include "Header.h" #include <iostream> #include <string>
Добавляем библиотеки для поиска
Код #pragma comment(lib, "d3d9") #pragma comment(lib, "d3dx9") // тут и так понятно зачем это нужно using namespace std;
Дальше объявляем все нужные нам переменные и функции. Добавляем оригинальные функции d3d9
Код typedef HRESULT(WINAPI* pDrawIndexedPrimitive)(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, int, UINT, UINT, UINT, UINT); typedef HRESULT(WINAPI* pEndScene)(LPDIRECT3DDEVICE9);
Функции, на которые будем подменять
Код pDrawIndexedPrimitive oDrawIndexedPrimitive; pEndScene oEndScene;
Объявляем переменные
Код D3DVIEWPORT9 Vpt; D3DLOCKED_RECT d3dlr; LPD3DXFONT pFont = NULL;
LPDIRECT3DBASETEXTURE9 BTEX = NULL; LPDIRECT3DTEXTURE9 Grey, Red; bool Generate = true;
Дальше начались уже наши функции. Внимание, я привожу код в порядке "распутывания клубка", в каком порядке вставлять функции в исходный код, я думаю, вы разберетесь сами. // Начальная функция, которая вызывается, когда библиотеку заинъектиили в процесс. Аналог простого main в консольных приложениях.
Код int WINAPI DllMain(HINSTANCE hInst, DWORD ul_reason_for_call, void* lpReserved) { // когда присоединили нашу длл к процессу, кстати, эта функции еще вызывается в нескольких случаях, к примеру, //когда библиотеку отсоединили от процесса, но тогда в проверке нужно будет указывать другую причину // нам это не особо нужно, поэтому углублятся не буду if (ul_reason_for_call == DLL_PROCESS_ATTACH) // создаем отдельный поток и вызываем в нем функцию TF() CreateThread(0, 0, (LPTHREAD_START_ROUTINE)TF, 0, 0, 0); return 1; }
Наша функция TF(), при желании ее можно пропустить, и сразу в потоке вызывать GetDevice9Methods()
Код void TF() { // Здесь будет осуществляться перехват функций GetDevice9Methods(); // Если вы хотите сделать, чтобы к примеру по нажатию клавиши менялся цвет чамсов, то делается это примерно так: /* Создаем бесконечный цикл В нем ожиданием нажатия клавиши После того, как клавишу нажали, что-то делаем*/
}
Функция GetDevice9Methods()
Код void GetDevice9Methods() { // инициализации переменных DWORD dip9 = 0; DWORD endScene9 = 0; IDirect3D9 *d3d9_ptr; IDirect3DDevice9* d3dDevice; DWORD* vtablePtr; D3DPRESENT_PARAMETERS d3dpp; // создаем окно, нужно для перехвата HWND hWnd = CreateWindowExA(0, "STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0); // получаем смещение HMODULE hD3D9 = GetModuleHandleA("d3d9.dll"); // если удалось получить смещение if (hD3D9 != 0) { // Создаем интерфейс d3d9_ptr = Direct3DCreate9(D3D_SDK_VERSION); // обнуляем память ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = 1; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // создаем девайс на наше свежесозданное окно d3d9_ptr->CreateDevice(0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3dDevice); // здесь находим адреса в vmt, нужно для перехвата vtablePtr = (PDWORD)(*((PDWORD)d3dDevice)); dip9 = vtablePtr[82] - (DWORD)hD3D9; endScene9 = vtablePtr[42] - (DWORD)hD3D9; d3dDevice->Release(); d3d9_ptr->Release(); } CloseHandle(hWnd); // собственно перехватываем наши две основные функции // теперь, вместо оригинальных функций, будут вызываться наши // Важный нюанс, функции, которые начинается на o - это // оригинальные функции // наши, начинаются с hk oDrawIndexedPrimitive = (pDrawIndexedPrimitive)DetourFunction((PBYTE)((DWORD)hD3D9 + dip9), (PBYTE)hkDrawIndexedPrimitive); oEndScene = (pEndScene)DetourFunction((PBYTE)((DWORD)hD3D9 + endScene9), (PBYTE)hkEndScene); }
Наша перехваченная функция для отрисовки примитивов
Код HRESULT WINAPI hkDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDev, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT PrimitiveCount) { // все дефолтно, создаем переменные LPDIRECT3DVERTEXBUFFER9 Stream_Data; UINT Offset = 0; UINT Stride = 0; if (pDev->GetStreamSource(0, &Stream_Data, &Offset, &Stride) == S_OK) Stream_Data->Release();
// Самая интересная часть. У каждой модели есть страйды, количество вершин и количество примитивов // обычно, у каждой модели эти три переменные формируют уникальную комбинацию, по которой // можно находить модель. // Т.е. тут должна быть проверка вида if ( (Stride=32) && (NumVertices==1784) && (PrimitiveCount==1342)) // Но во многих игровых движках, чем дальше от тебя моделька, тем меньше страйдов, вершин и примитивов // Ведь зачем рисовать модельку хорошего качества, если она находится на большом расстоянии от игрока и // занимает 1 см^2 на экране // Плюс, надо учитывать то, что голова это одна модель, тело уже другая // Полный список для игры CS:GO, готовый в употребление, возьмите тут http://pastebin.com/5tq2dvJq, чтобы его найти // для другой игры, можно воспользоваться логгером или погуглить имя_вашей_иры model rec
if (ct_model) { // Здесь устанавливаем нашей моделе серую текстуру, котоую будет видно, когда модель за стеной // D3DRS_ZENABLE устанавливаем false pDev->SetRenderState(D3DRS_ZENABLE, false); pDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); pDev->SetTexture(0, Grey); // вызываем оригинальную функцию oDrawIndexedPrimitive(pDev, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, PrimitiveCount); // здесь накладываем красную текстурку, когда моделька в прямой зоне видимости игрока pDev->SetRenderState(D3DRS_ZENABLE, true); pDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); pDev->SetTexture(0, Red);
} // вызываем оригинальную функцию return oDrawIndexedPrimitive(pDev, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, PrimitiveCount); }
Перехваченная функция endscene
Код // Вызывается, когда происходит окончание сцены. Каждая сцена = 1 кадру. // Т.е. если в игре 30 fps, то данные функция вызывается 30 раз в секунду HRESULT WINAPI hkEndScene(LPDIRECT3DDEVICE9 pDev) { pDev->GetViewport(&Vpt); // Если наши текстурки не были еще сгенерированы, то генерируем их if (Generate)
{ // цвета, последнии три цифры в функции отвечают за цвет // задаются по типу RGB GenerateTexture(pDev, &Red, D3DCOLOR_ARGB(255, 255, 0, 0));
GenerateTexture(pDev, &Grey, D3DCOLOR_ARGB(255, 128, 128, 128));
Generate = false;
} // вызываем оригинальную функцию return oEndScene(pDev); }
И последняя функция для генерации текстур
Код // И функция для генерации текстур с нужным нам цветом // В ней ничего интересно нет, поэтому углублятся не буду HRESULT GenerateTexture(IDirect3DDevice9 *pD3Ddev, IDirect3DTexture9 **ppD3Dtex, DWORD colour32)
{
if (FAILED(pD3Ddev->CreateTexture(8, 8, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, ppD3Dtex, NULL)))
return E_FAIL;
WORD colour16 = ((WORD)((colour32 >> 28) & 0xF) << 12)
| (WORD)(((colour32 >> 20) & 0xF) << 8)
| (WORD)(((colour32 >> 12) & 0xF) << 4)
| (WORD)(((colour32 >> 4) & 0xF) << 0);
D3DLOCKED_RECT d3dlr;
(*ppD3Dtex)->LockRect(0, &d3dlr, 0, 0);
WORD *pDst16 = (WORD*)d3dlr.pBits;
for (int xy = 0; xy < 8 * 8; xy++)
*pDst16++ = colour16;
(*ppD3Dtex)->UnlockRect(0);
return S_OK;
}
|
|
|
|
Planovskoii |
Дата: Четверг, 22.06.2017, 19:58 | Сообщение # 2
|
Любитель
Сообщений: 46
Статус: Offline
|
Разве VAC не определит его?
C++
|
|
|
|
Ksardas |
Дата: Воскресенье, 25.06.2017, 20:44 | Сообщение # 3
|
Сообщений: 1311
Статус: Offline
|
Цитата Planovskoii ( ) Разве VAC не определит его? Это не исключено. Я играл с ним месяц,бана не получил.Но,шанс бана c любыми читами действительно велик.Добавлено (23.06.2017, 20:47) --------------------------------------------- Вверх! Добавлено (24.06.2017, 21:54) --------------------------------------------- Подниму! Добавлено (25.06.2017, 20:44) --------------------------------------------- Актуально!
Сообщение отредактировал Ksardas - Четверг, 22.06.2017, 21:10 |
|
|
|
Diaz™ |
Дата: Воскресенье, 25.06.2017, 23:05 | Сообщение # 4
|
Боец
Сообщений: 207
Статус: Offline
|
еси криптануть и через флеш детектить в процесс, меньше шанс получения бана?
sam takoy)))))
|
|
|
|
Ksardas |
Дата: Суббота, 29.07.2017, 19:14 | Сообщение # 5
|
Сообщений: 1311
Статус: Offline
|
Цитата Diaz™ ( ) еси криптануть и через флеш детектить в процесс, меньше шанс получения бана? Не думаю,это самый дефолтный вх.Чтобы уменьшить кол-во детектов,слишком много нужно будет над ним работать.Это кстати не только на Кс распространяется.Добавлено (26.06.2017, 23:05) ---------------------------------------------
Добавлено (01.07.2017, 19:38) ---------------------------------------------
Добавлено (03.07.2017, 10:48) ---------------------------------------------
Добавлено (04.07.2017, 11:49) ---------------------------------------------
Добавлено (09.07.2017, 12:45) ---------------------------------------------
Добавлено (10.07.2017, 19:22) ---------------------------------------------
Добавлено (18.07.2017, 18:55) ---------------------------------------------
Добавлено (23.07.2017, 23:12) ---------------------------------------------
Добавлено (24.07.2017, 23:34) ---------------------------------------------
Добавлено (29.07.2017, 19:14) ---------------------------------------------
|
|
|
|
Jamiraque[t0wer] |
Дата: Понедельник, 31.07.2017, 15:14 | Сообщение # 6
|
Советник
Сообщений: 603
Статус: Offline
|
Цитата Planovskoii ( ) Разве VAC не определит его? dll нет в базе, инжектор не детект = вак не определит
Цитата Diaz™ ( ) еси криптануть и через флеш детектить в процесс, меньше шанс получения бана?
крипт возможно, инжект с флешки = юзлесс процедура
автор молодец
|
|
|
|
Ksardas |
Дата: Вторник, 01.08.2017, 13:40 | Сообщение # 7
|
Сообщений: 1311
Статус: Offline
|
Подниму
|
|
|
|
BinL3R |
Дата: Среда, 02.08.2017, 10:21 | Сообщение # 8
|
Боец
Сообщений: 225
Статус: Offline
|
Цитата Ksardas ( ) Добавляем оригинальные функции d3d9 Код typedef HRESULT(WINAPI* pDrawIndexedPrimitive)(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, int, UINT, UINT, UINT, UINT); typedef HRESULT(WINAPI* pEndScene)(LPDIRECT3DDEVICE9);
Разве typedef не отвечает за изменение названия функции?
#include
|
|
|
|
DECODE |
Дата: Четверг, 03.08.2017, 16:20 | Сообщение # 9
|
Coder
Сообщений: 189
Статус: Offline
|
Говорят, что можно заинжектить в стороннюю DLL-ку, тогда VAC не спалит. А так - годная шляпа, только одного не понимаю, сколько не пытался понять работу с DirectX - так и не понимаю.
► Оптимизация SCM / SMTA (pawn): http://cheat-master.ru/forum/117-706531-1 ► CM Smiles - Mini Chat (v1.0): http://cheat-master.ru/forum/2-706062-1 ► [Evolve-RP] - Баг на деньги (история тестера): http://cheat-master.ru/forum/282-709301-1 ► Накрутка сообщений в ВКонтакте (new): http://cheat-master.ru/forum/199-709369-1
|
|
|
|
Ksardas |
Дата: Четверг, 17.08.2017, 21:40 | Сообщение # 10
|
Сообщений: 1311
Статус: Offline
|
Актуально
|
|
|
|
INHUМAN |
Дата: Четверг, 17.08.2017, 22:09 | Сообщение # 11
|
Боец
Сообщений: 186
Статус: Offline
|
Копипаст конечно, но пускай здесь тоже будет, пригодится. Если что исходники 15 года, но сомневаюсь, что ВАК его палит
Сообщение отредактировал INHUМAN - Четверг, 17.08.2017, 23:16 |
|
|
|
Ksardas |
Дата: Суббота, 02.09.2017, 17:16 | Сообщение # 12
|
Сообщений: 1311
Статус: Offline
|
INHUМAN, исходники 16 года.
|
|
|
|
getmejiayu |
Дата: Вторник, 05.09.2017, 16:04 | Сообщение # 13
|
Новичок
Сообщений: 1
Статус: Offline
|
А посвежее есть исходники?
|
|
|
|
BLOOM228 |
Дата: Понедельник, 18.09.2017, 19:36 | Сообщение # 14
|
Бывалый
Сообщений: 418
Статус: Offline
|
Цитата Ksardas ( ) исходники 16 года. Какого 16 года Эта фигня со времён динозавров. Даже в сурсах собейта это есть...
ALFEROV
alferov.love
|
|
|
|
Mussolliny |
Дата: Воскресенье, 29.10.2017, 12:57 | Сообщение # 15
|
♣ БАРЫГА ♣
Сообщений: 102
Статус: Offline
|
Полезно, но шанс отлететь = 80%. Однако если брать за исходник разработки и дорабатывать дальше, то может что-то и получиться
|
|
|
|