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
}
;


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

  #2  
Старый 08.04.2019, 05:48
rraggerr
Познавший АНТИЧАТ
Регистрация: 16.03.2017
Сообщений: 1,626
С нами: 4821087

Репутация: 133


По умолчанию

Present:

C++:





Код:
typedef
HRESULT
(
WINAPI
*
_Present
)
(
IDirect3DDevice9
*
,
const
RECT
*
,
const
RECT
*
,
HWND
,
const
RGNDATA
*
)
;
//прототип
_Present oPresent
;
//экземпляр прототипа, для возврата оригинала
HRESULT WINAPI
hooked_Present
(
IDirect3DDevice9
*
pDevice
,
const
RECT
*
pSourceRect
,
const
RECT
*
pDestRect
,
HWND hdest
,
const
RGNDATA
*
pDirtyRegion
)
{
return
oPresent
(
pDevice
,
pSourceRect
,
pDestRect
,
hdest
,
RGNDATA
,
pDirtyRegion
)
;
// возврат оригинала
}
oPresent
=
(
_Present
)
vmtHooks
->
Hook
(
17
,
(
void
*
)
hooked_Present
)
;
 
Ответить с цитированием

  #3  
Старый 08.04.2019, 06:46
deropleat
Участник форума
Регистрация: 16.03.2017
Сообщений: 105
С нами: 4821087

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

Немного другой хук, который не требует очистки девайса под итог.

VMTHook.h

C++:





Код:
#pragma once
#include 
#include 
#include 
#include 
class
VMTHook
{
private
:
std
::
uintptr_t
*
*
BaseClass
=
nullptr
;
std
::
unique_ptr

CurrentVTF
=
nullptr
;
std
::
uintptr_t
*
OriginalVTF
=
nullptr
;
std
::
size_t TotalFuncs
=
0
;
public
:
VMTHook
(
void
)
=
default
;
VMTHook
(
void
*
BaseClass
)
{
this
->
BaseClass
=
static_cast

(
BaseClass
)
;
while
(
static_cast

(
*
this
->
BaseClass
)
[
this
->
TotalFuncs
]
)
++
this
->
TotalFuncs
;
const
std
::
size_t TableSize
=
this
->
TotalFuncs
*
sizeof
(
std
::
uintptr_t
)
;
this
->
OriginalVTF
=
*
this
->
BaseClass
;
this
->
CurrentVTF
=
std
::
make_unique

(
this
->
TotalFuncs
)
;
std
::
memcpy
(
this
->
CurrentVTF
.
get
(
)
,
this
->
OriginalVTF
,
TableSize
)
;
*
this
->
BaseClass
=
this
->
CurrentVTF
.
get
(
)
;
}
;
~
VMTHook
(
)
{
*
this
->
BaseClass
=
this
->
OriginalVTF
;
}
;
template

inline
const
Fn
GetOrigIndex
(
std
::
size_t FunctionIndex
)
{
return
reinterpret_cast

(
this
->
OriginalVTF
[
FunctionIndex
]
)
;
}
inline
bool
TableIndexHook
(
void
*
new_function
,
const
std
::
size_t FunctionIndex
)
{
if
(
FunctionIndex
>
this
->
TotalFuncs
)
return
false
;
this
->
CurrentVTF
[
FunctionIndex
]
=
reinterpret_cast

(
new_function
)
;
return
true
;
}
inline
bool
TableIndexUnHook
(
const
std
::
size_t FunctionIndex
)
{
if
(
FunctionIndex
>
this
->
TotalFuncs
)
return
false
;
this
->
CurrentVTF
[
FunctionIndex
]
=
this
->
OriginalVTF
[
FunctionIndex
]
;
return
true
;
}
inline
std
::
size_t
GetMaxIndex
(
)
{
return
this
->
TotalFuncs
;
}
}
;


Hooks.cpp

C++:





