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

kin4stat

mq-team
Автор темы
Всефорумный модератор
2,731
4,692

kthook​



x86 библиотека для хуков с полной поддержкой функторов, лямбд с захватами и прочих

Примеры кода:​



C++:
int CFASTCALL func1(float a, float b) {
    print_info(a, b);
    a = 50; b = 100;
    return 5;
}

int main() {
    // func_ptr is pointer to function
    auto func_ptr = &func1;
    // func_type is int(CFASTCALL*)(float, float)
    using func_type = decltype(&func1);
    // Creating simple hook object with function type is template parameter and function pointer in constructor
    kthook::kthook_signal<func_type> hook{ func_ptr };
    // Connecting lambda callback that receiving function arguments by references
    hook.before += [](const auto& hook, float& a, float& b) {
        print_info(a, b);
        return true;
    };
    /*
    [operator () at 31]: a = 30; b = 20
    [func1 at 16 ]: a = 30; b = 20
    */
    func1(30.f, 20.f);
}

C++:
int main() {
    auto func_ptr = &func1;
    using func_type = decltype(&func1);
    kthook::kthook_simple_t<func_type> hook{ func_ptr };
    hook.before.connect([](const auto& hook, float& a, float& b) { 
        print_info(a, b);
        // changing arguments
        a = 50.f, b = 30.f; 
        return true;
        });
    // connect after callback
    hook.after.connect([](const auto& hook, int& return_value, float& a, float& b) {
        print_info(a, b);
        print_return_value(return_value);
        // changing return_value
        return_value = 20;
        return true;
        });
    /*
    [operator () at 31]: a = 30; b = 20
    [func1 at 16 ]: a = 50; b = 30
    [operator () at 34]: a = 50; b = 30
    [operator () at 34]: return_value = 5;
    [main at 20]: return_value = 20;
    */
    auto ret_val = func1(30.f, 20.f);
    print_return_value(ret_val)
}

Остальные примеры можно найти на гитхабе

Download & Source:
 
Последнее редактирование:

kin4stat

mq-team
Автор темы
Всефорумный модератор
2,731
4,692
Теперь production ready.
x86 windows, x86 linux, x64 linux, x64 windows.
Остался одна недоработка на x64 windows, пофикшу в ближайшем будущем
UPD: недоработкой оказался антитампер гта 5
 
Последнее редактирование:
  • Нравится
  • Влюблен
Реакции: sc6ut и etereon

kin4stat

mq-team
Автор темы
Всефорумный модератор
2,731
4,692
Обновил, добавил naked(x86/x64) хуки. Документацию потом как-нибудь обновлю.

Пока представлю короткую сводку, ну и пример из тестов:
Интерфейс как у kthook_simple(т.е. set_dest, set_cb и прочее на месте)
Тип коллбэка - void(const kthook_naked&)
Также доступны две функции, которые можно юзать внутри хука:
get_context и get_return_address

get_context позволяет получить мутабельный контекст, который был захвачен перед вызовом коллбэка внутри хука.
Тип возвращаемого значения - cpu_ctx&, внутри которого лежат все регистры процессора. Можно изменять, изменения применятся после выхода из коллбэка
get_return_address позволяет получить мутабельный адрес возврата, который по умолчанию выставляется на место хука + кол-во байт нужных для хука
Тип возвращаемого значения - std::uintptr_t&, который можно менять. Если изменить - после выхода из коллбэка выполнение перейдет на указанный адрес

 
  • Нравится
  • Влюблен
Реакции: RTD и etereon

Yuriy Code

Известный
755
926
Киня, вот создал ты библиотеку свою, может сделаешь уроки, как самому делать хуки? А то грустно наверное пользоваться готовым кодом.
Мысли людей скорее всего "Эххх, я вот не умею хуки создавать, пользуюсь чужим кодом(((".
И грустно для самого себя использовать чужой код, то есть понимать, что ты так не умеешь и за тебя это сделал другой человек.
 

kin4stat

mq-team
Автор темы
Всефорумный модератор
2,731
4,692
Киня, вот создал ты библиотеку свою, может сделаешь уроки, как самому делать хуки? А то грустно наверное пользоваться готовым кодом.
Мысли людей скорее всего "Эххх, я вот не умею хуки создавать, пользуюсь чужим кодом(((".
И грустно для самого себя использовать чужой код, то есть понимать, что ты так не умеешь и за тебя это сделал другой человек.
На форуме конечно есть мой гайд, но когда я писал вторую его часть, я понял что бесполезно объяснять такую тему вообще, потому что тот кто понимает ассемблер - сам себе хуки забабахает, а тот кто не знает, и не поймет, че там написано ваще
 
  • Нравится
Реакции: Yuriy Code

Yuriy Code

Известный
755
926
На форуме конечно есть мой гайд, но когда я писал вторую его часть, я понял что бесполезно объяснять такую тему вообще, потому что тот кто понимает ассемблер - сам себе хуки забабахает, а тот кто не знает, и не поймет, че там написано ваще
Понимать ассемблер? Имеешь ввиду, что игру саму реверсить, чтобы функции нужные искать?

Уххх, я вообще реверсинг не понимаю. Да и уроков по нему единицы в интернете, думаю.
Может, сделаешь урок по реверсу?
Да и чтобы реверсить, тут программист нервно курит в стороне, наверное, ибо тут надо быть реверс-инженером.
 

legendabrn

Известный
Проверенный
122
172
Киня, вот создал ты библиотеку свою, может сделаешь уроки, как самому делать хуки? А то грустно наверное пользоваться готовым кодом.
Мысли людей скорее всего "Эххх, я вот не умею хуки создавать, пользуюсь чужим кодом(((".
И грустно для самого себя использовать чужой код, то есть понимать, что ты так не умеешь и за тебя это сделал другой человек.
 
  • Нравится
Реакции: Yuriy Code

kin4stat

mq-team
Автор темы
Всефорумный модератор
2,731
4,692
Обновил, пофиксил баг с выравниванием стека на x64
 

kin4stat

mq-team
Автор темы
Всефорумный модератор
2,731
4,692
Устроим сегодня день обнов, хули :D

Проверка check_is_executable теперь работает на unix like системах

Также добавил опцию на заморозку потоков. Чтобы ктхук заморозил потоки прежде чем установить хук - второй шаблонный аргумент нужно выставить в kthook_option::kFreezeThreads
Работает только на linux и windows (x86 и x64)

(Теоретически ктхук работает и на макос, но я не проверял. Если работает, то заморозка потоков на макос не работает)
 

k1zn

О КУ)))
Всефорумный модератор
2,404
2,052
И грустно для самого себя использовать чужой код, то есть понимать, что ты так не умеешь и за тебя это сделал другой человек.