PDA

Просмотр полной версии : Крашит игру из-за DLL


qwertyrus
03.04.2024, 22:55
Переписать external cheat в internal для MTA оказалось труднее, чем я думал(инжект работает и не банит). Заранее извиняюсь если код выглядит плохо, только учусь. Крашит после инжекта, пробовал изменять функцию world_to_screen, крашит в if'ах(внутри функции). Помогите если не трудно

C++:






#include "pch.h"
#include
#include
#include
#include
#include
#include
std
::
vector

world_to_screen
(
std
::
vector
>
ViewMatrix1
,
float
x
,
float
y
,
float
z
)
{
std
::
vector

badcord
=
{
-
1
,
-
1
}
;
std
::
vector

result
(
2
)
;
float
screenz
=
(
z
*
ViewMatrix1
[
2
]
[
2
]
)
+
(
y
*
ViewMatrix1
[
1
]
[
2
]
)
+
(
x
*
ViewMatrix1
[
0
]
[
2
]
)
+
ViewMatrix1
[
3
]
[
2
]
;
if
(
screenz
=
screenx
&&
screenx
>=
0
&&
1080
>=
screeny
&&
screeny
>=
0
)
{
result
[
0
]
=
static_cast

(
screenx
)
;
result
[
1
]
=
static_cast

(
screeny
)
;
return
result
;
}
else
{
return
badcord
;
}
}
DWORD WINAPI
MainThread
(
HMODULE hModule
)
{
AllocConsole
(
)
;
system
(
"title First project"
)
;
FILE
*
f
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stdout
)
;
//printf("Test 1");
Sleep
(
200
)
;
DWORD offsetview
=
0xB6FA2C
;
bool
espstatus
=
false
;
DWORD
*
cped
=
(
DWORD
*
)
0xB6F5F0
;
float
*
myhealth
=
(
float
*
)
(
*
cped
+
0x540
)
;
float
*
myarmour
=
(
float
*
)
(
*
cped
+
0x548
)
;
DWORD
*
xyz
=
(
DWORD
*
)
(
*
cped
+
0x14
)
;
float
*
x
=
(
float
*
)
(
*
xyz
+
0x30
)
;
float
*
y
=
(
float
*
)
(
*
xyz
+
0x30
+
4
)
;
float
*
z
=
(
float
*
)
(
*
xyz
+
0x30
+
8
)
;
std
::
vector
>
ViewMatrix
(
4
,
std
::
vector

(
4
)
)
;
while
(
!
GetAsyncKeyState
(
VK_END
)
)
{
if
(
GetAsyncKeyState
(
VK_INSERT
)
)
{
espstatus
=
true
;
}
if
(
GetAsyncKeyState
(
VK_DELETE
)
)
{
espstatus
=
false
;
}
for
(
int
i
=
0
;
i
=
4.0f
)
{
DWORD
*
pointercoords
=
(
DWORD
*
)
(
cpedsearch
+
0x14
)
;
float
*
hisx
=
(
float
*
)
(
*
cpedsearch
+
0x30
)
;
float
*
hisy
=
(
float
*
)
(
*
cpedsearch
+
0x34
)
;
float
*
hisz
=
(
float
*
)
(
*
cpedsearch
+
0x38
)
;
std
::
vector

onscreen
=
world_to_screen
(
ViewMatrix
,
*
hisx
,
*
hisy
,
*
hisz
)
;
//далее будет рисование, но пока упустим
}
}
}
if
(
GetAsyncKeyState
(
VK_END
)
)
{
FreeConsole
(
)
;
fclose
(
f
)
;
}
FreeLibraryAndExitThread
(
hModule
,
0
)
;
return
0
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hModule
)
;
//disables attach and detach notifications
CloseHandle
(
CreateThread
(
nullptr
,
0
,
(
LPTHREAD_START_ROUTINE
)
MainThread
,
hModule
,
0
,
nullptr
)
)
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}

