HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 07.04.2019, 23:56
CleanLegend
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами: 6908018

Репутация: 213
По умолчанию

Привет. Сегодня разберем как хукать d3d9 для рисования квадратов или своего меню.​

Что нам нужно хукануть для полноценного рисования?

- Present/EndScene (Вывод на экран информации)

- Reset (Перезагрузка интерфейса)

Подключаем заголовки:

C++:





Код:
#include 
#include 
#include 
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")


Создаем прототип и экземпляр:

C++:





Код:
typedef
HRESULT
(
WINAPI
*
_EndScene
)
(
IDirect3DDevice9
*
)
;
//прототип
_EndScene oEndScene
;
//экземпляр прототипа, для возврата оригинала
typedef
HRESULT
(
WINAPI
*
_Reset
)
(
IDirect3DDevice9
*
,
D3DPRESENT_PARAMETERS
*
)
;
_Reset oReset
;


Функции подмены:

C++:





Код:
HRESULT WINAPI
myEndScene
(
IDirect3DDevice9
*
m_pDevice
)
{
return
oEndScene
(
m_pDevice
)
;
// возврат оригинала
}
HRESULT WINAPI
myReset
(
IDirect3DDevice9
*
m_pDevice
,
D3DPRESENT_PARAMETERS
*
pPresentationParameters
)
{
auto
result
=
oReset
(
m_pDevice
,
pPresentationParameters
)
;
return
result
;
}


Функция хука:

C++:





Код:
void
InitHook
(
)
{
void
*
*
vTableDevice
=
*
(
void
*
*
*
)
(
*
(
DWORD
*
)
0xC97C28
)
;
// адрес Device
VMTHookManager
*
vmtHooks
=
new
VMTHookManager
(
vTableDevice
)
;
oEndScene
=
(
_EndScene
)
vmtHooks
->
Hook
(
42
,
(
void
*
)
myEndScene
)
;
// 42 - номер EndScene
oReset
=
(
_Reset
)
vmtHooks
->
Hook
(
16
,
(
void
*
)
myReset
)
;
// 16 - номер Reset
}


В точке входа создаем поток и в нем вызываем хук:

C++:





Код:
int
WINAPI
Thread
(
)
{
while
(
*
(
DWORD
*
)
0xC8D4C0
!=
9
)
// проверка на статус загрузки игры
Sleep
(
100
)
;
InitHook
(
)
;
return
0
;
}
BOOL WINAPI
DllMain
(
HMODULE hModule
,
DWORD dwReason
,
LPVOID lpReserved
)
{
if
(
dwReason
==
DLL_PROCESS_ATTACH
)
CreateThread
(
NULL
,
NULL
,
(
LPTHREAD_START_ROUTINE
)
Thread
,
NULL
,
NULL
,
NULL
)
;
return
TRUE
;
}


Пример для тестирования:

C++:





Код:
void
DrawRect
(
LPDIRECT3DDEVICE9 m_pDevice
,
int
X
,
int
Y
,
int
L
,
int
H
,
D3DCOLOR color
)
{
D3DRECT rect
=
{
X
,
Y
,
X
+
L
,
Y
+
H
}
;
m_pDevice
->
Clear
(
1
,
&
rect
,
D3DCLEAR_TARGET
,
color
,
0
,
0
)
;
}
HRESULT WINAPI
myEndScene
(
IDirect3DDevice9
*
m_pDevice
)
{
DrawRect
(
m_pDevice
,
250
,
250
,
10
,
10
,
0xFFFF0000
)
;
return
oEndScene
(
m_pDevice
)
;
}


Получаем:



Класс VMTHookManager

Цитата:
Сообщение от Спойлер  


C++:





[CODE]
VMTHookManager
::
VMTHookManager
(
void
*
*
vTable
)
:
m_vTable
(
vTable
)
{
m_numberFuncs
=
GetNumberOfFunctions
(
)
;
//getting the number of virtual functions
m_originalFuncs
=
new
void
*
[
m_numberFuncs
]
;
// allocating memory so we can save here the addresses of the original functions
for
(
unsigned
short
i
=
0
;
i

(
bufferOriginalFunc
)
;
//worked, return the original address
}
bool
VMTHookManager
::
Unhook
(
unsigned
short
index
)
{
if
(
!
toHook
(
index
)
)
// checking if it failed
{
return
false
;
// return false, didn't work
}
return
true
;
// return true, worked
}
void
VMTHookManager
::
UnhookAll
(
)
{
for
(
int
index
=
0
;
index



Цитата:
Сообщение от Спойлер  


C++:





Код:
class
VMTHookManager
{
public
:
VMTHookManager
(
void
*
*
vTable
)
;
//constructor
~
VMTHookManager
(
)
;
//destructor
void
*
GetFunctionAddyByIndex
(
unsigned
short
index
)
;
// getting the address of a function in the vtable by index
void
*
Hook
(
unsigned
short
index
,
void
*
ourFunction
)
;
// hooking the virtual function by index
bool
Unhook
(
unsigned
short
index
)
;
// unhooking the virtual function by index
void
UnhookAll
(
)
;
//unhook all the functions
private
:
//member variables
void
*
*
m_vTable
;
// the vtable of some object
unsigned
short
m_numberFuncs
;
// number of virtual functions
void
*
*
m_originalFuncs
=
nullptr
;
// we'll save the original addresses here
unsigned
short
GetNumberOfFunctions
(
)
;
//get the number of virtual functions
bool
toHook
(
unsigned
short
index
,
bool
hook
=
false
,
void
*
ourFunction
=
nullptr
,
uintptr_t
*
bufferOriginalFunc
=
nullptr
)
;
//function used to hook/unhook
}
;


 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


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




ANTICHAT ™ © 2001- Antichat Kft.