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

Ответ
 
Опции темы
Старый 15.12.2015, 17:46   #1
 Разведчик
Аватар для cloc
 
cloc никому не известный тип
Регистрация: 12.07.2014
Сообщений: 6
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для cloc с помощью Skype™
 
По умолчанию Создаем свое меню с самого начала.Tutorial.

Всем привет в этой теме я буду выкладывать уроки по созданию своей собственной менюшки. Быдло кодингом будет пахнуть(без него не как).Дополнять буду по мере свободного времени. Поехали. Для начало создадим новый проект, и назовем его. Далее натстроеваем как показано на рисунке.[Ссылки могут видеть только зарегистрированные пользователи. ]
Создаем новый фаил называем его как хотим(Я назвал Main).
Определяем в нём библиотеку:
Код:
#include <Windows.h>
Определяем библиотеку дереикс:
Код:
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9core.h>
#include "d3dx9math.inl"
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
Определяем переменные :
Код:
bool Create;
typedef HRESULT(WINAPI* oEndScene)(LPDIRECT3DDEVICE9 pDevice);
oEndScene pEndScene;
Добавляем главную точку входа:
Код:
BOOL WINAPI DllMain(HMODULE hDll, DWORD dwReason, LPVOID lpReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
	}
	return TRUE;
}
Чуть выше точки входа определяем End Scene(Именно здесь всё и будет на данный момент)
Код:
HRESULT APIENTRY myEndScene(LPDIRECT3DDEVICE9 pDevice)
{
}
Теперь самое главное это Хук, он у нас будет для Win7 Win8 Win10(Сам 10 пользуюсь).
Для начало настроим проект. Кликаем по проекту->свойства, делаем всё как у меня:[Ссылки могут видеть только зарегистрированные пользователи. ]
Делаем так что бы SDK больше не надо было каждый раз подключать:
Для начала скачаем его Вот для [Ссылки могут видеть только зарегистрированные пользователи. ] и для [Ссылки могут видеть только зарегистрированные пользователи. ].
Переходим в папку с Visual Studio а кидаем из архива в папку под названием VS, подтверждаем слияние. Вот рисунок:[Ссылки могут видеть только зарегистрированные пользователи. ]
Возвращаемся обратно в проект и выбираем вот это:[Ссылки могут видеть только зарегистрированные пользователи. ].
Добавляем к этой строчке:
Код:
oEndScene pEndScene;
код:
Код:
typedef IDirect3D9* (__stdcall *DIRECT3DCREATE9)(unsigned int);
DWORD dwEndScene;
BYTE CodeFragmentES[5] = { 0, 0, 0, 0, 0 };
BYTE jmpbES[5] = { 0, 0, 0, 0, 0 };
DWORD dwOldProtectES = 0;
Теперь ниже EndScene определяем функции Хука:
Код:
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));
	dwEndScene = vtablePtr[42] - (DWORD)hD3D9;
	d3dDevice->Release();
	d3d->Release();
	FreeLibrary(hD3D9);
	CloseHandle(hWnd);
}

PVOID D3Ddiscover(void *tbl, int size)
{
	HWND				  hWnd;
	void				  *pInterface = 0;
	D3DPRESENT_PARAMETERS d3dpp;

	if ((hWnd = CreateWindowEx(NULL, WC_DIALOG, "", WS_OVERLAPPED, 0, 0, 50, 50, NULL, NULL, NULL, NULL)) == NULL) return 0;
	ShowWindow(hWnd, SW_HIDE);

	LPDIRECT3D9			pD3D;
	LPDIRECT3DDEVICE9	pD3Ddev;
	if ((pD3D = Direct3DCreate9(D3D_SDK_VERSION)) != NULL)

	{
		ZeroMemory(&d3dpp, sizeof(d3dpp));
		d3dpp.Windowed = TRUE;
		d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
		d3dpp.hDeviceWindow = hWnd;
		d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
		d3dpp.BackBufferWidth = d3dpp.BackBufferHeight = 600;
		pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pD3Ddev);
		if (pD3Ddev) {
			pInterface = (PDWORD)*(DWORD *)pD3Ddev;
			memcpy(tbl, (void *)pInterface, size);
			pD3Ddev->Release();
		}
		pD3D->Release();
	}
	DestroyWindow(hWnd);
	return pInterface;
}
void HookDevice9Methods()
{
	DWORD		vTable[105];
	HMODULE hD3D9 = GetModuleHandle("d3d9.dll");
	pEndScene = (oEndScene)((DWORD)hD3D9 + dwEndScene);
	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, &dwOldProtectES);
	if (D3Ddiscover((void *)&vTable[0], 420) == 0) return;
	{
		Sleep(100);
	}
	memcpy(pEndScene, jmpbES, 5);
}
Ниже определяем функцию и переменную:
Код:
bool hooked = false;
HRESULT WINAPI Hook()
{
	if (hooked == false)
	{
		GetDevice9Methods();
		HookDevice9Methods();
		hooked = true;
	}
	return 0;
}
С помощью неё мы будем запускать хук и вырубать поток.
Теперь запустим поток в точке входа.
Код:
	if (dwReason == DLL_PROCESS_ATTACH)
	{CreateThread(0,0,(LPTHREAD_START_ROUTINE)Hook,0,0,0);}
Что же, перейдём к самому главному.Ищем EndScene и в нем пишем:
Код:
	BYTE* CDES = (BYTE*)pEndScene;
	CDES[0] = CodeFragmentES[0];
	*((DWORD*)(CDES + 1)) = *((DWORD*)(CodeFragmentES + 1));
