Руководство
Подробное руководство по эффективному использованию плагина, которое поможет вам максимально использовать его возможности и функциональность.
Динамическое перехватывание C/C++ функций на любом языке
Это плагин, который обеспечивает динамическое перехватывание C++ функций во время выполнения — включая как перехват таблицы виртуальных функций (vtable), так и перехват кода (detour). Он основан на мощной библиотеке polyhook2 и разработан для легкой интеграции в ваш плагин или скриптовую среду.
Это руководство охватывает:
- Перехват detour-функций (по адресу функции)
- Перехват виртуальных функций (по индексу или указателю на функцию)
- Регистрацию пре- и пост-коллбэков
- Проверку и изменение аргументов функций и возвращаемых значений
- Снятие перехватов и управление коллбэками
Основные понятия
Что такое перехват (Hook)?
Перехват — это метод для перехвата вызовов функций. Вы можете:
- Проверять/изменять аргументы функции перед вызовом (pre)
- Наблюдать/изменять возвращаемое значение после вызова (post)
- Переопределять или полностью пропускать исходную функцию (supercede)
Типы перехватов
HookDetour: Перехватывает отдельную или статическую функцию.HookVirtual: Перехватывает метод класса через индекс vtable или указатель на функцию.
Типы данных
Используйте enum DataType для описания типов аргументов и возвращаемых значений:
Используйте их последовательно при описании сигнатур функций для API перехватов.
Перехват функций
1. Detour Hook
Используйте HookDetour для перехвата глобальной/статической функции:
pFunc: Указатель на функцию для перехвата.returnType: Тип возвращаемого значения с использованиемDataType.args: Список типов аргументов.varIndex: Используйте-1для обычных вызовов; установите, если переменное количество аргументов.
Пример:
2. Virtual Hook (по индексу)
Перехват метода из vtable объекта:
Пример:
Вы также можете получить индекс vtable из указателя на функцию:
Получение индекса vtable требует знания структуры класса и может быть непереносимым между различными компиляторами или платформами. Используйте с осторожностью, работает только при использовании C++ или C-подобных языков.
3. Virtual Hook (по указателю на функцию)
Вместо использования индекса vtable:
Снятие перехватов
UnhookDetour(void* pFunc)UnhookVirtual(void* pClass, int index)UnhookVirtualByFunc(void* pClass, void* pFunc)UnhookAll()– удаляет все перехватыUnhookAllVirtual(void* pClass)– удаляет все vtable-перехваты для класса
Система коллбэков
1. Регистрация коллбэка
type:CallbackType::PreилиCallbackType::Posthandler: Указатель на функцию
Сигнатура обработчика:
Используйте это для проверки или изменения аргументов и возвращаемых значений.
2. ReturnAction
Доступ к аргументам и возвращаемому значению
Получение аргументов:
Установка аргументов:
Получение возвращаемого значения:
Переопределение возвращаемого значения:
Полный пример
Перехват int Add(int a, int b) и изменение результата:
Вспомогательные функции
FindDetour,FindVirtual,FindVirtualByFunc: Поиск перехватовAreCallbacksRegistered,IsCallbackRegistered: ИнтроспекцияGetFunctionAddr: Получить указатель на функцию (возможно, перехваченную)GetOriginalAddr: Получить trampoline/исходную функцию
Резюме
| Действие | Функция |
|---|---|
| Hook Detour | HookDetour |
| Hook Virtual (Index) | HookVirtual |
| Hook Virtual (Func) | HookVirtualByFunc |
| Добавить коллбэк | AddCallback |
| Доступ к аргументам | GetArgumentX, SetArgumentX |
| Доступ к возврату | GetReturnX, SetReturnX |
| Снять перехват | UnhookDetour, UnhookVirtual, и т.д. |
| Получить адреса | GetFunctionAddr, GetOriginalAddr |
Используйте это руководство в качестве справочника при разработке с вашим плагином на основе PolyHook. Всегда проверяйте аргументы-указатели и обеспечивайте типобезопасность при приведении типов аргументов или возвращаемых значений.