PDA

Просмотр полной версии : Как поймать внутриигровое событие в SAMPFUNCS?


Ya Zaregalsya
27.11.2020, 04:23
как создать коллбек на событие в игре?
ну, как "хуки" сетевые, только на внутриигровые события (любое действие, совершённое/спровоцированное игроком)

Dark_Knight
27.11.2020, 21:51
найти его адресс и поставить на него хук. Плагин SDK в помощь.

Ya Zaregalsya
29.11.2020, 07:28
найти его адресс и поставить на него хук. Плагин SDK в помощь.


— Как обжарить хлеб в тостере?

— Покупаешь хлеб и жаришь. Сварочный аппарат в помощь.

Dark_Knight
29.11.2020, 18:34
так оно и есть. Ты сказал что ты хочешь игровое событие словить, а их херовая туча и хорошо они описаны в плагин SDK

Ya Zaregalsya
29.11.2020, 21:19
так оно и есть. Ты сказал что ты хочешь игровое событие словить, а их херовая туча и хорошо они описаны в плагин SDK


Нужно обработать попадание пули в конкретный объект. Здесь (https://github.com/DK22Pac/plugin-sdk/blob/master/shared/Events.h) таких событий нет.

kin4stat
29.11.2020, 21:21
Нужно обработать попадание пули в конкретный объект. Здесь (https://github.com/DK22Pac/plugin-sdk/blob/master/shared/Events.h) таких событий нет.


Хук на DoBulletImpact и сравнение объектов приходящих в эту функцию

Ya Zaregalsya
02.12.2020, 19:15
Хук на DoBulletImpact и сравнение объектов приходящих в эту функцию


=)

А как получить объекты, которые приходят в эту функцию?

Dark_Knight
02.12.2020, 23:20
=)

А как получить объекты, которые приходят в эту функцию?


Немного уточни этот момент)

Ya Zaregalsya
24.01.2021, 10:07
Хук на DoBulletImpact и сравнение объектов приходящих в эту функцию


Всё ещё не разобрался с Вашим предложением. Можете объяснить подробнее как реализовать тело такого хука? У меня вообще крайне мало опыта работы с хуками.

Dark_Knight
24.01.2021, 11:59
Могу тебе кинуть пример хука на urmem DoBulletImpact. По логике вещей должен код работать, но 100 процентной гарантии не даю ибо пишу не со своего компа и пишу без компилятора. Скажу сам, я сам до сих пор не особо в хуках разбираюсь.

C++:






