Регистрация Главная Пользователи Все разделы прочитаны
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 09.10.2015, 01:18   #1
 Разведчик
Аватар для hidemtu
 
hidemtu никому не известный тип
Регистрация: 07.10.2015
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию [C++]Создание универсальног Сhameleon WallHack на примере CS:GO

Данный метод может быть использован для любой игры.
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;

}
Вроде все, статья моя, можете задавать вопросы.
Код выдирал из своего чита (я мог выдернуть что-то лишнее), поэтому если компилятор будет выдавать какие-то ошибки, пишете, помогу. Играл в ММ с данным читом летом несколько раз. Вак бана не было.
  Ответить с цитированием
Старый 22.08.2016, 13:14   #2
 Разведчик
Аватар для NikitaPond
 
NikitaPond никому не известный тип
Регистрация: 03.06.2013
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: [C++]Создание универсальног Сhameleon WallHack на примере CS:GO

В какой среде писал?
  Ответить с цитированием
Старый 10.11.2016, 23:09   #3
Заблокирован
 Пехотинец
Аватар для ZFrost
 
ZFrost у всех на слухуZFrost у всех на слухуZFrost у всех на слухуZFrost у всех на слухуZFrost у всех на слухуZFrost у всех на слухуZFrost у всех на слухуZFrost у всех на слухуZFrost у всех на слухуZFrost у всех на слуху
Регистрация: 18.05.2013
Сообщений: 97
Популярность: 1374
Сказал(а) спасибо: 52
Поблагодарили 45 раз(а) в 31 сообщениях
 
По умолчанию Re: [C++]Создание универсальног Сhameleon WallHack на примере CS:GO

Исходники читов вещь хорошая, автору плюс. Но вот в одно время было море чит-программ сделанных по этим же основаниям, каждый чувак писал свой ник))
  Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Создание WallHack †HaNTeR† Общение и обсуждение, архив Point Blank 0 03.07.2011 03:24

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 17:47.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net