Теперь определим переменную которая будет инициализировать шрифт.Я сделал так [Ссылки могут видеть только зарегистрированные пользователи. ] Теперь проверяем если Init лож то инициализируем шрифт и делаем Init правдой:
Код:
	if (!Init)
	{
		Beep(100, 100);
		D3DXCreateFont(pDevice, 13, 0, FW_BLACK, 0, FALSE, DEFAULT_CHARSET, OUT_TT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Tahoma", &pFont);
		Init = true;
	}
[Ссылки могут видеть только зарегистрированные пользователи. ]
Теперь дабы теrст не исчезал при сворачивании приложения делаем вот:
Код:
	if (!pFont)
		pFont->OnLostDevice();
	else
	{
		pFont->OnLostDevice();
		pFont->OnResetDevice();
	}
Теперь добавим функцию текста String:
Код:
void __fastcall String(int x, int y, DWORD Color, DWORD Style, const char *Format, ...)
{
	RECT rect;
	SetRect(&rect, x, y, x, y);
	char Buffer[1024] = { '\0' };
	va_list va_alist;
	va_start(va_alist, Format);
	vsprintf_s(Buffer, Format, va_alist);
	va_end(va_alist);
	pFont->DrawTextA(NULL, Buffer, -1, &rect, Style, Color);
	return;
}
Написал я его выше EndScene, и для использования нам понадобиться ещё одна библиотека
Код:
#include <stdio.h>
X Положение по оси Х
Y Положение по оси Y
Color Цвет
Style Стиль
Format Текст

Теперь используем его в EndScene:
Код:
	if (!pFont)
		pFont->OnLostDevice();
	else
	{
		String(10, 10, D3DCOLOR_ARGB(255, 0, 255, 0), DT_LEFT | DT_NOCLIP, "Моя первая DLL, с ипользованием DirectX библиотек");
		pFont->OnLostDevice();
		pFont->OnResetDevice();
	}
И последний штрих в самом конце EndScene (перед скобкой) дописываем код :
Код:
	DWORD res = pEndScene(pDevice);
	CDES[0] = jmpbES[0];
	*((DWORD*)(CDES + 1)) = *((DWORD*)(jmpbES + 1));
	return res;
Вот и всё на сегодня, у меня получилось [Ссылки могут видеть только зарегистрированные пользователи. ]
Что бы использовать полученное DLL просто инжектируем в приложение использующие DirectX9. В следующем уроке мы разложим всё по полочкам, добавим новые функции. У каво что то не получилось пишем в коментарии, так же прошу людей знающих прокоментировать данный урок. Все ваши замечания я буду учитывать.Ставим :sps: :sps: :sps:
________________
Всегда рад новым знаниям
  Ответить с цитированием
Пользователь сказал cпасибо:
vadyash (10.01.2016)
Старый 05.01.2016, 01:13   #2
 Разведчик
Аватар для MasterDessan
 
MasterDessan никому не известный тип
Регистрация: 04.01.2010
Сообщений: 6
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создаем свое меню с самого начала.Tutorial.

Я извиняюсь, а к чему это, что это должно делать и как и где это использовать?
  Ответить с цитированием
Старый 10.01.2016, 00:04   #3
 Разведчик
Аватар для Werk1
 
Werk1 никому не известный тип
Регистрация: 02.11.2015
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создаем свое меню с самого начала.Tutorial.

Хороший туториал, спасибо.
  Ответить с цитированием
Старый 23.01.2016, 01:00   #4
 Разведчик
Аватар для cloc
 
cloc никому не известный тип
Регистрация: 12.07.2014
Сообщений: 6
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Отправить сообщение для cloc с помощью Skype™
 
По умолчанию Re: Создаем свое меню с самого начала.Tutorial.

Цитата:
Сообщение от MasterDessanПосмотреть сообщение
Я извиняюсь, а к чему это, что это должно делать и как и где это использовать?

Это к тому, что бы люди учились директиксу9. Использовать нужно в Visual Studio
________________
Всегда рад новым знаниям

Последний раз редактировалось MembRupt; 24.01.2016 в 11:48.
  Ответить с цитированием
Старый 06.02.2016, 14:41   #5
 Разведчик
Аватар для GrandLeak
 
GrandLeak никому не известный тип
Регистрация: 06.02.2016
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создаем свое меню с самого начала.Tutorial.

А можешь дополнить хуком под DirectX 11?
  Ответить с цитированием
Старый 14.05.2016, 00:15   #6
 Разведчик
Аватар для pro77cheat
 
pro77cheat никому не известный тип
Регистрация: 13.05.2016
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создаем свое меню с самого начала.Tutorial.

Куча ошибок при сборе проекта. Ругается на pFont
  Ответить с цитированием
Старый 02.07.2017, 08:27   #7
 Разведчик
Аватар для Silckat
 
Silckat никому не известный тип
Регистрация: 01.07.2017
Сообщений: 1
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Создаем свое меню с самого начала.Tutorial.

Код:
void __fastcall String(int x, int y, DWORD Color, DWORD Style, const char *Format, ...)
{
    RECT rect;
    SetRect(&rect, x, y, x, y);
    char Buffer[1024] = {'\0'};
    va_list va_alist;
    va_start(va_alist, Format);
    vsprintf_s(Buffer, Format, va_alist);
    va_end(va_alist);
    pFont -> DrawTextA(NULL, Buffer, -1, &rect, Style, Color);
    return;
}
MVS 2012 Ultimate ругается на pFont. Error: идентификатор "pFont" не определен. И еще в двух местах
  Ответить с цитированием
Ответ


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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
The War Z потерял свое имя NewsMaster Игровые новости, анонсы и обзоры 3 27.12.2012 23:58

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

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

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