
13.08.2021, 21:55
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от SC6UT
Да-да, ещё один класс для хуков, он самый.
Особенности:
- Возможность выгрузки хука при любой ситуации, не ломая цепочку вызовов хуков.- Трамплин передается первым аргументом в хукнутую функцию, что позволяет не создавать глобальных объектов и переменных.- Автоматическое определение размера хука.
Пример:
Хук CChat::AddEntry:
Код:
using
AddEntry
=
int
(
__thiscall
*
)
(
void
*
,
int
,
const
char
*
,
const
char
*
,
uint32_t
,
uint32_t
)
;
int
__fastcall
hookedAddEntry
(
void
*
ecx
,
void
*
,
AddEntry oAddEntry
,
const
char
*
text
,
const
char
*
prefix
,
uint32_t
color
,
uint32_t
prefixColor
)
{
// Do your stuff
return
oAddEntry
(
ecx
,
text
,
prefix
,
color
,
prefixColor
)
;
}
LemonHook
::
Hook _addEntryHook
{
0x64010
,
"samp"
}
;
_addEntryHook
.
install
(
hookedAddEntry
)
;
В этом примере, хукается функция класса CChat - AddEntry, находящаяся в динамической библиотеке samp.dll. На 3 строчке видно, что помимо параметров самой функции и регистра EDX, добавился так же указатель на трамплин для вызова оригинальной функции.
Source:
NIKITA / LemonHook
GitLab.com
gitlab.com
Используйте код из примеров и получите UB и ошибки компиляции в подарок!
__thiscall* недопустим на MSVC, но GCC позволяет.
А еще AddEntry имеет 6 параметров, а вызываешь ты его с 5 параметрами.
Хоть проверил бы код
Имена начинающиеся на _ и __ зарезервированы под нужды компилятора.
А еще лучше второму параметру дать имя, ибо компилятор можно похерить регистр неиспользуемого аргумента, он же внутри функции не нужен?(хотя в целом он не должен такие оптимизации производить над функциями у которых берется адрес, но все же -O3 на GCC(MinGW) может все похерить)
|
|
|