#include "urmem.hpp"
urmem
::
hook hook
;
//Определение обьекта нашего хука(вроде правильно сказал по терминологии)
//Определяем тело нашей функции куда мы хотим чтобы шли данные с хука
void
DoBulletImpact
(
void
*
_this
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
hook
.
call

(
_this
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
//Вызываем оригинальную функцию.
}
//В иницилизацию плагина
hook
.
install
(
0x73B550
,
urmem
::
get_func_addr
(
&
DoBulletImpact
)
)
;
//Первый параметр метода - это куда мы ставим хук.
//Второй - это адресс нашего метода или функции. Если это метод класса, то он должен быть статичным.
//В выгрызку плагина
hook
.
disable
(
)
;




Ссылка на urmem (https://github.com/katursis/urmem)

Ссылка на опредление метода DoBulletImpact и его адресс (https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_sa/game_sa/CWeapon.cpp#L122)

Скажу от себя еще. Этой либой я лично не ставил хуки на thiscall и все делал исключительно на свой глаз и код может быть не рабочим.

Musaigen
24.01.2021, 13:19
Могу тебе кинуть пример хука на urmem DoBulletImpact. По логике вещей должен код работать, но 100 процентной гарантии не даю ибо пишу не со своего компа и пишу без компилятора. Скажу сам, я сам до сих пор не особо в хуках разбираюсь.

C++:






#include "urmem.hpp"
urmem
::
hook hook
;
//Определение обьекта нашего хука(вроде правильно сказал по терминологии)
//Определяем тело нашей функции куда мы хотим чтобы шли данные с хука
void
DoBulletImpact
(
void
*
_this
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
hook
.
call

(
_this
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
//Вызываем оригинальную функцию.
}
//В иницилизацию плагина
hook
.
install
(
0x73B550
,
urmem
::
get_func_addr
(
&
DoBulletImpact
)
)
;
//Первый параметр метода - это куда мы ставим хук.
//Второй - это адресс нашего метода или функции. Если это метод класса, то он должен быть статичным.
//В выгрызку плагина
hook
.
disable
(
)
;




Ссылка на urmem (https://github.com/katursis/urmem)
Ссылка на опредление метода DoBulletImpact и его адресс (https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_sa/game_sa/CWeapon.cpp#L122)
Скажу от себя еще. Этой либой я лично не ставил хуки на thiscall и все делал исключительно на свой глаз и код может быть не рабочим.


Вторым аргументом будет void* edx



— Как обжарить хлеб в тостере?
— Покупаешь хлеб и жаришь. Сварочный аппарат в помощь.



Исходник - Гайд - Мини-гайд по хукам. [Теория + Практика] (https://www.blast.hk/threads/61027/)

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

www.blast.hk

Ya Zaregalsya
24.01.2021, 13:36
Могу тебе кинуть пример хука на urmem DoBulletImpact. По логике вещей должен код работать, но 100 процентной гарантии не даю ибо пишу не со своего компа и пишу без компилятора. Скажу сам, я сам до сих пор не особо в хуках разбираюсь.

C++:






#include "urmem.hpp"
urmem
::
hook hook
;
//Определение обьекта нашего хука(вроде правильно сказал по терминологии)
//Определяем тело нашей функции куда мы хотим чтобы шли данные с хука
void
DoBulletImpact
(
void
*
_this
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
hook
.
call

(
_this
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
//Вызываем оригинальную функцию.
}
//В иницилизацию плагина
hook
.
install
(
0x73B550
,
urmem
::
get_func_addr
(
&
DoBulletImpact
)
)
;
//Первый параметр метода - это куда мы ставим хук.
//Второй - это адресс нашего метода или функции. Если это метод класса, то он должен быть статичным.
//В выгрызку плагина
hook
.
disable
(
)
;




Ссылка на urmem (https://github.com/katursis/urmem)
Ссылка на опредление метода DoBulletImpact и его адресс (https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_sa/game_sa/CWeapon.cpp#L122)
Скажу от себя еще. Этой либой я лично не ставил хуки на thiscall и все делал исключительно на свой глаз и код может быть не рабочим.


Жалуется на неправильные аргументы в 5-6 строчках. В шаблоне типов больше, чем аргументов в сигнатуре функции.

Ya Zaregalsya
24.01.2021, 13:42
Вторым аргументом будет void* edx

Исходник - Гайд - Мини-гайд по хукам. [Теория + Практика] (https://www.blast.hk/threads/61027/)

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

www.blast.hk



Спасибо за ссылку! Правильно ли я понимаю, что функции из библиотеки SF и PSDK (в частности DoBulletImpact()) использует не только программист, но и игра? Т.е. этот хук действительно будет срабатывать на игровые события или только если эта функция будет вызвана из плагина?

Dark_Knight
24.01.2021, 13:54
Жалуется на неправильные аргументы в 5-6 строчках. В шаблоне типов больше, чем аргументов в сигнатуре функции.


Вечером попробую разобратся. Как говорил писал методом научного тыка.

Musaigen
24.01.2021, 14:06
Т.е. этот хук действительно будет срабатывать на игровые события или только если эта функция будет вызвана из плагина?


Будет, но нужно будет вызвать функцию, которая была до тебя, для того, чтобы не сломать цепочку вызовов.



Жалуется на неправильные аргументы в 5-6 строчках. В шаблоне типов больше, чем аргументов в сигнатуре функции.



C++:






void
DoBulletImpact
(
void
*
_this
,
void
*
edx
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
/* Твой код */
// вызов той функции, что была до нас, DoBulletImpact ничего не возвращает, поэтому указываем только соглашение о вызове __thiscall
hook
.
call

(
_this
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
}

kin4stat
24.01.2021, 14:08
Спасибо за ссылку! Правильно ли я понимаю, что функции из библиотеки SF и PSDK (в частности DoBulletImpact()) использует не только программист, но и игра? Т.е. этот хук действительно будет срабатывать на игровые события или только если эта функция будет вызвана из плагина?


у меня на гитхабе в BulletTracer есть хук этой функции

kin4stat - Overview (https://github.com/KiN4StAt)

20 y.o. student :). kin4stat has 55 repositories available. Follow their code on GitHub.

github.com

Ya Zaregalsya
31.03.2021, 15:08
Могу тебе кинуть пример хука на urmem DoBulletImpact. По логике вещей должен код работать, но 100 процентной гарантии не даю ибо пишу не со своего компа и пишу без компилятора. Скажу сам, я сам до сих пор не особо в хуках разбираюсь.

C++:






#include "urmem.hpp"
urmem
::
hook hook
;
//Определение обьекта нашего хука(вроде правильно сказал по терминологии)
//Определяем тело нашей функции куда мы хотим чтобы шли данные с хука
void
DoBulletImpact
(
void
*
_this
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
hook
.
call

(
_this
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
//Вызываем оригинальную функцию.
}
//В иницилизацию плагина
hook
.
install
(
0x73B550
,
urmem
::
get_func_addr
(
&
DoBulletImpact
)
)
;
//Первый параметр метода - это куда мы ставим хук.
//Второй - это адресс нашего метода или функции. Если это метод класса, то он должен быть статичным.
//В выгрызку плагина
hook
.
disable
(
)
;




Ссылка на urmem (https://github.com/katursis/urmem)
Ссылка на опредление метода DoBulletImpact и его адресс (https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_sa/game_sa/CWeapon.cpp#L122)
Скажу от себя еще. Этой либой я лично не ставил хуки на thiscall и все делал исключительно на свой глаз и код может быть не рабочим.



В прошлый раз ни с одним методом так ничего и не получилось, сейчас решил попробовать снова для решения этой проблемы (https://www.blast.hk/threads/83191/). Вот новый код:

C++:






//Убран код с подключением библиотек и mainloop().
urmem
::
hook urmemHook
;
void
UpdateAimingCoors
(
void
*
_this
,
void
*
edx
,
CVector
const
*
AimingTargetCoors
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"UpdateAimingCoors"
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"UpdateAimingCoors. posX: %f; posY: %f; posZ: %f"
,
AimingTargetCoors
->
fX
,
AimingTargetCoors
->
fY
,
AimingTargetCoors
->
fZ
)
;
urmemHook
.
call

(
_this
,
AimingTargetCoors
)
;
}
void
DoBulletImpact
(
void
*
_this
,
void
*
edx
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DoBulletImpact"
)
;
urmemHook
.
call

(
_this
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
urmemHook
.
install
(
0x50CB10
,
urmem
::
get_func_addr
(
&
UpdateAimingCoors
)
)
;
urmemHook
.
install
(
0x73B550
,
urmem
::
get_func_addr
(
&
DoBulletImpact
)
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
urmemHook
.
disable
(
)
;
break
;
}
return
TRUE
;
}




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

kin4stat
31.03.2021, 15:11
Что я делаю неправильно?


Как минимум у самой функции хука DoBulletImpact должно быть соглашение о вызове __fastcall (если msvc, на mingw __thiscall)

Ya Zaregalsya
31.03.2021, 15:21
Как минимум у самой функции хука DoBulletImpact должно быть соглашение о вызове __fastcall (если msvc, на mingw __thiscall)


Добавление __fastcall ничего не изменило, на __thiscall жалуется VS.

kin4stat
31.03.2021, 15:29
Добавление __fastcall ничего не изменило, на __thiscall жалуется VS.


urmem не пользовался, сказать не могу

__fastcall на обе функции нужен

Ya Zaregalsya
31.03.2021, 15:38
urmem не пользовался, сказать не могу
__fastcall на обе функции нужен



C++:






//Убран код с подключением библиотек и mainloop().
urmem
::
hook urmemHook
;
void
__fastcall
UpdateAimingCoors
(
void
*
_this
,
void
*
edx
,
CVector
const
*
AimingTargetCoors
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"UpdateAimingCoors"
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"UpdateAimingCoors. posX: %f; posY: %f; posZ: %f"
,
AimingTargetCoors
->
fX
,
AimingTargetCoors
->
fY
,
AimingTargetCoors
->
fZ
)
;
urmemHook
.
call

(
_this
,
AimingTargetCoors
)
;
}
void
__fastcall
DoBulletImpact
(
void
*
_this
,
void
*
edx
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DoBulletImpact"
)
;
urmemHook
.
call

(
_this
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
urmemHook
.
install
(
0x50CB10
,
urmem
::
get_func_addr
(
&
UpdateAimingCoors
)
)
;
urmemHook
.
install
(
0x73B550
,
urmem
::
get_func_addr
(
&
DoBulletImpact
)
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
urmemHook
.
disable
(
)
;
break
;
}
return
TRUE
;
}




Вот так сделал, не работает.

Dark_Knight
31.03.2021, 23:10
C++:






//Убран код с подключением библиотек и mainloop().
urmem
::
hook urmemHook
;
urmemHook
.
install
(
0x50CB10
,
urmem
::
get_func_addr
(
&
UpdateAimingCoors
)
)
;
urmemHook
.
install
(
0x73B550
,
urmem
::
get_func_addr
(
&
DoBulletImpact
)
)
;
}




Вот так сделал, не работает.


Конечно, блять, не работает. На один обьект надо вешать один хук. У тебя на один обьект 2 хука.

Ya Zaregalsya
01.04.2021, 03:57
Конечно, блять, не работает. На один обьект надо вешать один хук. У тебя на один обьект 2 хука.



Сделал так, ничего не изменилось:

C++:






urmem
::
hook urmemHookAimingCoords
;
void
__fastcall
UpdateAimingCoors
(
void
*
_this
,
void
*
edx
,
CVector
const
*
AimingTargetCoors
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"UpdateAimingCoors"
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"UpdateAimingCoors. posX: %f; posY: %f; posZ: %f"
,
AimingTargetCoors
->
fX
,
AimingTargetCoors
->
fY
,
AimingTargetCoors
->
fZ
)
;
urmemHookAimingCoords
.
call

(
_this
,
AimingTargetCoors
)
;
}
urmem
::
hook urmemHookDoBulletImpact
;
void
__fastcall
DoBulletImpact
(
void
*
_this
,
void
*
edx
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DoBulletImpact"
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"DoBulletImpact. posX: %f; posY: %f; posZ: %f"
,
endPoint
->
fX
,
endPoint
->
fY
,
endPoint
->
fZ
)
;
urmemHookDoBulletImpact
.
call

(
_this
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
urmemHookAimingCoords
.
install
(
0x50CB10
,
urmem
::
get_func_addr
(
&
UpdateAimingCoors
)
)
;
urmemHookDoBulletImpact
.
install
(
0x73B550
,
urmem
::
get_func_addr
(
&
DoBulletImpact
)
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
urmemHookAimingCoords
.
disable
(
)
;
urmemHookDoBulletImpact
.
disable
(
)
;
break
;
}
return
TRUE
;
}




Без соглашения __fastcall тоже ничего.

Ya Zaregalsya
02.04.2021, 20:28
у меня на гитхабе в BulletTracer есть хук этой функции

kin4stat - Overview (https://github.com/KiN4StAt)

20 y.o. student :). kin4stat has 55 repositories available. Follow their code on GitHub.

github.com



Пытаюсь разобраться с Вашим примером. «Трамплин»‎ fpDoImpact совсем непонятный, можете объяснить что это, зачем нужно и как это объявить без классов?

kin4stat
02.04.2021, 20:33
Пытаюсь разобраться с Вашим примером. «Трамплин»‎ fpDoImpact совсем непонятный, можете объяснить что это, зачем нужно и как это объявить без классов?



C++:






typedef
void
(
__fastcall
*
DoBulletImpact
)
(
void
*
,
void
*
,
CEntity
*
,
CEntity
*
,
CVector
*
,
CVector
*
,
CColPoint
*
,
int
)
;
DoBulletImpact fpDoImpact
=
0
;
void
__fastcall
DoBulletImpactHooked
(
void
*
weapon
,
void
*
EDX
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
if
(
victim
!=
nullptr
)
{
}
return
fpDoImpact
(
weapon
,
EDX
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
}




C++:






MH_CreateHook
(
(
void
*
)
0x73B550
,
&
DoBulletImpactHooked
,
reinterpret_cast

(
&
fpDoImpact
)
)
;
MH_EnableHook
(
(
void
*
)
0x73B550
)
;

Ya Zaregalsya
02.04.2021, 23:43
C++:






typedef
void
(
__fastcall
*
DoBulletImpact
)
(
void
*
,
void
*
,
CEntity
*
,
CEntity
*
,
CVector
*
,
CVector
*
,
CColPoint
*
,
int
)
;
DoBulletImpact fpDoImpact
=
0
;
void
__fastcall
DoBulletImpactHooked
(
void
*
weapon
,
void
*
EDX
,
CEntity
*
owner
,
CEntity
*
victim
,
CVector
*
startPoint
,
CVector
*
endPoint
,
CColPoint
*
colPoint
,
int
arg5
)
{
if
(
victim
!=
nullptr
)
{
}
return
fpDoImpact
(
weapon
,
EDX
,
owner
,
victim
,
startPoint
,
endPoint
,
colPoint
,
arg5
)
;
}




C++:






MH_CreateHook
(
(
void
*
)
0x73B550
,
&
DoBulletImpactHooked
,
reinterpret_cast

(
&
fpDoImpact
)
)
;
MH_EnableHook
(
(
void
*
)
0x73B550
)
;






При запуске игры плагин жалуется на отсутствие файла minhook.x32.dll и выгружается. Видимо Минхук установлен неправильно, хотя я перепробовал всё, что знаю. Сначала устанавливал его через vcpkg (файлы там и лежат, не знаю как добавить к проекту) — не заработало, потом добавил к проекту все файлы, которые нашёл здесь (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cuY29kZXByb2plY3QuY29tL0FydGljbGVzLz Q0MzI2L01pbkhvb2stVGhlLU1pbmltYWxpc3RpYy14LXgtQVBJ LUhvb2tpbmctTGlicmE) (кроме исходников), и minhook.x32.dll там тоже есть, но всё равно не работает. Как правильно устанавливать такие библиотеки?

.deserve
04.04.2021, 08:27
Насколько я понимаю, тебе для начала нужно понять как подключать статические/динамические библиотеки в целом.

Нашёл один гайдик на msdn, он как раз под твой случай, разве что он ориентирован на подключение библиотеки динамической компоновки (DLL).

- Факин msdn (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcnUtcnUvY3BwL2 J1aWxkL3dhbGt0aHJvdWdoLWNyZWF0aW5nLWFuZC11c2luZy1h LWR5bmFtaWMtbGluay1saWJyYXJ5LWNwcD92aWV3PW1zdmMtMT YwJnZpZXdGYWxsYmFja0Zyb209dnMtMjAxOQ) (для начала стоит по нему пробежаться)

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

1) Сперва тебе надо получить .lib библиотеку для включения в проект, а также заголовки этой библиотеки (.h).

2) Дальше я попытаюсь объяснить как их получить, но потом ты должен их по своему желанию распределить в проекте по папкам. Например создашь папку sdk (ужасная практика, но пусть будет так). Далее в ней создашь папочку MinHook и туда вставишь заголовочные файлы и файл библиотеки по папкам (includes и Libs соответственно). Опять же подмечу - это ужасная практика, я ее не рекомендую даже знать. Желательно так всё распределить, чтобы при подключении можно было видеть откуда эта шняга, к примеру: #include

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

3) Давно не юзал минхук, но вроде помню, что изначально там нету файла либы (.lib). Тебе её надо получить. Идёшь в их репо на github, клонируешь его к себе. Берешь утилитку Cmake, фигачишь туда путь до CMakeList.txt и ставишь output каталог, можешь, к примеру, назвать как build2.0 (практика еще ужаснее, чем прошлая).

По итогу:

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

p.s: (это всё примеры, я на самом деле ниче не собирал, т.к мне лень. По памяти буду писать)

Тыкаешь Configure с дефолт пресетами, если у тебя жизнь мёдом, то всё будет ок, а если будут траблы, то гугли.

Помочь с пониманием того, какая у тебя жизнь, поможет лог снизу. Если там всё ДАН, то идешь дальше.

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

4) Идешь в папку build2.0, открываешь солюшн нашего минхука. Вроде minhook.sln или чёт такое, не помню. Собираешь солюшн (решение). Решений там дохуя наскок я помню. Все тебе их собирать вроде не нужно. Но т.к я не помню, что там за решения - собирай всё. Либо ищи minhook project, если он есть там, и собирай его.

Шлёпаешь в папку под названием... ... Если ты нихуя не менял, то она должна называться как конфигурация, под которой ты всё билдил. Debug там, release и вся эта шняга.

Вуаля, там лежит файл либы (статической).

Копируешь этот файл в свой проект в папку sdk\MinHook\Libs\Этотфайл.lib

5) Где ты на*** будешь брать определения функций, если у тебя их нет. Идёшь как Херлок Шолмс искать файл заголовка/ов от минхука в той же папке, куда ты отдельно должен был склонировать их репо с github. Ищешь там папку include, в ней лежит MinHook.h. Копируешь его в свой проект: \свой проект\sdk\MinHook\includes\MinHook.h.

Готово.

6) Тепешь идешь в проект -> Свойства проекта.

Тут у нас есть отдельный котёл для наших либ. Для всего допотопного говна

мелкомягкие (microsoft) предусмотрели отдельные 2 раздела в иерархии свойств

проекта, специально для линковки ДОПОЛНИТЕЛЬНЫХ либ!

Там всё тоже самое, но с оговоркой: либы тут ДОПОЛНИТЕЛЬНЫЕ.

Грубо говоря это и есть те самые 2 котла для наших дополнительных:

- Включаемых каталогов

- Каталогов либ

Они только имеют в названии "допольнительных"!

Расположение:

Доп.каталоги включаемых файлов: C/C++ -> Общие (General) (Сюда ты пихаешь путь sdk\MinHook\includes)

Доп.каталоги либ: Компоновщик (Linker) -> Общие (General) (Сюды пихаешь sdk\MinHook\Libs)

Далее тебе надо задать в Additional Dependency (я *** знает раздел, т.к вс не открыта). Поищи. Добавляешь название либы, которую ты получил с окончанием .lib

7) Идешь в файл с энтри поинтом или куда тебе там надо. В main.h может быть, я *** знает. И добавляешь MinHook.h

Плюсом через прагма комментируешь объектный файл (про объектник тебе знать не надо, но ты делаешь именно это, эта препроцессорная директива оставит коммент для объектника о том: какое название либы, юзер коммент (то самое название либы), версия компилятора, опции для линкера и т.п) (#pragma comment(lib, "название_либы.lib")). И всё, можешь юзать всё из минхуков.

Хочу подметить. Собирая это всё через gcc, он тебя пошлёт на***, т.к pragma comment - это фишка МелкоМягких.

8) Этот гайд написан новичком для новичка с целью осветить некоторые моменты, и самому въебать время на написание этой статьи. Но прийдется погуглить местами, т.к я наверное не всё описал.

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

upd: по итогу я решил её собрать и подключить... BTW, эта d после разрядки - це debug версия значит.

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

А ваще юзайте детур от мелкомягких, чё вы как лопухи.

p.s: объезд.lib топ!

src:

- github minhook (https://github.com/TsudaKageyu/minhook)

- кодпроджект (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cuY29kZXByb2plY3QuY29tL0FydGljbGVzLz Q0MzI2L01pbkhvb2stVGhlLU1pbmltYWxpc3RpYy14LXgtQVBJ LUhvb2tpbmctTGlicmE) (тут можно глянуть как в коде выглядит комментирование либы для объектника и юзание)

- факин гуд тред о минхуке (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cudW5rbm93bmNoZWF0cy5tZS9mb3J1bS9wcm 9ncmFtbWluZy1mb3ItYmVnaW5uZXJzLzQyNDMzMC1ob29rLWZ1 bmN0aW9ucy5odG1s) (старый вроде, p.s: забыл глянуть дату поста, перед тем как закрыть вкладку)

Ya Zaregalsya
06.04.2021, 10:48
Насколько я понимаю, тебе для начала нужно понять как подключать статические/динамические библиотеки в целом.
Нашёл один гайдик на msdn, он как раз под твой случай, разве что он ориентирован на подключение библиотеки динамической компоновки (DLL).

- Факин msdn (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vcnUtcnUvY3BwL2 J1aWxkL3dhbGt0aHJvdWdoLWNyZWF0aW5nLWFuZC11c2luZy1h LWR5bmFtaWMtbGluay1saWJyYXJ5LWNwcD92aWV3PW1zdmMtMT YwJnZpZXdGYWxsYmFja0Zyb209dnMtMjAxOQ) (для начала стоит по нему пробежаться)

Вроде бы я понял, что тебя именно надо, так что можешь попробовать следовать этому гайдику:
1) Сперва тебе надо получить .lib библиотеку для включения в проект, а также заголовки этой библиотеки (.h).
2) Дальше я попытаюсь объяснить как их получить, но потом ты должен их по своему желанию распределить в проекте по папкам. Например создашь папку sdk (ужасная практика, но пусть будет так). Далее в ней создашь папочку MinHook и туда вставишь заголовочные файлы и файл библиотеки по папкам (includes и Libs соответственно). Опять же подмечу - это ужасная практика, я ее не рекомендую даже знать. Желательно так всё распределить, чтобы при подключении можно было видеть откуда эта шняга, к примеру: #include
Ниче сложного нет, но ты наверное потеряешь связь с реальностью после этого. Да и тем более проект не крупный. Так что мое предложение сойдет.

3) Давно не юзал минхук, но вроде помню, что изначально там нету файла либы (.lib). Тебе её надо получить. Идёшь в их репо на github, клонируешь его к себе. Берешь утилитку Cmake, фигачишь туда путь до CMakeList.txt и ставишь output каталог, можешь, к примеру, назвать как build2.0 (практика еще ужаснее, чем прошлая).

По итогу:

p.s: (это всё примеры, я на самом деле ниче не собирал, т.к мне лень. По памяти буду писать)

Тыкаешь Configure с дефолт пресетами, если у тебя жизнь мёдом, то всё будет ок, а если будут траблы, то гугли.
Помочь с пониманием того, какая у тебя жизнь, поможет лог снизу. Если там всё ДАН, то идешь дальше.

4) Идешь в папку build2.0, открываешь солюшн нашего минхука. Вроде minhook.sln или чёт такое, не помню. Собираешь солюшн (решение). Решений там дохуя наскок я помню. Все тебе их собирать вроде не нужно. Но т.к я не помню, что там за решения - собирай всё. Либо ищи minhook project, если он есть там, и собирай его.
Шлёпаешь в папку под названием... ... Если ты нихуя не менял, то она должна называться как конфигурация, под которой ты всё билдил. Debug там, release и вся эта шняга.
Вуаля, там лежит файл либы (статической).
Копируешь этот файл в свой проект в папку sdk\MinHook\Libs\Этотфайл.lib
5) Где ты на*** будешь брать определения функций, если у тебя их нет. Идёшь как Херлок Шолмс искать файл заголовка/ов от минхука в той же папке, куда ты отдельно должен был склонировать их репо с github. Ищешь там папку include, в ней лежит MinHook.h. Копируешь его в свой проект: \свой проект\sdk\MinHook\includes\MinHook.h.
Готово.
6) Тепешь идешь в проект -> Свойства проекта.
Тут у нас есть отдельный котёл для наших либ. Для всего допотопного говна
мелкомягкие (microsoft) предусмотрели отдельные 2 раздела в иерархии свойств
проекта, специально для линковки ДОПОЛНИТЕЛЬНЫХ либ!
Там всё тоже самое, но с оговоркой: либы тут ДОПОЛНИТЕЛЬНЫЕ.
Грубо говоря это и есть те самые 2 котла для наших дополнительных:
- Включаемых каталогов
- Каталогов либ
Они только имеют в названии "допольнительных"!
Расположение:
Доп.каталоги включаемых файлов: C/C++ -> Общие (General) (Сюда ты пихаешь путь sdk\MinHook\includes)
Доп.каталоги либ: Компоновщик (Linker) -> Общие (General) (Сюды пихаешь sdk\MinHook\Libs)
Далее тебе надо задать в Additional Dependency (я *** знает раздел, т.к вс не открыта). Поищи. Добавляешь название либы, которую ты получил с окончанием .lib
7) Идешь в файл с энтри поинтом или куда тебе там надо. В main.h может быть, я *** знает. И добавляешь MinHook.h
Плюсом через прагма комментируешь объектный файл (про объектник тебе знать не надо, но ты делаешь именно это, эта препроцессорная директива оставит коммент для объектника о том: какое название либы, юзер коммент (то самое название либы), версия компилятора, опции для линкера и т.п) (#pragma comment(lib, "название_либы.lib")). И всё, можешь юзать всё из минхуков.

Хочу подметить. Собирая это всё через gcc, он тебя пошлёт на***, т.к pragma comment - это фишка МелкоМягких.

8) Этот гайд написан новичком для новичка с целью осветить некоторые моменты, и самому въебать время на написание этой статьи. Но прийдется погуглить местами, т.к я наверное не всё описал.
Хочу чтобы меня крутые дяди по 15 лет, которые шарят больше, чем я, и могут что-то дополнить, - сделать это. Хочу посмотреть чего я не знаю и просветиться.

upd: по итогу я решил её собрать и подключить... BTW, эта d после разрядки - це debug версия значит.

А ваще юзайте детур от мелкомягких, чё вы как лопухи.
p.s: объезд.lib топ!

src:
- github minhook (https://github.com/TsudaKageyu/minhook)
- кодпроджект (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cuY29kZXByb2plY3QuY29tL0FydGljbGVzLz Q0MzI2L01pbkhvb2stVGhlLU1pbmltYWxpc3RpYy14LXgtQVBJ LUhvb2tpbmctTGlicmE) (тут можно глянуть как в коде выглядит комментирование либы для объектника и юзание)
- факин гуд тред о минхуке (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cudW5rbm93bmNoZWF0cy5tZS9mb3J1bS9wcm 9ncmFtbWluZy1mb3ItYmVnaW5uZXJzLzQyNDMzMC1ob29rLWZ1 bmN0aW9ucy5odG1s) (старый вроде, p.s: забыл глянуть дату поста, перед тем как закрыть вкладку)


В папке build2.0 не появилось файла с расширением .sln. Уточните, в CMake в поле исходников нужно указывать папку, скачанную из ГитХаба или что-то другое? Я скачал архив и распаковал minhook-master в проект в папку SDK, теперь в папке SDK\Minhook всего четыре папки и один документ: Libs, Includes, build2.0, minhook-master и CMakeLists.txt. Зачем там Libs и Includes — пока непонятно.

.deserve
06.04.2021, 11:37
В папке build2.0 не появилось файла с расширением .sln. Уточните, в CMake в поле исходников нужно указывать папку, скачанную из ГитХаба или что-то другое? Я скачал архив и распаковал minhook-master в проект в папку SDK, теперь в папке SDK\Minhook всего четыре папки и один документ: Libs, Includes, build2.0, minhook-master и CMakeLists.txt. Зачем там Libs и Includes — пока непонятно.


1) Да, объяснил ниже.

2) Ты не так разбил по папкам. Надо иначе, ниже объяснил.

Проект с гитхаба тебе нужно просто распаковать в любую другою папку. Но не в проект! И уж тем более не в SDK. SDK - это софт для разработки. Грубо говоря зависимости. Эта папка для зависимостей. А уже в ней есть папки MinHook и в ней Libs и includes. Ты должен собрать либу, которая у тебя должна быть абсолютно в другой папке. После чего ты получаешь файл либы и ищешь в папке github проекта хидер файлы .h. Их ты раскидываешь УЖЕ В СВОЙ проект в папку зависимостей - в нашем случае SDK/MinHook/Libs (для .lib), а SDK/MinHook/includes (для .h).

Почему в build2.0 не появилось файла sln? Перепроверьте то, как вы указали пути в Cmake. Там где source - там должен быть путь до папки github проекта. Там где папка для сбилженых бинарников - там указываешь тот же путь, но создаешь новую папку (но она вроде и сама должна создаться). Например build2.0.

Далее конфигурируешь через кнопку configure, там выбираешь версию vs которая у тебя стоит. После конфигурации нажимаешь Generate. Смотришь в лог снизу, чтобы было всё окей. Далее идешь в папку и там ищешь sln. Всё, дальше всё в гайде.

Ya Zaregalsya
11.04.2021, 17:12
1) Да, объяснил ниже.
2) Ты не так разбил по папкам. Надо иначе, ниже объяснил.

Проект с гитхаба тебе нужно просто распаковать в любую другою папку. Но не в проект! И уж тем более не в SDK. SDK - это софт для разработки. Грубо говоря зависимости. Эта папка для зависимостей. А уже в ней есть папки MinHook и в ней Libs и includes. Ты должен собрать либу, которая у тебя должна быть абсолютно в другой папке. После чего ты получаешь файл либы и ищешь в папке github проекта хидер файлы .h. Их ты раскидываешь УЖЕ В СВОЙ проект в папку зависимостей - в нашем случае SDK/MinHook/Libs (для .lib), а SDK/MinHook/includes (для .h).

Почему в build2.0 не появилось файла sln? Перепроверьте то, как вы указали пути в Cmake. Там где source - там должен быть путь до папки github проекта. Там где папка для сбилженых бинарников - там указываешь тот же путь, но создаешь новую папку (но она вроде и сама должна создаться). Например build2.0.
Далее конфигурируешь через кнопку configure, там выбираешь версию vs которая у тебя стоит. После конфигурации нажимаешь Generate. Смотришь в лог снизу, чтобы было всё окей. Далее идешь в папку и там ищешь sln. Всё, дальше всё в гайде.


Как собрать 32-битную версию?

Ya Zaregalsya
11.04.2021, 17:13
1) Да, объяснил ниже.
2) Ты не так разбил по папкам. Надо иначе, ниже объяснил.

Проект с гитхаба тебе нужно просто распаковать в любую другою папку. Но не в проект! И уж тем более не в SDK. SDK - это софт для разработки. Грубо говоря зависимости. Эта папка для зависимостей. А уже в ней есть папки MinHook и в ней Libs и includes. Ты должен собрать либу, которая у тебя должна быть абсолютно в другой папке. После чего ты получаешь файл либы и ищешь в папке github проекта хидер файлы .h. Их ты раскидываешь УЖЕ В СВОЙ проект в папку зависимостей - в нашем случае SDK/MinHook/Libs (для .lib), а SDK/MinHook/includes (для .h).

Почему в build2.0 не появилось файла sln? Перепроверьте то, как вы указали пути в Cmake. Там где source - там должен быть путь до папки github проекта. Там где папка для сбилженых бинарников - там указываешь тот же путь, но создаешь новую папку (но она вроде и сама должна создаться). Например build2.0.
Далее конфигурируешь через кнопку configure, там выбираешь версию vs которая у тебя стоит. После конфигурации нажимаешь Generate. Смотришь в лог снизу, чтобы было всё окей. Далее идешь в папку и там ищешь sln. Всё, дальше всё в гайде.


И на будущее. Обязательно ли проводить все эти манипуляции с CMake если есть готовые .sln и .lib файлы из проекта другого разработчика, как в данном случае?

legendabrn
11.04.2021, 20:11
Код:






urmem::hook urmemHookAimingCoords;
void __fastcall UpdateAimingCoors(void* _this, void* edx, CVector const* AimingTargetCoors)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors");
SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors. posX: %f; posY: %f; posZ: %f",
AimingTargetCoors->fX,
AimingTargetCoors->fY,
AimingTargetCoors->fZ);
urmemHookAimingCoords.call(_this, AimingTargetCoors);
}

urmem::hook urmemHookDoBulletImpact;
void __fastcall DoBulletImpact(void* _this, void* edx, CEntity* owner, CEntity* victim, CVector* startPoint, CVector* endPoint,CColPoint* colPoint, int arg5)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact");
SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact. posX: %f; posY: %f; posZ: %f",
endPoint->fX,
endPoint->fY,
endPoint->fZ);
urmemHookDoBulletImpact.call(_this, owner, victim, startPoint, endPoint, colPoint, arg5);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
switch (dwReasonForCall)
{
case DLL_PROCESS_ATTACH:
SF->initPlugin(mainloop, hModule);
urmemHookAimingCoords.install(0x50CB10, urmem::get_func_addr(&UpdateAimingCoors));
urmemHookDoBulletImpact.install(0x73B550, urmem::get_func_addr(&DoBulletImpact));
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
urmemHookAimingCoords.disable();
urmemHookDoBulletImpact.disable();
break;
}
return TRUE;
}