Код:
using
PresentFn
=
long
(
__stdcall
*
)
(
IDirect3DDevice9
*
,
const
RECT
*
,
const
RECT
*
,
HWND
,
const
RGNDATA
*
)
;
long
__stdcall g_pHooks
::
Present
(
IDirect3DDevice9
*
pDevice
,
const
RECT
*
pSourceRect
,
const
RECT
*
pDestRect
,
HWND hDestWindowOverride
,
const
RGNDATA
*
pDirtyRegion
)
{
static
auto
OriginalFunc
=
MyDevice
->
GetOrigIndex

(
17
)
;
if
(
!
init
)
g_pRender
->
Init
(
pDevice
,
init
)
;
g_pRender
->
PaintBegin
(
)
;
g_pRender
->
SizeReset
(
)
;
pDevice
->
SetRenderState
(
D3DRS_SRGBWRITEENABLE
,
false
)
;
g_pMenu
->
MyDevice
=
pDevice
;
g_pMenu
->
Update
(
)
;
return
OriginalFunc
(
pDevice
,
pSourceRect
,
pDestRect
,
hDestWindowOverride
,
pDirtyRegion
)
;
}


Render.cpp

C++:





Код:
void
CRender
::
Line
(
int
sX
,
int
sY
,
int
eX
,
int
eY
,
D3DCOLOR D3DCOLOR
)
{
vertex pVertex
[
2
]
=
{
{
sX
,
sY
,
0.0f
,
1.0f
,
D3DCOLOR
}
,
{
eX
,
eY
,
0.0f
,
1.0f
,
D3DCOLOR
}
}
;
MyDevice
->
SetRenderState
(
D3DRS_LIGHTING
,
FALSE
)
;
MyDevice
->
SetRenderState
(
D3DRS_ZENABLE
,
D3DZB_FALSE
)
;
MyDevice
->
SetRenderState
(
D3DRS_FOGENABLE
,
FALSE
)
;
MyDevice
->
SetRenderState
(
D3DRS_CULLMODE
,
D3DCULL_NONE
)
;
MyDevice
->
SetRenderState
(
D3DRS_ALPHABLENDENABLE
,
TRUE
)
;
MyDevice
->
SetRenderState
(
D3DRS_SRCBLEND
,
D3DBLEND_SRCALPHA
)
;
MyDevice
->
SetRenderState
(
D3DRS_DESTBLEND
,
D3DBLEND_INVSRCALPHA
)
;
MyDevice
->
SetRenderState
(
D3DRS_LIGHTING
,
FALSE
)
;
MyDevice
->
SetRenderState
(
D3DRS_STENCILENABLE
,
FALSE
)
;
MyDevice
->
SetTexture
(
0
,
NULL
)
;
MyDevice
->
SetPixelShader
(
NULL
)
;
MyDevice
->
SetFVF
(
D3DFVF_XYZRHW
|
D3DFVF_DIFFUSE
|
D3DFVF_TEX1
)
;
MyDevice
->
DrawPrimitiveUP
(
D3DPT_LINELIST
,
1
,
&
pVertex
,
sizeof
(
vertex
)
)
;
}


48BRHEEGO_4.jpgderopleat · 8 Апр 2019 в 05:46' data-fancybox="lb-post-323608" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fpp.userapi.com%2Fc85 0524%2Fv850524518%2Ff4913%2F48BRHEEGO_4.jpg&hash=8 7c49eff87663a7fd396f76b793a072a" style="cursor: pointer;" title="48BRHEEGO_4.jpg">
 
Ответить с цитированием

  #4  
Старый 15.02.2020, 14:14
Musaigen
Познавший АНТИЧАТ
Регистрация: 01.04.2018
Сообщений: 1,710
С нами: 4272230

Репутация: 183


По умолчанию

Цитата:
Сообщение от Mozze.cpp  

Без MoonLoader'a не работает :/
Делай как в собейте, через прокси-либу.
 
Ответить с цитированием

  #5  
Старый 26.04.2020, 00:35
loganhackerdff
Постоянный
Регистрация: 24.07.2017
Сообщений: 867
С нами: 4633764

Репутация: 148


По умолчанию

Если я сделаю через хук, на фрапсе будет видно? дарк говорит что если хукать то не будет
 
Ответить с цитированием

  #6  
Старый 26.04.2020, 00:45
BASS_DEVSOFTWARE
Участник форума
Регистрация: 29.04.2017
Сообщений: 263
С нами: 4757761

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

Цитата:
Сообщение от loganhackerdff  

Если я сделаю через хук, на фрапсе будет видно? дарк говорит что если хукать то не будет
Нах тогда спрашивать?
 
