И так, для начала разберемся, что такое Chams: Chams - на всех игроках появляется как бы аура определённого цвета. Эта функция делится на 2 вида: 1) Если игрок в зоне поражения (то есть у вас есть шанс нанести ему урон даже через стену), то он одного цвета, как только нанести урон противнику станет невозможно, он будет другого цвета; 2) Этот вид очень помогает любителям WallHack`a. Если ВХ не очень хорошее, то не всегда можно разобрать, когда игрок находится непосредственно перед вами, а когда стоит за стеной, такой ESP спасёт ситуацию. Если игрок в поле видимости (нормальном, без чита), тогда он одного цвета, а если нет (за стеной или дверью), тогда другого. Шаг #1: Для начала, Вам понадобится Visual Studio, рекомендовано использовать Visual Studio 2015-го года. После завершения установки, Вам так же потребуется установить DirectX SDK и Detours 1.5 (пароль для скачивания: lolzteam.org) Шаг #2: Начинаете новые проект, как указано на скриншоте. Вверху в Visual Studio перепроверьте, что указано "Release" и "х86" Нажимаем правой кнопкой мыши на свой проект в "Обозревателе решений" ("Solution Explorer") Выбираете "Свойства" (Properties) и должны попасть на страницу, что и ниже на скриншоте. Изменяете "Тип конфигурации" (Cofiguration Type) на "Dynamic Library (.dll)". Затем, открываете "Linker", что находится в "Свойствах конфигурации" (Configuration Properties), потом "Дополнительно" (Advanced) и прокрутите в самый низ. Должно выглядеть так: Если всё, как и на скриншоте, обратите внимание на самую последнюю запись, в ней говориться: "Image Has Safe Exception Handlers". Вам нужно изменить её на ""No (/SAFESEH:NO)". После всё должно выглядеть так: Не забудьте нажать "ОК" (Apply) После переходим в раздел "VC++ Directories", он находиться выше раздела "Linker". Должно быть так: Далее переходим в "Include Directories", нажимаете на маленькую стрелочку и после на "Edit...>": Должно выглядеть так: Нажмите на эту маленькую папку в верхнем левом углу, а затем на три точки. Теперь укажите путь к папке, в которую вы установили DirectX SDK. В этой папке выберите папку «Includes» и нажмите «Выбрать папку»: Теперь повторите всё тоже с маленькой папкой и тремя точками: После, укажите путь, где вы установили "Detours" и выберите папку «inc»: Нажмите «ОК», а затем нажмите «Применить» в нижнем правом углу. Теперь переходим в «Library Directories», нажмите на маленькую стрелку снова, а затем на редактирование. Нажмите на маленькую папку в верхнем левом углу, а затем на три точки снова. На этот раз переходим в папку, в которой вы установили DirectX SDK, но теперь перейдите в папку с именем «Lib» и там выберите папку «x86»: Затем сделайте то же самое для Detours. В папке Detours выберите папку «inc»: Не забудьте снова нажать «ОК» и «Применить». Теперь закройте страницу свойств (Properties Page) и снова просмотрите проводник решений (solution explorer). Щелкните правой кнопкой мыши на «Исходные файлы» (Source Files) в проводнике решений (solution explorer) и нажмите «Добавить -> Новый элемент» (Add -> New Item) или нажмите Ctrl + Shift + A: Выберите «.cpp» и назовите его, как хотите. Дважды щелкните на новом файле в проводнике решений (solution explorer) и приступаем к следующей части. Шаг #3. Создаем DllMain: Начнем с создания точки входа dll: BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { } else if (dwReason == DLL_PROCESS_DETACH) { } return TRUE; } Код BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { } else if (dwReason == DLL_PROCESS_DETACH) { } return TRUE; } В этом коде будет выдавать много ошибок, потому что мы не включили существенный материал. Так что давайте сделаем это. Перейдите в начало скрипта и добавьте следующее: #include "Windows.h" #include "intrin.h" #include "d3d9.h" #include "d3dx9.h" #include "Detours.h" Код #include "Windows.h" #include "intrin.h" #include "d3d9.h" #include "d3dx9.h" #include "Detours.h" Таким образом, мы включаем Detours, DirectX SDK, intrin для адреса возврата и заголовок Windows почти для всего. Теперь давайте также сделаем с библиотеками Detours и DirectX: #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #pragma comment(lib, "Detours.lib") Код #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #pragma comment(lib, "Detours.lib") С этим материалом, мы так же можем добавить: #pragma intrinsic(_ReturnAddress) Код #pragma intrinsic(_ReturnAddress) Так мы можем получить обратные адреса процесса, в котором мы находимся. Теперь у нас есть то, что позволяет вернуться к нашей функции DllMain. Теперь мы хотим добавить, что происходит, когда наша dll привязана к процессу. Мы хотим инициализировать или перехватывать, поэтому давайте сделаем это. Сначала мы создать bool с именем «bInit» для проверки, не инициализируем ли мы все, или если это уже сделано. Весь наш код должен выглядеть примерно так: #include "Windows.h" #include "intrin.h" #include "d3d9.h" #include "d3dx9.h" #include "Detours.h" #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #pragma comment(lib, "Detours.lib") #pragma intrinsic(_ReturnAddress) bool bInit = false; BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { } else if (dwReason == DLL_PROCESS_DETACH) { } return TRUE; } Код #include "Windows.h" #include "intrin.h" #include "d3d9.h" #include "d3dx9.h" #include "Detours.h" #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #pragma comment(lib, "Detours.lib") #pragma intrinsic(_ReturnAddress) bool bInit = false; BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { } else if (dwReason == DLL_PROCESS_DETACH) { } return TRUE; } Теперь давайте перейдем к «if (dwReason == DLL_PROCESS_ATTACH)» и добавим еще один if. if (!bInit){ } Код if (!bInit){ } Теперь перейдем к hooks. Шаг #4. DirectX Hooks с Detours: Теперь мы можем инициализировать хуки. Для начала создаем прототипы подключенных функций: typedef HRESULT(WINAPI *Prototype_Present)(LPDIRECT3DDEVICE9, CONST RECT*, CONST RECT*, HWND, CONST RGNDATA*); typedef HRESULT(WINAPI *Prototype_DrawIndexedPrimitive)(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, INT, UINT, UINT, UINT, UINT); Код typedef HRESULT(WINAPI *Prototype_Present)(LPDIRECT3DDEVICE9, CONST RECT*, CONST RECT*, HWND, CONST RGNDATA*); typedef HRESULT(WINAPI *Prototype_DrawIndexedPrimitive)(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, INT, UINT, UINT, UINT, UINT); Вы задаётесь вопросом: «Что это такое?» Это прототипы для функций DirectX с их параметрами, которые мы будем подключать. Итак, теперь подключаем ссылку на наши недавно созданные прототипы: Prototype_Present Original_Present; Prototype_DrawIndexedPrimitive Original_DrawIndexedPrimitive; Код Prototype_Present Original_Present; Prototype_DrawIndexedPrimitive Original_DrawIndexedPrimitive; Теперь, когда мы сделали это, мы можем создать наши Hook функции: HRESULT WINAPI Hooked_Present(LPDIRECT3DDEVICE9 Device, CONST RECT *pSrcRect, CONST RECT *pDestRect, HWND hDestWindow, CONST RGNDATA *pDirtyRegion); HRESULT WINAPI Hooked_DrawIndexedPrimitive(LPDIRECT3DDEVICE9 Device, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount); Код HRESULT WINAPI Hooked_Present(LPDIRECT3DDEVICE9 Device, CONST RECT *pSrcRect, CONST RECT *pDestRect, HWND hDestWindow, CONST RGNDATA *pDirtyRegion); HRESULT WINAPI Hooked_DrawIndexedPrimitive(LPDIRECT3DDEVICE9 Device, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount); Это наши описания функций для подключенных функций. Как Вы можете заметить, выбивает предупреждение. Это из-за того, что мы добавили лишь описание и не указали путь. Так что давайте сделаем это. Добавьте их под функцию DllMain: HRESULT WINAPI Hooked_Present(LPDIRECT3DDEVICE9 Device, CONST RECT *pSrcRect, CONST RECT *pDestRect, HWND hDestWindow, CONST RGNDATA *pDirtyRegion) { } HRESULT WINAPI Hooked_DrawIndexedPrimitive(LPDIRECT3DDEVICE9 Device, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount) { } Код HRESULT WINAPI Hooked_Present(LPDIRECT3DDEVICE9 Device, CONST RECT *pSrcRect, CONST RECT *pDestRect, HWND hDestWindow, CONST RGNDATA *pDirtyRegion) { } HRESULT WINAPI Hooked_DrawIndexedPrimitive(LPDIRECT3DDEVICE9 Device, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount) { } Переходим в "if", который мы создали ранее, и добавляем следующее: [CODE]Original_Present = (Prototype_Present)DetourFunction((PBYTE)GetDeviceAddress(17), (PBYTE)Hooked_Present); Original_DrawIndexedPrimitive = (Prototype_DrawIndexedPrimitive)DetourFunction((PBYTE)GetDeviceAddress(82), (PBYTE)Hooked_DrawIndexedPrimitive); bInit = true;[/CODE]В нем мы используем Detours для подключения функций. Вы снова увидите, что выбивает ошибку «GetDeviceAddress». Добавьте следующее: DllMain: [CODE]DWORD FindDevice(DWORD Len) { DWORD dwObjBase = 0; dwObjBase = (DWORD)LoadLibrary("d3d9.dll"); while (dwObjBase++ < dwObjBase + Len) { 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]; }[/CODE]Теперь мы видим, что наброски хуков работают некорректно. Потому что, при переключении на нашу функцию, она не возвращается к оригиналу. И это приводит к крашу игры. Давайте его пофиксим. Добавляем следующий insinde из "else if (dwReason == DLL_PROCESS_DETACH)" [CODE]DetourRemove((PBYTE)Original_Present, (PBYTE)Hooked_Present); DetourRemove((PBYTE)Original_DrawIndexedPrimitive, (PBYTE)Hooked_DrawIndexedPrimitive);[/CODE]Теперь игра не будет крашиться, но мы по-прежнему не возвращаемся к исходным функциям. Чтобы исправить это, просто добавьте следующие строки в конце наших подключенных функций: [CODE]return Original_Present(Device, pSrcRect, pDestRect, hDestWindow, pDirtyRegion);[/CODE][CODE]return Original_DrawIndexedPrimitive(Device, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);[/CODE]С хуками закончили. Наш целый код должен выглядеть так: [CODE]#include "Windows.h" #include "intrin.h" #include "d3d9.h" #include "d3dx9.h" #include "Detours.h" #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #pragma comment(lib, "Detours.lib") #pragma intrinsic(_ReturnAddress) bool bInit = false; typedef HRESULT(WINAPI *Prototype_Present)(LPDIRECT3DDEVICE9, CONST RECT*, CONST RECT*, HWND, CONST RGNDATA*); typedef HRESULT(WINAPI *Prototype_DrawIndexedPrimitive)(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, INT, UINT, UINT, UINT, UINT); Prototype_Present Original_Present; Prototype_DrawIndexedPrimitive Original_DrawIndexedPrimitive; HRESULT WINAPI Hooked_Present(LPDIRECT3DDEVICE9 Device, CONST RECT *pSrcRect, CONST RECT *pDestRect, HWND hDestWindow, CONST RGNDATA *pDirtyRegion); HRESULT WINAPI Hooked_DrawIndexedPrimitive(LPDIRECT3DDEVICE9 Device, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount); DWORD FindDevice(DWORD Len) { DWORD dwObjBase = 0; dwObjBase = (DWORD)LoadLibrary("d3d9.dll"); while (dwObjBase++ < dwObjBase + Len) { 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]; } BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { if (!bInit) { Original_Present = (Prototype_Present)DetourFunction((PBYTE)GetDeviceAddress(17), (PBYTE)Hooked_Present); Original_DrawIndexedPrimitive = (Prototype_DrawIndexedPrimitive)DetourFunction((PBYTE)GetDeviceAddress(82), (PBYTE)Hooked_DrawIndexedPrimitive); bInit = true; } } else if (dwReason == DLL_PROCESS_DETACH) { DetourRemove((PBYTE)Original_Present, (PBYTE)Hooked_Present); DetourRemove((PBYTE)Original_DrawIndexedPrimitive, (PBYTE)Hooked_DrawIndexedPrimitive); } return TRUE; } HRESULT WINAPI Hooked_Present(LPDIRECT3DDEVICE9 Device, CONST RECT *pSrcRect, CONST RECT *pDestRect, HWND hDestWindow, CONST RGNDATA *pDirtyRegion) { return Original_Present(Device, pSrcRect, pDestRect, hDestWindow, pDirtyRegion); } HRESULT WINAPI Hooked_DrawIndexedPrimitive(LPDIRECT3DDEVICE9 Device, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount) { return Original_DrawIndexedPrimitive(Device, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount); }[/CODE] Шаг #5. Переходим к Chams. Для сначала нужно несколько переменных. Нам нужны ReturnAddress игроков. Текущий: [CODE]#define Player 0x68EBA1[/CODE]Код для активации и деактивации "чамсов": [CODE]bool bChams = true;[/CODE]и так, потребуется текстура для разрисовки [CODE]LPDIRECT3DTEXTURE9 texRed = NULL;[/CODE]Для создания текстуры, нам потребуется функция «GenerateTexture»: [CODE]HRESULT GenerateTexture(LPDIRECT3DDEVICE9 pDevice, IDirect3DTexture9 **ppD3Dtex, DWORD colour32) { if (FAILED(pDevice->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; }[/CODE]Теперь в Hooked_Present мы добавим еще один оператор if: [CODE]if (texRed == NULL) { }[/CODE]Этот оператор if проверяет, является ли текстура пустой и будет ли на текстуре что-то образовываться. [CODE]GenerateTexture(Device, &texRed, D3DCOLOR_ARGB(255, 255, 0, 0));[/CODE]Теперь, когда у нас есть текстура, нам нужно нарисовать текстурку появляющегося игрока. Заходим в "Hooked DrawIndexedPrimitive» и добавляем следующее: [CODE]void* ReturnAddress = _ReturnAddress();[/CODE]После, создаем другой if: [CODE]if (ReturnAddress == (void*)Player && bChams) { }[/CODE]Этот код проверяет, является ли отображаемый ReturnAddress нашим игроком и активированы ли Chams. Затем нам нужно отключить z-buffer игроков, чтобы мы могли видеть их сквозь стены: [CODE]Device->SetRenderState(D3DRS_ZENABLE, FALSE);[/CODE]Теперь мы хотим придать нашему игроку настоящие Chams: [CODE]Device->SetTexture(0, texRed);[/CODE]Затем мы вызываем исходный drawindexedprimitive, чтобы снова нарисовать все нормально: [CODE]Original_DrawIndexedPrimitive(Device, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount);[/CODE]После мы хотим снова включить z-буфер: [CODE]Device->SetRenderState(D3DRS_ZENABLE, TRUE);[/CODE]И, в конце мы хотим сделать его красным цветом: [CODE]Device->SetTexture(0, texRed);[/CODE]В конце, Ваш код должен быть похож примерно на этот: [CODE]#include "windows.h" #include "intrin.h" #include "d3d9.h" #include "d3dx9.h" #include "Detours.h" #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #pragma comment(lib, "Detours.lib") #pragma intrinsic(_ReturnAddress) #define Player 0x68EBA1 bool bInit = false; bool bChams = true; LPDIRECT3DTEXTURE9 texRed = NULL; typedef HRESULT(WINAPI *Prototype_Present)(LPDIRECT3DDEVICE9, CONST RECT*, CONST RECT*, HWND, CONST RGNDATA*); typedef HRESULT(WINAPI *Prototype_DrawIndexedPrimitive)(LPDIRECT3DDEVICE9, D3DPRIMITIVETYPE, INT, UINT, UINT, UINT, UINT); Prototype_Present Original_Present; Prototype_DrawIndexedPrimitive Original_DrawIndexedPrimitive; HRESULT WINAPI Hooked_Present(LPDIRECT3DDEVICE9 Device, CONST RECT *pSrcRect, CONST RECT *pDestRect, HWND hDestWindow, CONST RGNDATA *pDirtyRegion); HRESULT WINAPI Hooked_DrawIndexedPrimitive(LPDIRECT3DDEVICE9 Device, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount); DWORD FindDevice(DWORD Len) { DWORD dwObjBase = 0; dwObjBase = (DWORD)LoadLibrary("d3d9.dll"); while (dwObjBase++ < dwObjBase + Len) { 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]; } HRESULT GenerateTexture(LPDIRECT3DDEVICE9 pDevice, IDirect3DTexture9 **ppD3Dtex, DWORD colour32) { if (FAILED(pDevice->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; } BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { if (!bInit) { Original_Present = (Prototype_Present)DetourFunction((PBYTE)GetDeviceAddress(17), (PBYTE)Hooked_Present); Original_DrawIndexedPrimitive = (Prototype_DrawIndexedPrimitive)DetourFunction((PBYTE)GetDeviceAddress(82), (PBYTE)Hooked_DrawIndexedPrimitive); bInit = true; } } else if (dwReason == DLL_PROCESS_DETACH) { DetourRemove((PBYTE)Original_Present, (PBYTE)Hooked_Present); DetourRemove((PBYTE)Original_DrawIndexedPrimitive, (PBYTE)Hooked_DrawIndexedPrimitive); } return TRUE; } HRESULT WINAPI Hooked_Present(LPDIRECT3DDEVICE9 Device, CONST RECT *pSrcRect, CONST RECT *pDestRect, HWND hDestWindow, CONST RGNDATA *pDirtyRegion) { if (texRed == NULL) { GenerateTexture(Device, &texRed, D3DCOLOR_ARGB(255, 255, 0, 0)); } return Original_Present(Device, pSrcRect, pDestRect, hDestWindow, pDirtyRegion); } HRESULT WINAPI Hooked_DrawIndexedPrimitive(LPDIRECT3DDEVICE9 Device, D3DPRIMITIVETYPE PrimType, INT BaseVertexIndex, UINT MinVertexIndex, UINT NumVertices, UINT startIndex, UINT primCount) { void* ReturnAddress = _ReturnAddress(); if (ReturnAddress == (void*)Player && bChams) { Device->SetRenderState(D3DRS_ZENABLE, FALSE); Device->SetTexture(0, texRed); Original_DrawIndexedPrimitive(Device, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount); Device->SetRenderState(D3DRS_ZENABLE, TRUE); Device->SetTexture(0, texRed); } return Original_DrawIndexedPrimitive(Device, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount); }[/CODE]Шаг #6. Проверка нашего софта. Когда всё сделано, Вы можете сохранить свой проект и нажмите f5, чтобы скомпилировать его. Если он не компилируется, убедитесь, что вы все сделали правильно. Запускаете инжектор, добавляете dll, который находится в папке, в которой сохранен Ваш проект. Инжектите, когда игра полностью запущена. В результате, должно получиться так: Скриншот Как сделать No Smoke: [CODE]#define Smoke 0x68AC64 //In DIP: if (ReturnAddress == (void*)Smoke) return 0;[/CODE] Тэги warface, чит для варфейса, читы, чит, чит для варфейса без вирусов, варфейс, чит для варфейс без бана, чит для варфейс 2018, варфейс читы скачать, читы на варфейс с яндекс диска, warface вх, warface автошот, есп для варфейс, аимбот для варфейс, антиотдача для варфейс, варфейс читы 2017, warface аим, аим для варфейс, лучший чит для варфейс как создавать читы, урок по созданию читов, создание читов, без знаний программирования, онлайн игры, гайд Ссылка на источник (кликабельно) ВНИМАНИЕ!!! За все читы банят! Не важно, приват это или паблик, рано или поздно вас могут забанить. Также могут дать бан по HWID.
Статус - DETECTED. Обновленный код: #define InGameFramework 0x191B894 #define Smoke 0xC83034 #define Player 0xC86F71 #define World 0xC86F1E #define Lighting 0xA5112E #define SSystemGlobalEnvironment 0x1BC0858 Код #define InGameFramework 0x191B894 #define Smoke 0xC83034 #define Player 0xC86F71 #define World 0xC86F1E #define Lighting 0xA5112E #define SSystemGlobalEnvironment 0x1BC0858 Если перестает работать, нужно обновлять переменные, адреса, добавлять код. ---------------------------------------------------------------------------------------------------------------------------------- ВНИМАНИЕ!!! За все читы банят! Не важно, приват это или паблик, рано или поздно вас могут забанить. Также могут дать бан по HWID.
Обновленный на 28.03.18 Player: 0x571391 Smoke: 0x56D454 Lighting: 0xD8F5B5 World: 0x57133E Код Player: 0x571391 Smoke: 0x56D454 Lighting: 0xD8F5B5 World: 0x57133E
Делаем невидимого противника (который находится за стеной) другим цветом: if (ReturnAddress == (void*)Player && bChams) { Device->SetRenderState(D3DRS_ZENABLE, FALSE); Device->SetTexture(0, OTHER_COLOR_HERE); //*другой цвет тут* Original_DrawIndexedPrimitive(Device, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount); Device->SetRenderState(D3DRS_ZENABLE, TRUE); Device->SetTexture(0, texRed); } Код if (ReturnAddress == (void*)Player && bChams) { Device->SetRenderState(D3DRS_ZENABLE, FALSE); Device->SetTexture(0, OTHER_COLOR_HERE); //*другой цвет тут* Original_DrawIndexedPrimitive(Device, PrimType, BaseVertexIndex, MinVertexIndex, NumVertices, startIndex, primCount); Device->SetRenderState(D3DRS_ZENABLE, TRUE); Device->SetTexture(0, texRed); }
Как обновлять сигнатуры? И вообще если это .dll то нужен инжектор так? И ещё записывается ли чит в процесс или память? Если да то как замусорить этот код?