SobFoX;
04.04.2024, 00:26
MTA:SA Forks Anticheat Bypass (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cudW5rbm93bmNoZWF0cy5tZS9mb3J1bS9vdG hlci1mcHMtZ2FtZXMvNjI1MDM4LW10YS1zYS1mb3Jrcy1hbnRp Y2hlYXQtYnlwYXNzLmh0bWw)

Since dutchman101 provided a protection with full anticheat for forks, i think it`s a time to fun INFO: https://wiki.multitheftauto.com/wiki/Forks_Ful...

www.unknowncheats.me

qwertyrus
04.04.2024, 01:04
MTA:SA Forks Anticheat Bypass (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cudW5rbm93bmNoZWF0cy5tZS9mb3J1bS9vdG hlci1mcHMtZ2FtZXMvNjI1MDM4LW10YS1zYS1mb3Jrcy1hbnRp Y2hlYXQtYnlwYXNzLmh0bWw)

Since dutchman101 provided a protection with full anticheat for forks, i think it`s a time to fun INFO: https://wiki.multitheftauto.com/wiki/Forks_Ful...

www.unknowncheats.me



Спасибо конечно, но как это изменит краш из за функции вычисления координат на экране?

SobFoX;
04.04.2024, 08:50
Спасибо конечно, но как это изменит краш из за функции вычисления координат на экране?


Start by doing what I sent you, if you don't want to get a permanent ban from mta

qwertyrus
04.04.2024, 18:17
Start by doing what I sent you, if you don't want to get a permanent ban from mta


Скопировал данный код, выдает много ошибок, библиотеку minhook установил и добавил в проект.

upd ошибок осталось 4

Vintik
05.04.2024, 15:29
А если убрать 76 строку (

world_to_screen

) — крашит?

qwertyrus
05.04.2024, 15:34
А если убрать 76 строку (

world_to_screen

) — крашит?


Нет. Крашит только с ней. Без нее все ок, функция написана вроде правильно, потому что external работало, а щас переписав под интернал что-то пошло не так.

Vintik
05.04.2024, 15:58
C++:






for
(
int
i
=
1
;
i
=
4.0f
)
{
DWORD
*
pointercoords
=
(
DWORD
*
)
(
cpedsearch
+
0x14
)
;
float
*
hisx
=
(
float
*
)
(
*
cpedsearch
+
0x30
)
;
float
*
hisy
=
(
float
*
)
(
*
cpedsearch
+
0x34
)
;
float
*
hisz
=
(
float
*
)
(
*
cpedsearch
+
0x38
)
;
std
::
vector

onscreen
=
world_to_screen
(
ViewMatrix
,
*
hisx
,
*
hisy
,
*
hisz
)
;
}





Как минимум, ошибка заключается в том, что координаты неправильно считываются (

pointercoords

вместо

cpedsearch

).

C++:






float
*
hisx
=
(
float
*
)
(
*
pointercoords
+
0x30
)
;
float
*
hisy
=
(
float
*
)
(
*
pointercoords
+
0x34
)
;
float
*
hisz
=
(
float
*
)
(
*
pointercoords
+
0x38
)
;




И перебор игроков у тебя неверный. Вроде должно быть так:



0xB74490 - Содержит указатель на указатель. Этот указатель:

+0 = Содержит указатель на первый элемент в пуле CPed

+4 = Содержит указатель на карту байтов, которая обозначает, какие элементы используются в пуле CPed

+8 = [dword] Максимальное число элементов в пуле CPed

+12 = [dword] Текущее число элементов в пуле CPed

qwertyrus
05.04.2024, 16:31
Как минимум, ошибка заключается в том, что координаты неправильно считываются (

pointercoords

вместо

cpedsearch

).

C++:






float
*
hisx
=
(
float
*
)
(
*
pointercoords
+
0x30
)
;
float
*
hisy
=
(
float
*
)
(
*
pointercoords
+
0x34
)
;
float
*
hisz
=
(
float
*
)
(
*
pointercoords
+
0x38
)
;




И перебор игроков у тебя неверный. Вроде должно быть так:


