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

Помогите с хуком DirectX


KIllerrr

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

Привет всем. Многие знают, что я люблю D3D. Так вот сталкнулся с такой проблемой: Я использовал всегда хук Coder а, потому как он подходит как и к Win 7 так и Win10. Но теперь появилась проблема, разрабы пофиксили этот способ, и теперь при использовании данного хука аккаунт банят. Я нашел хук каторый работает методом перебора. Но ОН почему то не работает на Win8 и Win10. 
Подскажите как мне сделать нормальный хук? Ах да чуть не забыл, хук выполняет работу нахождения адреса устройства отображения, тем самым потом мы можем туда посылать свои запросы на рисовку.

Вот хук каторый работает везде, но за него банят: 

Скрытый текст

HRESULT APIENTRY myEndScene(LPDIRECT3DDEVICE9 pDevice)
{
	BYTE* CDES = (BYTE*)pEndScene;
	CDES[0] = CodeFragmentES[0];
	*((DWORD*)(CDES + 1)) = *((DWORD*)(CodeFragmentES + 1));
	gDevice = pDevice;// Определяем адрес устройства, и делаем его видемым для всех
	Start();//Запускаем поток рисовки и других функций взлома.
	DWORD res = pEndScene(pDevice);
	CDES[0] = jmpbES[0];
	*((DWORD*)(CDES + 1)) = *((DWORD*)(jmpbES + 1));
	return res;
}

void GetDevice9Methods()
{
	HWND hWnd = CreateWindowA("STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0);
	HMODULE hD3D9 = LoadLibrary("d3d9");
	DIRECT3DCREATE9 Direct3DCreate9 = (DIRECT3DCREATE9)GetProcAddress(hD3D9, "Direct3DCreate9");
	IDirect3D9* d3d = Direct3DCreate9(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));
	endscene = vtablePtr[42] - (DWORD)hD3D9;
	reset = vtablePtr[16] - (DWORD)hD3D9;
	d3dDevice->Release();
	d3d->Release();
	FreeLibrary(hD3D9);
	CloseHandle(hWnd);
}

void HookDevice9Methods()
{
	HMODULE hD3D9 = GetModuleHandle("d3d9.dll");
	///////////////////////////////////////////////////////////
	pEndScene = (oEndScene)((DWORD)hD3D9 + endscene);
	jmpbES[0] = 0xE9;
	DWORD addr = (DWORD)myEndScene - (DWORD)pEndScene - 5;
	memcpy(jmpbES + 1, &addr, sizeof(DWORD));
	memcpy(CodeFragmentES, pEndScene, 5);
	VirtualProtect(pEndScene, 8, PAGE_EXECUTE_READWRITE, &oldprotectES);
	memcpy(pEndScene, jmpbES, 5);
	////////////////////////////////////////////////////////////
}

HRESULT APIENTRY Hook()
{
	GetDevice9Methods();
	HookDevice9Methods();
	return 0;
}

 

Вот хук каторый не работает на 8 и 10, но за него я так понял не бананят:

Скрытый текст

PDWORD FindDeviceInterfaceObject(HMODULE hD3D9)
{
	PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hD3D9;
	if (dosHeader->e_magic == IMAGE_DOS_SIGNATURE)
	{
		PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + dosHeader->e_lfanew);
		if (ntHeaders->Signature == IMAGE_NT_SIGNATURE)
		{
			DWORD NumberOfSections = ntHeaders->FileHeader.NumberOfSections;
			PIMAGE_SECTION_HEADER SectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)dosHeader + dosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS));
			for (unsigned int i = 0; i < NumberOfSections; i++)
			if (strncmp((const char *)SectionHeader[i].Name, ".text", 5) == 0)
			{
				DWORD dwFrom = (DWORD)dosHeader + SectionHeader[i].VirtualAddress;
				DWORD dwTo = dwFrom + SectionHeader[i].Misc.VirtualSize;

				//C7 06 ?? ?? ?? ?? 89 86 ?? ?? ?? ?? 89 86
				for (unsigned int i = dwFrom; i < dwTo; i++) {
					if (*(WORD*)(i) == 0x06C7)
					if (*(WORD*)(i + 2 + 4) == 0x8689)
					if (*(WORD*)(i + 2 + 4 + 2 + 4) == 0x8689)
						return *(PDWORD*)(i + 2);
				}
			}
		}
	}
	return NULL;
}
int HookpDevice(void)
{
	PDWORD pdwDeviceInterfaceObject = FindDeviceInterfaceObject(LoadLibraryA("D3D9.dll"));
	if (pdwDeviceInterfaceObject != NULL)
	{
		pEndScene = (oEndScene)Memory->DetourCreate((PBYTE)pdwDeviceInterfaceObject[42], (PBYTE)myEndScene, 5);
	}
	return 0;
}

 

Предлагайте свои варианты.

 

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

SetWindowHookEx палят сразу же античиты. Если делать беспалевный чит - это нужен инжектор с затиранием следов инжекта. У Кодера есть такой урок, где он делал инжектор такой.

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

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

2 вариант. ну и чем оно отличается от GetModuleHandle+поиск паттрена... сомнительно.

кст а если хук ендсцене поставить в коде игры (перед переходом в d3d9)? или там проверка на патчкод?

 

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

9 часов назад, gmz сказал:

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

2 вариант. ну и чем оно отличается от GetModuleHandle+поиск паттрена... сомнительно.

кст а если хук ендсцене поставить в коде игры (перед переходом в d3d9)? или там проверка на патчкод?

 

Я так понимаю, можно использовать рендер игры ? 

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

13 часа назад, Xipho сказал:

SetWindowHookEx палят сразу же античиты. Если делать беспалевный чит - это нужен инжектор с затиранием следов инжекта. У Кодера есть такой урок, где он делал инжектор такой.

Урок это просто тема?Или у него в ютубе есть ?

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

15 час назад, KIllerrr сказал:

Я так понимаю, можно использовать рендер игры ?

просто хук не в d3d9.dll а перед вызовом, на игровом коде.

...
MOV DWORD PTR [0CFBD10],EAX
MOV EAX,DWORD PTR [0D064A8]        << hook +device
MOV ECX,DWORD PTR [EAX]
MOV EDX,DWORD PTR [ECX+44]
PUSH EBX
PUSH EBX
PUSH EAX
CALL EDX    << EndScene

...

Изменено пользователем gmz
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

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

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