да-да, ещё один класс для хуков, он самый.
особенности:
примеры:
в этих примерах, хукается функция класса CChat - AddEntry, находящаяся в динамической библиотеке samp.dll. в параметрах каждого из колбеков видно, что помимо оригинальных аргументов функции она так же получает трамплин для вызова оригинальной функции.
планы на будущее:
src:
особенности:
- возможность выгрузки хука при любой ситуации, не ломая цепочку вызовов хуков.
- трамплин передается первым аргументом в хукнутую функцию, что позволяет не создавать глобальных объектов и переменных.
- автоматическое определение размера хука.
- поддержка лямбд, колбеков-методов (спиздил у @SR_team).
- поддержка 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_t> 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));
планы на будущее:
- x64 support.
- класс для хуков любого места (что-то вроде SRHook'ов @SR_team).
- (maybe?) linux support (пока не знаю зачем).
src:
Последнее редактирование: