Исходник [x86] lemonhook

sc6ut

неизвестный
Автор темы
Модератор
382
1,075
да-да, ещё один класс для хуков, он самый.


особенности:
- возможность выгрузки хука при любой ситуации, не ломая цепочку вызовов хуков.​
- трамплин передается первым аргументом в хукнутую функцию, что позволяет не создавать глобальных объектов и переменных.​
- автоматическое определение размера хука.​
- поддержка лямбд, колбеков-методов (спиздил у @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));
в этих примерах, хукается функция класса CChat - AddEntry, находящаяся в динамической библиотеке samp.dll. в параметрах каждого из колбеков видно, что помимо оригинальных аргументов функции она так же получает трамплин для вызова оригинальной функции.


планы на будущее:
- x64 support.​
- класс для хуков любого места (что-то вроде SRHook'ов @SR_team).​
- (maybe?) linux support (пока не знаю зачем).​


src:
 
Последнее редактирование:

kin4stat

mq-team
Всефорумный модератор
2,730
4,709
Да-да, ещё один класс для хуков, он самый.


Особенности:
- Возможность выгрузки хука при любой ситуации, не ломая цепочку вызовов хуков.​
- Трамплин передается первым аргументом в хукнутую функцию, что позволяет не создавать глобальных объектов и переменных.​
- Автоматическое определение размера хука.​


Пример:
Хук 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:
Используйте код из примеров и получите UB и ошибки компиляции в подарок!
__thiscall* недопустим на MSVC, но GCC позволяет.
А еще AddEntry имеет 6 параметров, а вызываешь ты его с 5 параметрами.
Хоть проверил бы код
Имена начинающиеся на _ и __ зарезервированы под нужды компилятора.
А еще лучше второму параметру дать имя, ибо компилятор можно похерить регистр неиспользуемого аргумента, он же внутри функции не нужен?(хотя в целом он не должен такие оптимизации производить над функциями у которых берется адрес, но все же -O3 на GCC(MinGW) может все похерить)
 

sc6ut

неизвестный
Автор темы
Модератор
382
1,075
Используйте код из примеров и получите UB и ошибки компиляции в подарок!
__thiscall* недопустим на MSVC, но GCC позволяет.
??
А еще AddEntry имеет 6 параметров, а вызываешь ты его с 5 параметрами.
Хоть проверил бы код
проверял. не заметил, что проебал 1 параметр, так как код не копировал из проекта.
А еще лучше второму параметру дать имя, ибо компилятор можно похерить регистр неиспользуемого аргумента, он же внутри функции не нужен?(хотя в целом он не должен такие оптимизации производить над функциями у которых берется адрес, но все же -O3 на GCC(MinGW) может все похерить)
этого не знал, спасибо.
Смотрю на некоторые участки кода и прям дежавю
и в правду смотрел некоторые вещи там, стоило написать об этом в шапке.
совместить его с минхуком
единственное что взял оттуда это файлы Hacker Disassembler Engine.
 
U

user390868

Гость
он круче гитхаба?
нельзя так рассуждать, потому что у каждой из этих двух вещей есть свои плюс и минусы. и каждый выбирает пользоваться тем, что ему нужно. почитай лучше в интернете разные статьи на эту тему. чем они друг от друга отличаются. может быть тебе @SR_team своё мнение напишет, почему он пользуется именно гитлабом. Но я думаю, что как минимум из-за того, что там нельзя подавать DMCA, в отличии от гитхаба) а у всех вышестоящих над бх челов триггеры на эти жалобы)) поскольку у них дохуя репозиториев калкор забанил. Но это я так думаю. И может быть я ошибаюсь. Всё остальное он тебе может быть напишет
 
  • Нравится
Реакции: loganhackerdff

bottom_text

Известный
673
317
1630670980394.png

Переписал код с твоего скрина и всё равно эта ошибка, сборка ломается , как исправить?
 

sc6ut

неизвестный
Автор темы
Модератор
382
1,075
обновил хуйни вроде меньше, но еще работать, зачем сюда пишу об этом я незнаю мне похуй
кстати с++ 17 а не 20
эксперты напишите что код хуйня и почему (серьезно)
 
  • Нравится
Реакции: Z3roKwq и F0RQU1N and