sc6ut
13.08.2021, 20:20
да-да, ещё один класс для хуков, он самый.
особенности:
- возможность выгрузки хука при любой ситуации, не ломая цепочку вызовов хуков.- трамплин передается первым аргументом в хукнутую функцию, что позволяет не создавать глобальных объектов и переменных.- автоматическое определение размера хука.- поддержка лямбд, колбеков-методов (спиздил у @SR_team (https://www.blast.hk/members/11231/)).- поддержка cdecl, stdcall, thiscall.
примеры:
хук CChat::AddEntry:
using
add_entry_t
=
int
(
__thiscall
*
)
(
void
*
,
int
,
const
char
*
,
const
char
*
,
std
::
uint32_t
,
std
::
uint32_t
)
;
lemon
::
detour
add_entry_hook
(
0x64010
,
"samp.dll"
)
;
// пример с обычной функцией
int
add_entry
(
add_entry_t orig
,
void
*
this_ptr
,
int
type
,
const
char
*
text
,
const
char
*
prefix
,
std
::
uint32_t
text_color
,
std
::
uint32_t
prefix_color
)
{
// do your stuff
return
orig
(
this_ptr
,
type
,
text
,
prefix
,
text_color
,
prefix_color
)
;
}
add_entry_hook
.
install
(
add_entry
)
;
// пример с лямбдой
add_entry_hook
.
install
(
[
]
(
auto
orig
,
void
*
this_ptr
,
int
type
,
const
char
*
text
,
const
char
*
prefix
,
std
::
uint32_t
text_color
,
std
::
uint32_t
prefix_color
)
->
int
{
// do your stuff
return
orig
(
this_ptr
,
type
,
text
,
prefix
,
text_color
,
prefix_color
)
;
}
)
;
// пример с колбеком-методом
struct
ex
{
int
add_entry
(
add_entry_t orig
,
void
*
this_ptr
,
int
type
,
const
char
*
text
,
const
char
*
prefix
,
std
::
uint32_t
text_color
,
std
::
uint32_t
prefix_color
)
{
// do your stuff
return
orig
(
this_ptr
,
type
,
text
,
prefix
,
text_color
,
prefix_color
)
;
}
}
;
ex obj
;
add_entry_hook
.
install
(
std
::
make_tuple
(
&
obj
,
&
ex
::
add_entry
)
)
;
в этих примерах, хукается функция класса CChat - AddEntry, находящаяся в динамической библиотеке samp.dll. в параметрах каждого из колбеков видно, что помимо оригинальных аргументов функции она так же получает трамплин для вызова оригинальной функции.
планы на будущее:
- x64 support.- класс для хуков любого места (что-то вроде SRHook'ов @SR_team (https://www.blast.hk/members/11231/)).- (maybe?) linux support (пока не знаю зачем).
src:
NIKITA / LemonHook (https://gitlab.com/sc6ut/lemonhook)
GitLab.com
gitlab.com
особенности:
- возможность выгрузки хука при любой ситуации, не ломая цепочку вызовов хуков.- трамплин передается первым аргументом в хукнутую функцию, что позволяет не создавать глобальных объектов и переменных.- автоматическое определение размера хука.- поддержка лямбд, колбеков-методов (спиздил у @SR_team (https://www.blast.hk/members/11231/)).- поддержка cdecl, stdcall, thiscall.
примеры:
хук CChat::AddEntry:
using
add_entry_t
=
int
(
__thiscall
*
)
(
void
*
,
int
,
const
char
*
,
const
char
*
,
std
::
uint32_t
,
std
::
uint32_t
)
;
lemon
::
detour
add_entry_hook
(
0x64010
,
"samp.dll"
)
;
// пример с обычной функцией
int
add_entry
(
add_entry_t orig
,
void
*
this_ptr
,
int
type
,
const
char
*
text
,
const
char
*
prefix
,
std
::
uint32_t
text_color
,
std
::
uint32_t
prefix_color
)
{
// do your stuff
return
orig
(
this_ptr
,
type
,
text
,
prefix
,
text_color
,
prefix_color
)
;
}
add_entry_hook
.
install
(
add_entry
)
;
// пример с лямбдой
add_entry_hook
.
install
(
[
]
(
auto
orig
,
void
*
this_ptr
,
int
type
,
const
char
*
text
,
const
char
*
prefix
,
std
::
uint32_t
text_color
,
std
::
uint32_t
prefix_color
)
->
int
{
// do your stuff
return
orig
(
this_ptr
,
type
,
text
,
prefix
,
text_color
,
prefix_color
)
;
}
)
;
// пример с колбеком-методом
struct
ex
{
int
add_entry
(
add_entry_t orig
,
void
*
this_ptr
,
int
type
,
const
char
*
text
,
const
char
*
prefix
,
std
::
uint32_t
text_color
,
std
::
uint32_t
prefix_color
)
{
// do your stuff
return
orig
(
this_ptr
,
type
,
text
,
prefix
,
text_color
,
prefix_color
)
;
}
}
;
ex obj
;
add_entry_hook
.
install
(
std
::
make_tuple
(
&
obj
,
&
ex
::
add_entry
)
)
;
в этих примерах, хукается функция класса CChat - AddEntry, находящаяся в динамической библиотеке samp.dll. в параметрах каждого из колбеков видно, что помимо оригинальных аргументов функции она так же получает трамплин для вызова оригинальной функции.
планы на будущее:
- x64 support.- класс для хуков любого места (что-то вроде SRHook'ов @SR_team (https://www.blast.hk/members/11231/)).- (maybe?) linux support (пока не знаю зачем).
src:
NIKITA / LemonHook (https://gitlab.com/sc6ut/lemonhook)
GitLab.com
gitlab.com