Исходник kthook - x86 hooking library

kin4stat

mq-team
Автор темы
Всефорумный модератор
2,730
4,710
Хайповая обнова мужики зацените.

Из мелочей: фикс бага на naked хуках, фикс установки хука на call опкод.

Ну, а теперь к крутым новостям.

Добавил враппер на коллбэки с большим количество аргументов. Допустим мы хотим захукать такую функцию:
C++:
using CCoronas_RegisterCorona = void(__cdecl*)(unsigned int id, CEntity* attachTo, unsigned char red,
                                                   unsigned char green, unsigned char blue, unsigned char alpha,
                                                   const CVector& posn, float radius, float farClip,
                                                   eCoronaType coronaType, eCoronaFlareType flaretype,
                                                   bool enableReflection, bool checkObstacles, int _param_not_used,
                                                   float angle, bool longDistance, float nearClip,
                                                   unsigned char fadeState, float fadeSpeed, bool onlyFromBelow,
                                                   bool reflectionDelay);

И из этого всего списка нам нужен только параметр fadeSpeed. Если использовать хуки по обычному, тогда придется описывать все аргументы, и это неудобно.

И приходилось делать это вот так:
C++:
register_corona_hook.set_cb([](const auto& hook, unsigned int id, CEntity* attachTo, unsigned char red,
                               unsigned char green, unsigned char blue, unsigned char alpha,
                               const CVector& posn, float radius, float farClip,
                               eCoronaType coronaType, eCoronaFlareType flaretype,
                               bool enableReflection, bool checkObstacles, int _param_not_used,
                               float angle, bool longDistance, float nearClip,
                               unsigned char fadeState, loat fadeSpeed, bool onlyFromBelow,
                               bool reflectionDelay) {

    if (fade_speed == 1.0f)
        return hook.get_trampoline()(id, attachTo, red, green, blue, alpha, posn, radius, farClip, coronaType,
                                     flaretype, enableReflection, checkObstacles, _param_not_used, angle,
                                     longDistance, nearClip, fadeState, 15.0f, onlyFromBelow, reflectionDelay);
    else
        return hook.call_trampoline(id, attachTo, red, green, blue, alpha, posn, radius, farClip, coronaType,
                                    flaretype, enableReflection, checkObstacles, _param_not_used, angle,
                                    longDistance, nearClip, fadeState, fadeSpeed, onlyFromBelow, reflectionDelay);
});


Поэтому теперь можно сделать так:
C++:
register_corona_hook.set_cb_wrapped([](const auto& hook, kthook::take<18>&& v18, float fade_speed, kthook::take<2>&& v20_v21) {
    if (fade_speed == 1.0f)
        return hook.call_trampoline(v18, 15.0f, v20_v21);
    else
        return hook.call_trampoline(v18, fade_speed, v20_v21);
});

Т.е. неиспользуемые первые 18 аргументов закидываются в v18, fade_speed закидывается по обычному, и последние 2 аргумента закидываются в v20_v21.

Заметно меньше ручной писанины, сразу видно что происходит, ну и следовательно меньше шанс ошибки. Круто же?

Ну и чтобы вызвать трамплин, нужно вызвать call_trampoline и передать туда все заглушки. В обычных хуках call_trampoline вызвать тоже можно, но компиляция замедлится.

Ну и пока вы побежали ставить лайки и звездочки на гитхаб, я расскажу об ограничениях.

Коллбэк к хуку не может быть шаблонным. Только первый ее аргумент(т.е. объект хука). Попробую это обойти в ближайшее время конечно, но не факт что выйдет

Ну а еще, не забывайте указывать && у kthook::take, иначе все сломается
 
Последнее редактирование:
  • Вау
  • Влюблен
Реакции: Receiver и legendabrn

Yuriy Code

Известный
754
928
Я просто в ахуе, как это сложно... 😣
А ещё я в этих хуках и реверсе нихуя не понимаю, это просто пиздец. 😕
Где можно научиться? 🙄

Хочется плакать... 🙁😐
 

sc6ut

неизвестный
Модератор
382
1,075
Я просто в ахуе, как это сложно... 😣
А ещё я в этих хуках и реверсе нихуя не понимаю, это просто пиздец. 😕
Где можно научиться? 🙄

Хочется плакать... 🙁😐
перестать писать хуету несусветную в каждой теме и научиться гуглить
 
  • Нравится
Реакции: F0RQU1N and

sc6ut

неизвестный
Модератор
382
1,075
По реверсу и хукам нихуя в гугле нет. ☹️
А если и есть единицы результатов, то это пиздец сложно и непонятно...
получается все люди которые знают как реверсить сами к этому пришли? никто не переизобритал велосипед. ты не умеешь гуглить, поэтому я тебе и сказал сначала обучиться этому
 

Yuriy Code

Известный
754
928
получается все люди которые знают как реверсить сами к этому пришли? никто не переизобритал велосипед. ты не умеешь гуглить, поэтому я тебе и сказал сначала обучиться этому
Ты так пишешь, будь то сам реверсить знаешь как и разбираешься в этом. Это разве так?
 

sc6ut

неизвестный
Модератор
382
1,075
Ты так пишешь, будь то сам реверсить знаешь как и разбираешься в этом. Это разве так?
а нахуя ты на меня переключаешься? даже в смоделированной ситуации, где я не знаком с реверсингом, в том что ты пишешь нет ни логики, ни смысла.
 
  • Нравится
Реакции: F0RQU1N and

Yuriy Code

Известный
754
928
пиздабол получается)0))xd)
Сложноооооооо.

а нахуя ты на меня переключаешься? даже в смоделированной ситуации, где я не знаком с реверсингом, в том что ты пишешь нет ни логики, ни смысла.
Ок, прошу прощения.

Да ну нафиг эти хуи и реверс, тьфу блин! Хуки и реверс.

Пойду в Far Cry 5 поиграю...