ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Крашит игру из-за DLL (https://forum.antichat.xyz/showthread.php?t=1507582)

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

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

Цитата:

Сообщение от SobFoX;

MTA:SA Forks Anticheat Bypass

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

Цитата:

Сообщение от qwertyrus

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

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

Цитата:

Сообщение от SobFoX;

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

Цитата:

Сообщение от Vintik

А если убрать 76 строку (
Код:

world_to_screen
) — крашит?

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

Vintik 05.04.2024 15:58

Цитата:

Сообщение от qwertyrus

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

Цитата:

Сообщение от Vintik

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

pointercoords
вместо
Код:

cpedsearch
).

C++:





Код:

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



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

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

Vintik 05.04.2024 16:43

Цитата:

Сообщение от qwertyrus

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

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

@SobFoX; 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

Цитата:

Сообщение от Vintik

В исходном файле (который тебе скинули) действительно эти функции не определены. Может, там еще какая-нибудь зависимость...
@SobFoX; 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, те две я тоже нашел в интернете, а вот что с этой делать... может её убрать? а вдруг что-то не сработает...

Цитата:

Сообщение от Vintik

В исходном файле (который тебе скинули) действительно эти функции не определены. Может, там еще какая-нибудь зависимость...
@SobFoX; 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

Цитата:

Сообщение от qwertyrus

может её убрать? а вдруг что-то не сработает...

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

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

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

C++:





Код:

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


qwertyrus 05.04.2024 16:55

Цитата:

Сообщение от Vintik

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

C++:





Код:

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



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

Vintik 05.04.2024 16:56

Цитата:

Сообщение от qwertyrus

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

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

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

qwertyrus 05.04.2024 16:59

Цитата:

Сообщение от Vintik

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

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

README.md

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

gist.github.com


Цитата:

Сообщение от Vintik

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

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

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

Цитата:

Сообщение от Vintik

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

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

Vintik 05.04.2024 18:57

Цитата:

Сообщение от qwertyrus

ну да, *hisx, *hixy, *hisz

Это я вижу...

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

C++:





Код:

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



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

qwertyrus 05.04.2024 19:48

Цитата:

Сообщение от Vintik

Это я вижу...
Ты выведи эти координаты в лог ну или в конце то концов 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

Цитата:

Сообщение от qwertyrus

Короче я нашел свою ошибку и исправил её, кое-где передавал вместо значения 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

Цитата:

Сообщение от Vintik

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

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

Цитата:

Сообщение от Vintik

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

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

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

Vintik 05.04.2024 23:35

Цитата:

Сообщение от qwertyrus

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

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

AmazingRP / d3d9 hook

Хочу рисовать поверх окна Амазинг РП (КРМП). Проблема в том, что оверлей Стима / Дискорда почему-то там не работает (монопольный режим мб какой-то, я хз) Я хочу сделать .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
;
}





Цитата:

Сообщение от qwertyrus

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

Я думаю, что это может быть тут, но не уверен.

qwertyrus 06.04.2024 21:51

Цитата:

Сообщение от Vintik

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

AmazingRP / d3d9 hook

Хочу рисовать поверх окна Амазинг РП (КРМП). Проблема в том, что оверлей Стима / Дискорда почему-то там не работает (монопольный режим мб какой-то, я хз) Я хочу сделать .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 включениями, к исходному файлу dllmain.cpp, ничего не помогает
https://forum.antichat.xyz/attachments/28480044/

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

Vintik 07.04.2024 00:44

Цитата:

Сообщение от qwertyrus

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

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

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

Гайд - Работа с рендером и Directx9 [4]

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

www.blast.hk


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

qwertyrus 07.04.2024 01:20

Цитата:

Сообщение от Vintik

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

Гайд - Работа с рендером и Directx9 [4]

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

www.blast.hk


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

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

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

Цитата:

Сообщение от qwertyrus

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

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

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

qwertyrus 09.04.2024 09:49

тему можно закрывать, всё работает


Время: 19:35