Ответить с цитированием

  #7  
Старый 26.04.2020, 01:06
loganhackerdff
Постоянный
Регистрация: 24.07.2017
Сообщений: 867
С нами: 4633764

Репутация: 148


По умолчанию

Цитата:
Сообщение от BASS_DEVSOFTWARE  

Нах тогда спрашивать?
А вдруг он не шарит
 
Ответить с цитированием

  #8  
Старый 21.05.2020, 20:45
deropleat
Участник форума
Регистрация: 16.03.2017
Сообщений: 105
С нами: 4821087

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

Цитата:
Сообщение от MrDMT  

Немного другой хук, который не требует очистки девайса под итог.

VMTHook.h

C++:





Код:
#pragma once
#include 
#include 
#include 
#include 
class
VMTHook
{
private
:
std
::
uintptr_t
*
*
BaseClass
=
nullptr
;
std
::
unique_ptr

CurrentVTF
=
nullptr
;
std
::
uintptr_t
*
OriginalVTF
=
nullptr
;
std
::
size_t TotalFuncs
=
0
;
public
:
VMTHook
(
void
)
=
default
;
VMTHook
(
void
*
BaseClass
)
{
this
->
BaseClass
=
static_cast

(
BaseClass
)
;
while
(
static_cast

(
*
this
->
BaseClass
)
[
this
->
TotalFuncs
]
)
++
this
->
TotalFuncs
;
const
std
::
size_t TableSize
=
this
->
TotalFuncs
*
sizeof
(
std
::
uintptr_t
)
;
this
->
OriginalVTF
=
*
this
->
BaseClass
;
this
->
CurrentVTF
=
std
::
make_unique

(
this
->
TotalFuncs
)
;
std
::
memcpy
(
this
->
CurrentVTF
.
get
(
)
,
this
->
OriginalVTF
,
TableSize
)
;
*
this
->
BaseClass
=
this
->
CurrentVTF
.
get
(
)
;
}
;
~
VMTHook
(
)
{
*
this
->
BaseClass
=
this
->
OriginalVTF
;
}
;
template

inline
const
Fn
GetOrigIndex
(
std
::
size_t FunctionIndex
)
{
return
reinterpret_cast

(
this
->
OriginalVTF
[
FunctionIndex
]
)
;
}
inline
bool
TableIndexHook
(
void
*
new_function
,
const
std
::
size_t FunctionIndex
)
{
if
(
FunctionIndex
>
this
->
TotalFuncs
)
return
false
;
this
->
CurrentVTF
[
FunctionIndex
]
=
reinterpret_cast

(
new_function
)
;
return
true
;
}
inline
bool
TableIndexUnHook
(
const
std
::
size_t FunctionIndex
)
{
if
(
FunctionIndex
>
this
->
TotalFuncs
)
return
false
;
this
->
CurrentVTF
[
FunctionIndex
]
=
this
->
OriginalVTF
[
FunctionIndex
]
;
return
true
;
}
inline
std
::
size_t
GetMaxIndex
(
)
{
return
this
->
TotalFuncs
;
}
}
;


Hooks.cpp

C++:





Код:
using
PresentFn
=
long
(
__stdcall
*
)
(
IDirect3DDevice9
*
,
const
RECT
*
,
const
RECT
*
,
HWND
,
const
RGNDATA
*
)
;
long
__stdcall g_pHooks
::
Present
(
IDirect3DDevice9
*
pDevice
,
const
RECT
*
pSourceRect
,
const
RECT
*
pDestRect
,
HWND hDestWindowOverride
,
const
RGNDATA
*
pDirtyRegion
)
{
static
auto
OriginalFunc
=
MyDevice
->
GetOrigIndex

(
17
)
;
if
(
!
init
)
g_pRender
->
Init
(
pDevice
,
init
)
;
g_pRender
->
PaintBegin
(
)
;
g_pRender
->
SizeReset
(
)
;
pDevice
->
SetRenderState
(
D3DRS_SRGBWRITEENABLE
,
false
)
;
g_pMenu
->
MyDevice
=
pDevice
;
g_pMenu
->
Update
(
)
;
return
OriginalFunc
(
pDevice
,
pSourceRect
,
pDestRect
,
hDestWindowOverride
,
pDirtyRegion
)
;
}