так же посмотри какой там пролог, по стандарту должен быть 5

Ya Zaregalsya
12.04.2021, 00:10
Код:






urmem::hook urmemHookAimingCoords;
void __fastcall UpdateAimingCoors(void* _this, void* edx, CVector const* AimingTargetCoors)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors");
SF->getSAMP()->getChat()->AddChatMessage(-1, "UpdateAimingCoors. posX: %f; posY: %f; posZ: %f",
AimingTargetCoors->fX,
AimingTargetCoors->fY,
AimingTargetCoors->fZ);
urmemHookAimingCoords.call(_this, AimingTargetCoors);
}

urmem::hook urmemHookDoBulletImpact;
void __fastcall DoBulletImpact(void* _this, void* edx, CEntity* owner, CEntity* victim, CVector* startPoint, CVector* endPoint,CColPoint* colPoint, int arg5)
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact");
SF->getSAMP()->getChat()->AddChatMessage(-1, "DoBulletImpact. posX: %f; posY: %f; posZ: %f",
endPoint->fX,
endPoint->fY,
endPoint->fZ);
urmemHookDoBulletImpact.call(_this, owner, victim, startPoint, endPoint, colPoint, arg5);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
switch (dwReasonForCall)
{
case DLL_PROCESS_ATTACH:
SF->initPlugin(mainloop, hModule);
urmemHookAimingCoords.install(0x50CB10, urmem::get_func_addr(&UpdateAimingCoors));
urmemHookDoBulletImpact.install(0x73B550, urmem::get_func_addr(&DoBulletImpact));
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
urmemHookAimingCoords.disable();
urmemHookDoBulletImpact.disable();
break;
}
return TRUE;
}




так же посмотри какой там пролог, по стандарту должен быть 5


Пролог?

Musaigen
12.04.2021, 00:56
Пролог?





С Redirect хуками мы разобрались, теперь расскажу о Trampoline.
Trampoline от Redirect кардинально отличается. Если Redirect просто подменяет релативный адрес команды вызова или прыжка, то Trampoline взаимодействует с прологом функции.
Что такое пролог функции? Пролог функции - первые несколько байт функции, которые подготавливают стек, пушат регистры.
У пролога есть свой эпилог. Эпилог отличается тем, что он располагается в конце функции, и восстанавливает стек и регистры до того состояния, которое было до вызова.
Расскажу на примере функции void __cdecl CTimer__Update(void):

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

Логика трамплин хука заключается в том, чтобы этот самый пролог сохранить в отдельную функцию, занопить весь пролог, поставить там прыжок на нашу функцию, в нашей функции вызвать ту, в которой мы сохранили пролог, и вдобавок приписать туда прыжок обратно.
Получается так: вместо пролога, jmp -> наша_функция -> jmp трамплин -> jmp обратно (+1, чтобы не было рекурсии).