
07.04.2019, 23:56
|
|
Постоянный
Регистрация: 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)
|
|
|
|