Render.cpp

C++:





Код:
void
CRender
::
Line
(
int
sX
,
int
sY
,
int
eX
,
int
eY
,
D3DCOLOR D3DCOLOR
)
{
vertex pVertex
[
2
]
=
{
{
sX
,
sY
,
0.0f
,
1.0f
,
D3DCOLOR
}
,
{
eX
,
eY
,
0.0f
,
1.0f
,
D3DCOLOR
}
}
;
MyDevice
->
SetRenderState
(
D3DRS_LIGHTING
,
FALSE
)
;
MyDevice
->
SetRenderState
(
D3DRS_ZENABLE
,
D3DZB_FALSE
)
;
MyDevice
->
SetRenderState
(
D3DRS_FOGENABLE
,
FALSE
)
;
MyDevice
->
SetRenderState
(
D3DRS_CULLMODE
,
D3DCULL_NONE
)
;
MyDevice
->
SetRenderState
(
D3DRS_ALPHABLENDENABLE
,
TRUE
)
;
MyDevice
->
SetRenderState
(
D3DRS_SRCBLEND
,
D3DBLEND_SRCALPHA
)
;
MyDevice
->
SetRenderState
(
D3DRS_DESTBLEND
,
D3DBLEND_INVSRCALPHA
)
;
MyDevice
->
SetRenderState
(
D3DRS_LIGHTING
,
FALSE
)
;
MyDevice
->
SetRenderState
(
D3DRS_STENCILENABLE
,
FALSE
)
;
MyDevice
->
SetTexture
(
0
,
NULL
)
;
MyDevice
->
SetPixelShader
(
NULL
)
;
MyDevice
->
SetFVF
(
D3DFVF_XYZRHW
|
D3DFVF_DIFFUSE
|
D3DFVF_TEX1
)
;
MyDevice
->
DrawPrimitiveUP
(
D3DPT_LINELIST
,
1
,
&
pVertex
,
sizeof
(
vertex
)
)
;
}



Решил недавно возобновить свой проект этого рода и стокнулся как раз с проблемой которая изображена на скриншоте - меню рисуется под чатом. Возможно то, что большинство в курсе решения данной проблемы, но все-таки считаю нужным поделиться, мало ли.

Эта проблема возникает исключительно в том случае, если меню было внедрено в игру после прохождения загрузочного окна GTA. Если внедрить в момент самой загрузки, то подобного бага не будет.

Цитата:
Сообщение от loganhackerdff  

Если я сделаю через хук, на фрапсе будет видно? дарк говорит что если хукать то не будет
Насколько я знаю, то это зависит от того, что ты будешь хукать.
  • EndScene - не обходит OBS.
  • Present - обходит OBS.
Однако оба хука будут видны на скриншотах. Не проверял на самом деле подлинность информации, но в некоторых играх это действительно так, и думаю, что гташка - не исключение.

Цитата:
Сообщение от Mozze.cpp  

Без MoonLoader'a не работает :/
Если в чите присутствуют функции связанные с данной библиотекой - тогда все ясно. Если же ты говоришь конкретно про меню (чистое, без любого СДК) - то такого быть не может. Рисуя подобным образом ты используешь лишь стандартный набор функций директа, которые автоматически доступны за счет использования d3d9 игрой.

И если ты используешь данную библиотеку, то лучше откажись от неё. Для подобного рода читов более уместно будет использовать СДК от собейта. Однако, все зависит от того, какую цель ты ставишь на свой проект. Выпустить чит независящий от чего-либо (СДК собейта) или же аналог каким-то асишкам, сфшкам итп (с СФ, МЛ).
 
Ответить с цитированием

  #9  
Старый 28.06.2020, 02:28
testuser
Новичок
Регистрация: 13.09.2005
Сообщений: 2
С нами: 10872326

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

Крашит при выгрузке плагина / выходе из игры. Как пофиксить?
 
Ответить с цитированием

  #10  
Старый 18.12.2022, 14:22
vmprotect
Постоянный
Регистрация: 15.09.2021
Сообщений: 396
С нами: 2453766

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

cef интерфейс можно вывести через хук ?
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.