Приветствую. В данной статье расскажу
Virtual Method Table Hooks или просто VMT хуки.
В движке игры CSGO есть виртуальные классы - интерфейсы,
в которых находятся различные методы.
Пример:
Класс, в котором есть хоть одна виртуальная функция, имеет виртуальную таблицу.
Указатель на которую можно получить так
Виртуальная таблица по сути своей - это массив 4 байтных указатель для x32 и
8 байтных для x64 соответственно.
Пример вызова виртуальной функции через
каст указателя на неё к тайпдефу.
Создаём тайпдеф данной функции. Используем __fastcall
т.к. в нём параметры передаются через регистры
ECX, EDX , как раз указатель на класс передаётся через
регистр ECX соответственно для соглашения __thiscall.
Далее к объекту тайпдефа кастим указатель на нулевую
виртуальную функцию в виртуальной таблице, проверяем на валидность и вызываем.
Вы уже могли начать догадываться о том, что указатель внутри
виртуальной таблицы можно подменить на свою функцию тем самым
установив хук (как и делают VMT hooks библиотеки).
Пример:
Получаем указатель на начало виртуальной таблицы.
Ставим флаг на память, чтобы разрешить нам писать туда.
Подменяем указатель на оригинальный метод указателем на нашу
hook - функцию, которая имеет прототип оригинальной функции с соглашением
__fatscall (объяснял выше).
Также нужно делать трамполайн - возврат оригинального адреса, а то
будет краш. Делается это также как и ставится хук.
Разбирайтесь)