Про поинтер, я видимо когда переписывал не заметил и не то вписал, а за перебор спасибо, проверю через некоторое время и отвечу, не можешь помочь с ошибками которые на скрине?

Vintik
05.04.2024, 16:43
Скопировал данный код, выдает много ошибок, библиотеку minhook установил и добавил в проект.
upd ошибок осталось 4


В исходном файле (который тебе скинули) действительно эти функции не определены. Может, там еще какая-нибудь зависимость...

@SobFoX; (https://www.blast.hk/members/60759/) what you can say about his issue? maybe there are other dependencies because i can't see defenition of this function in code and even in minhook source.

qwertyrus
05.04.2024, 16:44
В исходном файле (который тебе скинули) действительно эти функции не определены. Может, там еще какая-нибудь зависимость...
@SobFoX; (https://www.blast.hk/members/60759/) what you can say about his issue? maybe there are other dependencies because i can't see defenition of this function in code and even in minhook source.


я нашел определение w_findStringIC в другой статье по MTA, но не нашел LogInFile, те две я тоже нашел в интернете, а вот что с этой делать... может её убрать? а вдруг что-то не сработает...



В исходном файле (который тебе скинули) действительно эти функции не определены. Может, там еще какая-нибудь зависимость...
@SobFoX; (https://www.blast.hk/members/60759/) what you can say about his issue? maybe there are other dependencies because i can't see defenition of this function in code and even in minhook source.


Нашел у автора этого обхода(по ссылке которую давал SobFox на гитхабе такую реализацию, думаю затестирую:

C++:






void
__stdcall
LogInFile
(
std
::
string log_name
,
const
char
*
log
,
.
.
.
)
{
char
hack_dir
[
600
]
;
memset
(
hack_dir
,
0
,
sizeof
(
hack_dir
)
)
;
_getcwd
(
hack_dir
,
sizeof
(
hack_dir
)
)
;
char
new_dir
[
600
]
;
memset
(
new_dir
,
0
,
sizeof
(
new_dir
)
)
;
sprintf
(
new_dir
,
"%s\\%s"
,
hack_dir
,
log_name
.
c_str
(
)
)
;
static
bool
once
=
false
;
if
(
!
once
)
{
FILE
*
hFile
=
fopen
(
new_dir
,
"rb"
)
;
if
(
hFile
)
{
fclose
(
hFile
)
;
DeleteFileA
(
new_dir
)
;
}
once
=
true
;
}
FILE
*
hFile
=
fopen
(
new_dir
,
"a+"
)
;
if
(
hFile
)
{
time_t t
=
std
::
time
(
0
)
;
tm
*
now
=
std
::
localtime
(
&
t
)
;
char
tmp_stamp
[
600
]
;
memset
(
tmp_stamp
,
0
,
sizeof
(
tmp_stamp
)
)
;
sprintf
(
tmp_stamp
,
"[%d:%d:%d]"
,
now
->
tm_hour
,
now
->
tm_min
,
now
->
tm_sec
)
;
strcat
(
tmp_stamp
,
std
::
string
(
" "
+
std
::
string
(
log
)
)
.
c_str
(
)
)
;
va_list arglist
;
va_start
(
arglist
,
log
)
;
vfprintf
(
hFile
,
tmp_stamp
,
arglist
)
;
va_end
(
arglist
)
;
fclose
(
hFile
)
;
}
}

Vintik
05.04.2024, 16:55
может её убрать? а вдруг что-то не сработает...


Это просто логгирование в файл.

К обходу античита MTA это не имеет никакого отношения.

Можешь сделать заглушку:

C++:






void
LogInFile
(
char
*
,
.
.
.
)
{
return
;
}
void
LogInFile
(
const
char
*
,
.
.
.
)
{
return
;
}

qwertyrus
05.04.2024, 16:55
Это просто логгирование в файл.
К обходу античита MTA это не имеет никакого отношения.
Можешь сделать заглушку:

C++:






void
LogInFile
(
char
*
,
.
.
.
)
{
return
;
}
void
LogInFile
(
const
char
*
,
.
.
.
)
{
return
;
}





посмотри выше, я нашел фукнцию

Vintik
05.04.2024, 16:56
посмотри выше, я нашел фукнцию


Вижу, можешь и ту оставить. Но тебе вряд-ли нужен лог, ты ж туда даже смотреть не будешь.

А что касаемо самого обхода — мутный он какой-то. Не допилен до конца...

qwertyrus
05.04.2024, 16:59
Вижу, можешь и ту оставить. Но тебе вряд-ли нужен лог, ты ж туда даже смотреть не будешь.
А что касаемо самого обхода — мутный он какой-то. Не допилен до конца...


Я нашел статью по самой провинции(где я и тестирую) 3 месячной давности, там почти 1 в 1 обход, но отличия есть. Вот думаю щас протестить этот наверно, потом тот

README.md (https://www.blast.hk/redirect/aHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vR2VybWFuQWl6ZWsvOT I5MzMyOTA0MmM5ZjY4ZTljNjZmZWE3M2RmYWUwNTE)

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com




Вижу, можешь и ту оставить. Но тебе вряд-ли нужен лог, ты ж туда даже смотреть не будешь.
А что касаемо самого обхода — мутный он какой-то. Не допилен до конца...


всё еще крашит, видимо дело не только в том что криво определил, успевает одну координату вывести и крашит(в сампе тоже попробовал, также выводит одну и крашит)

Vintik
05.04.2024, 17:41
Проверь, у тебя в функцию правильные ли координаты передаются?

SobFoX;
05.04.2024, 17:47
You can also contact the man who created it, he is very nice and likes to help and give information

qwertyrus
05.04.2024, 17:53
Проверь, у тебя в функцию правильные ли координаты передаются?


ну да, *hisx, *hixy, *hisz, я вот думаю, что ошибка наверно в переприсваивании видовой матрицы, как сделать её структуру и указатель и сразу по адрессу обратиться(ну типо как и все остальные переменные)? А не как я переприсваивать. Может стоит передавать их по ссылке/константной ссылке?

Vintik
05.04.2024, 18:57
ну да, *hisx, *hixy, *hisz


Это я вижу...

Ты выведи эти координаты в лог ну или в конце то концов MessageBox

C++:






MessageBoxA
(
GetForegroundWindow
(
)
,
"тут твои координаты, переведи числа в строку"
,
"test"
,
0
)
;




Потому что у меня подозрение, что числа там передаются странные. Ты просто глазами посмотришь на числа и скажешь, похоже ли это на координаты или нет

qwertyrus
05.04.2024, 19:48
Это я вижу...
Ты выведи эти координаты в лог ну или в конце то концов MessageBox

C++:






MessageBoxA
(
GetForegroundWindow
(
)
,
"тут твои координаты, переведи числа в строку"
,
"test"
,
0
)
;




Потому что у меня подозрение, что числа там передаются странные. Ты просто глазами посмотришь на числа и скажешь, похоже ли это на координаты или нет


Короче я нашел свою ошибку и исправил её, кое-где передавал вместо значения pointer'а адресс, короче теперь вывод координаты, но крашит сразу после первой(начинал с нулевого индекса дабы проверить на себе(выше изачально были выведены мои координаты):

https://forum.antichat.xyz/attachments/28479570/

я даже сделал кучу проверок на != nullptr, бессполезно...

C++:






DWORD
*
cpedsearch
=
(
DWORD
*
)
(
cped
+
i
*
0x7c4
)
;
if
(
cpedsearch
!=
nullptr
)
{
float
*
health
=
(
float
*
)
(
*
cpedsearch
+
0x540
)
;
if
(
health
!=
nullptr
)
{
if
(
*
health
=
4.0f
)
{
DWORD
*
pointercoords
=
(
DWORD
*
)
(
*
cpedsearch
+
0x14
)
;
if
(
pointercoords
!=
nullptr
)
{
float
*
hisx
=
(
float
*
)
(
*
pointercoords
+
0x30
)
;
float
*
hisy
=
(
float
*
)
(
*
pointercoords
+
0x34
)
;
float
*
hisz
=
(
float
*
)
(
*
pointercoords
+
0x38
)
;
if
(
hisx
!=
nullptr
&&
hisy
!=
nullptr
&&
hisz
!=
nullptr
)
{
std
::
vector

onscreen
=
world_to_screen
(
ViewMatrix
,
*
hisx
,
*
hisy
,
*
hisz
)
;
std
::
string strValue
=
std
::
to_string
(
*
hisx
)
+
" "
+
std
::
to_string
(
*
hisy
)
+
" "
+
std
::
to_string
(
*
hisy
)
+
" "
+
std
::
to_string
(
i
)
;
const
char
*
str1
=
strValue
.
c_str
(
)
;
printf
(
str1
)
;
printf
(
"\n"
)
;

Vintik
05.04.2024, 21:29
Короче я нашел свою ошибку и исправил её, кое-где передавал вместо значения pointer'а адресс, короче теперь вывод координаты, но крашит сразу после первой(начинал с нулевого индекса дабы проверить на себе(выше изачально были выведены мои координаты):

я даже сделал кучу проверок на != nullptr, бессполезно...

C++:






DWORD
*
cpedsearch
=
(
DWORD
*
)
(
cped
+
i
*
0x7c4
)
;
if
(
cpedsearch
!=
nullptr
)
{
float
*
health
=
(
float
*
)
(
*
cpedsearch
+
0x540
)
;
if
(
health
!=
nullptr
)
{
if
(
*
health
=
4.0f
)
{
DWORD
*
pointercoords
=
(
DWORD
*
)
(
*
cpedsearch
+
0x14
)
;
if
(
pointercoords
!=
nullptr
)
{
float
*
hisx
=
(
float
*
)
(
*
pointercoords
+
0x30
)
;
float
*
hisy
=
(
float
*
)
(
*
pointercoords
+
0x34
)
;
float
*
hisz
=
(
float
*
)
(
*
pointercoords
+
0x38
)
;
if
(
hisx
!=
nullptr
&&
hisy
!=
nullptr
&&
hisz
!=
nullptr
)
{
std
::
vector

onscreen
=
world_to_screen
(
ViewMatrix
,
*
hisx
,
*
hisy
,
*
hisz
)
;
std
::
string strValue
=
std
::
to_string
(
*
hisx
)
+
" "
+
std
::
to_string
(
*
hisy
)
+
" "
+
std
::
to_string
(
*
hisy
)
+
" "
+
std
::
to_string
(
i
)
;
const
char
*
str1
=
strValue
.
c_str
(
)
;
printf
(
str1
)
;
printf
(
"\n"
)
;





Т. е. проблема в координатах всё таки?

qwertyrus
05.04.2024, 21:34
Т. е. проблема в координатах всё таки?


вероятнее всего я где то ошибаюсь в использовании указателя, поэтому крашит. Щас вот методом пробы запуска и крашей ищу где оно обрывается



Т. е. проблема в координатах всё таки?


Я решил проблему... Она была в том, что cpedsearch - cped+оффсет, а я брал его как поинтер еще один, в итоге попадал не на тот адрес и крашило, сейчас всё норм(последняя цифра это i(я проверял так). Осталось теперь прикрутить хук директ икса(буду рад если поможешь), а затем отрисовать линии. Хотелось бы по костям рисовать, но как я не искал, функции получения координаты кости(на голом C++) нет.

https://forum.antichat.xyz/attachments/28479608/

Vintik
05.04.2024, 23:35
Осталось теперь прикрутить хук директ икса(буду рад если поможешь), а затем отрисовать линии.


Сам недавно разбирался, вот тема:

AmazingRP / d3d9 hook (https://www.blast.hk/threads/204021/)

Хочу рисовать поверх окна Амазинг РП (КРМП). Проблема в том, что оверлей Стима / Дискорда почему-то там не работает (монопольный режим мб какой-то, я хз) Я хочу сделать .dll-ку, чтобы хукнуть d3d9 EndScene Это мне вообще чё надо делать? Искать адреса что хукать? Или какой метод... Если да, то...

www.blast.hk


А вот нужный тебе код:

C++:






#include "MinHook.h"
std
::
uintptr_t
find_device
(
std
::
uint32_t
Len
)
{
static
std
::
uintptr_t base
=
[
]
(
std
::
size_t Len
)
{
std
::
string
path_to
(
MAX_PATH
,
'\0'
)
;
if
(
auto
size
=
GetSystemDirectoryA
(
(
LPSTR
)
path_to
.
data
(
)
,
MAX_PATH
)
)
{
path_to
.
resize
(
size
)
;
path_to
+=
"\\d3d9.dll"
;
std
::
uintptr_t dwObjBase
=
reinterpret_cast

(
LoadLibraryA
(
path_to
.
c_str
(
)
)
)
;
while
(
dwObjBase
++

(
dwObjBase
+
0x00
)
==
0x06C7
&&
*
reinterpret_cast

(
dwObjBase
+
0x06
)
==
0x8689
&&
*
reinterpret_cast

(
dwObjBase
+
0x0C
)
==
0x8689
)
{
dwObjBase
+=
2
;
break
;
}
}
return
dwObjBase
;
}
return
std
::
uintptr_t
(
0
)
;
}
(
Len
)
;
return
base
;
}
void
*
get_function_address
(
int
VTableIndex
)
{
return
(
*
reinterpret_cast

(
find_device
(
0x128000
)
)
)
[
VTableIndex
]
;
}
HRESULT
(
__stdcall
*
IDirect3DDevice9__Present
)
(
LPDIRECT3DDEVICE9 pDevice
,
CONST RECT
*
pSrcRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindow
,
CONST RGNDATA
*
pDirtyRegion
)
;
HRESULT __stdcall
IDirect3DDevice9__Present_Hook
(
LPDIRECT3DDEVICE9 pDevice
,
CONST RECT
*
pSrcRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindow
,
CONST RGNDATA
*
pDirtyRegion
)
{
// do something...
return
IDirect3DDevice9__Present
(
pDevice
,
pSrcRect
,
pDestRect
,
hDestWindow
,
pDirtyRegion
)
;
}
HRESULT
(
__stdcall
*
IDirect3DDevice9__Reset
)
(
LPDIRECT3DDEVICE9 pDevice
,
D3DPRESENT_PARAMETERS
*
pPresentationParameters
)
;
HRESULT __stdcall
IDirect3DDevice9__Reset_Hook
(
LPDIRECT3DDEVICE9 pDevice
,
D3DPRESENT_PARAMETERS
*
pPresentationParameters
)
{
// do something...
return
IDirect3DDevice9__Reset
(
pDevice
,
pPresentationParameters
)
;
}
DWORD WINAPI
InitializeAndLoad
(
LPVOID hModule
)
{
MH_CreateHook
(
get_function_address
(
17
)
,
&
IDirect3DDevice9__Present_Hook
,
reinterpret_cast

(
&
IDirect3DDevice9__Present
)
)
;
MH_EnableHook
(
get_function_address
(
17
)
)
;
MH_CreateHook
(
get_function_address
(
16
)
,
&
IDirect3DDevice9__Reset_Hook
,
reinterpret_cast

(
&
IDirect3DDevice9__Reset
)
)
;
MH_EnableHook
(
get_function_address
(
16
)
)
;
return
0
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
{
DisableThreadLibraryCalls
(
hModule
)
;
MH_Initialize
(
)
;
CreateThread
(
0
,
0
,
&
InitializeAndLoad
,
hModule
,
0
,
0
)
;
break
;
}
case
DLL_PROCESS_DETACH
:
{
MH_DisableHook
(
get_function_address
(
17
)
)
;
MH_DisableHook
(
get_function_address
(
16
)
)
;
MH_RemoveHook
(
get_function_address
(
17
)
)
;
MH_RemoveHook
(
get_function_address
(
16
)
)
;
break
;
}
}
return
1
;
}








но как я не искал, функции получения координаты кости(на голом C++) нет.


Я думаю, что это может быть тут (https://www.blast.hk/redirect/aHR0cDovL2d0YW1vZGRpbmcucnUvd2lraS8lRDAlOTAlRDAlQj QlRDElODAlRDAlQjUlRDElODElRDAlQjBfJUQwJTlGJUQwJUIw JUQwJUJDJUQxJThGJUQxJTgyJUQwJUI4XyhTQSkjQ0JvbmVfLj I4LkQwLjlBLkQwLkJFLkQxLjgxLkQxLjgyLkQwLkI4Xy5EMS44 MS5EMC5CQS5EMC5CNS5EMC5CQi5EMC5CNS5EMS44Mi5EMC5CMC 4yOQ), но не уверен.

qwertyrus
06.04.2024, 21:51
Сам недавно разбирался, вот тема:

AmazingRP / d3d9 hook (https://www.blast.hk/threads/204021/)

Хочу рисовать поверх окна Амазинг РП (КРМП). Проблема в том, что оверлей Стима / Дискорда почему-то там не работает (монопольный режим мб какой-то, я хз) Я хочу сделать .dll-ку, чтобы хукнуть d3d9 EndScene Это мне вообще чё надо делать? Искать адреса что хукать? Или какой метод... Если да, то...

www.blast.hk


А вот нужный тебе код:

C++:






#include "MinHook.h"
std
::
uintptr_t
find_device
(
std
::
uint32_t
Len
)
{
static
std
::
uintptr_t base
=
[
]
(
std
::
size_t Len
)
{
std
::
string
path_to
(
MAX_PATH
,
'\0'
)
;
if
(
auto
size
=
GetSystemDirectoryA
(
(
LPSTR
)
path_to
.
data
(
)
,
MAX_PATH
)
)
{
path_to
.
resize
(
size
)
;
path_to
+=
"\\d3d9.dll"
;
std
::
uintptr_t dwObjBase
=
reinterpret_cast

(
LoadLibraryA
(
path_to
.
c_str
(
)
)
)
;
while
(
dwObjBase
++

(
dwObjBase
+
0x00
)
==
0x06C7
&&
*
reinterpret_cast

(
dwObjBase
+
0x06
)
==
0x8689
&&
*
reinterpret_cast

(
dwObjBase
+
0x0C
)
==
0x8689
)
{
dwObjBase
+=
2
;
break
;
}
}
return
dwObjBase
;
}
return
std
::
uintptr_t
(
0
)
;
}
(
Len
)
;
return
base
;
}
void
*
get_function_address
(
int
VTableIndex
)
{
return
(
*
reinterpret_cast

(
find_device
(
0x128000
)
)
)
[
VTableIndex
]
;
}
HRESULT
(
__stdcall
*
IDirect3DDevice9__Present
)
(
LPDIRECT3DDEVICE9 pDevice
,
CONST RECT
*
pSrcRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindow
,
CONST RGNDATA
*
pDirtyRegion
)
;
HRESULT __stdcall
IDirect3DDevice9__Present_Hook
(
LPDIRECT3DDEVICE9 pDevice
,
CONST RECT
*
pSrcRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindow
,
CONST RGNDATA
*
pDirtyRegion
)
{
// do something...
return
IDirect3DDevice9__Present
(
pDevice
,
pSrcRect
,
pDestRect
,
hDestWindow
,
pDirtyRegion
)
;
}
HRESULT
(
__stdcall
*
IDirect3DDevice9__Reset
)
(
LPDIRECT3DDEVICE9 pDevice
,
D3DPRESENT_PARAMETERS
*
pPresentationParameters
)
;
HRESULT __stdcall
IDirect3DDevice9__Reset_Hook
(
LPDIRECT3DDEVICE9 pDevice
,
D3DPRESENT_PARAMETERS
*
pPresentationParameters
)
{
// do something...
return
IDirect3DDevice9__Reset
(
pDevice
,
pPresentationParameters
)
;
}
DWORD WINAPI
InitializeAndLoad
(
LPVOID hModule
)
{
MH_CreateHook
(
get_function_address
(
17
)
,
&
IDirect3DDevice9__Present_Hook
,
reinterpret_cast

(
&
IDirect3DDevice9__Present
)
)
;
MH_EnableHook
(
get_function_address
(
17
)
)
;
MH_CreateHook
(
get_function_address
(
16
)
,
&
IDirect3DDevice9__Reset_Hook
,
reinterpret_cast

(
&
IDirect3DDevice9__Reset
)
)
;
MH_EnableHook
(
get_function_address
(
16
)
)
;
return
0
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
{
DisableThreadLibraryCalls
(
hModule
)
;
MH_Initialize
(
)
;
CreateThread
(
0
,
0
,
&
InitializeAndLoad
,
hModule
,
0
,
0
)
;
break
;
}
case
DLL_PROCESS_DETACH
:
{
MH_DisableHook
(
get_function_address
(
17
)
)
;
MH_DisableHook
(
get_function_address
(
16
)
)
;
MH_RemoveHook
(
get_function_address
(
17
)
)
;
MH_RemoveHook
(
get_function_address
(
16
)
)
;
break
;
}
}
return
1
;
}






Я думаю, что это может быть тут (https://www.blast.hk/redirect/aHR0cDovL2d0YW1vZGRpbmcucnUvd2lraS8lRDAlOTAlRDAlQj QlRDElODAlRDAlQjUlRDElODElRDAlQjBfJUQwJTlGJUQwJUIw JUQwJUJDJUQxJThGJUQxJTgyJUQwJUI4XyhTQSkjQ0JvbmVfLj I4LkQwLjlBLkQwLkJFLkQxLjgxLkQxLjgyLkQwLkI4Xy5EMS44 MS5EMC5CQS5EMC5CNS5EMC5CQi5EMC5CNS5EMS44Mi5EMC5CMC 4yOQ), но не уверен.


Что я делаю не так? Все методы из инета попробовал, добавлял в папку c включениями, к исходному файлу dllmain.cpp, ничего не помогает
https://forum.antichat.xyz/attachments/28480044/

https://forum.antichat.xyz/attachments/28480044/

Vintik
07.04.2024, 00:44
Что я делаю не так? Все методы из инета попробовал, добавлял в папку c включениями, к исходному файлу dllmain.cpp, ничего не помогает


Ой как я это не люблю.

Вот тут есть правильное подключение Imgui.

Гайд - Работа с рендером и Directx9 [4] (https://www.blast.hk/threads/113060/)

Создание ASI-плагина с нуля Хуки – что это такое и как с ними работать Безопасная инициализация и работа с SAMP Работа с рендером и Directx9 Обработка событий окна + ImGui В этом гайде будет рассказано про работу с рендером в Directx9 с помощью ImGui При использовании на других ресурсах...

www.blast.hk


Попробуй сделать всё как там

qwertyrus
07.04.2024, 01:20
Ой как я это не люблю.
Вот тут есть правильное подключение Imgui.

Гайд - Работа с рендером и Directx9 [4] (https://www.blast.hk/threads/113060/)

Создание ASI-плагина с нуля Хуки – что это такое и как с ними работать Безопасная инициализация и работа с SAMP Работа с рендером и Directx9 Обработка событий окна + ImGui В этом гайде будет рассказано про работу с рендером в Directx9 с помощью ImGui При использовании на других ресурсах...

www.blast.hk


Попробуй сделать всё как там


не помогло, стало только хуже

https://forum.antichat.xyz/attachments/28480130/



не помогло, стало только хуже

https://forum.antichat.xyz/attachments/28480130/


создал новый, чистый проект, скомпилировало, но крашит при разворачивании игры сразу(инжект, разворачиваю - бамс и краш)...

qwertyrus
09.04.2024, 09:49
тему можно закрывать, всё работает