Вопрос Как получить виртуальные таблицы

Начинающий
Статус
Оффлайн
Регистрация
24 Июн 2019
Сообщения
22
Реакции[?]
2
Поинты[?]
0
Доброй ночи, интересует такой вопросик, возможно ли получить виртуальные таблицы с помощью хука интерефейса(любого) к примеру из client.dll ?
Вот хук:
C++:
class In {
public:
    CSource2Client* client;

} interfaces;
void main(){
    
    CSource2Client* client;auto a = new lib("client.dll");

    interfaces.client = a->LoadInterface<CSource2Client>("Source2Client002");
}
хочу получить виртуальные функции класса CSource2Client
 
Начинающий
Статус
Оффлайн
Регистрация
24 Июн 2019
Сообщения
22
Реакции[?]
2
Поинты[?]
0
sex
Забаненный
Статус
Оффлайн
Регистрация
4 Окт 2017
Сообщения
1,071
Реакции[?]
160
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
24 Июн 2019
Сообщения
22
Реакции[?]
2
Поинты[?]
0
sex
Забаненный
Статус
Оффлайн
Регистрация
4 Окт 2017
Сообщения
1,071
Реакции[?]
160
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Индексы в помощь
 
Начинающий
Статус
Оффлайн
Регистрация
24 Июн 2019
Сообщения
22
Реакции[?]
2
Поинты[?]
0
Ты хочешь вызвать функции вт?
я тут нашел виртуальные функции класса C_DOTAPlayer, но меня смущает один момент, как я знаю функции находяшиеся в классе первым параметром должны принимать указатель на этот класс, а в этих функциях такого нет, мне стоит волноваться на этот счет ?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
насколько я понял ты хочешь символы для каких-то классов? если да хз где достать новые, есть только старые маковские бинарки посмотри на uc, если тебе нужны не символы а вмт то да, создаешь интерфейс и получаешь указатель на класс. первая ячейка(8 байт) этого класса и будет вмт, то есть
адрес |содержимое
ClassPtr | vmt*
ClassPtr+8|какие-то данные
чтобы получить вмт ты берешь ClassPtr и дереференсишь его *(unsigned long long*)ClassPtr, имеешь вмт. прибавляешь байтики(индекс функции, то есть какая функция по счету умножить на размер указателя(8 байт на х64)), дереференсишь и получаешь нужную тебе функцию
например:
C++:
CEngineClient = (ui)CreateInterface<void*>("engine2.dll", "Source2EngineToClient001");
    InGame = (IsInGame)
        *(ui*)(
            *(ui*)(CEngineClient)//дереференс указателя на класс
            + 8 * 26//я получил ячейку где хранится 26-я по счету функция если считать с 0
            );//дереференс ячейки где хранится вышеупомянутая функция и получение места где хранятся инструкции этой функции
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
я тут нашел виртуальные функции класса C_DOTAPlayer, но меня смущает один момент, как я знаю функции находяшиеся в классе первым параметром должны принимать указатель на этот класс, а в этих функциях такого нет, мне стоит волноваться на этот счет ?
поставь бп на любую виртуальную функцию и убедишься что в rcx лежит указатель на класс. потому что компилятор собирает программу так чтобы этот указатель засовывался в rcx до вызова функции. а то что ты видишь в ида это не всегда правда, доверяй но проверяй дебаггером
 
Начинающий
Статус
Оффлайн
Регистрация
24 Июн 2019
Сообщения
22
Реакции[?]
2
Поинты[?]
0
насколько я понял ты хочешь символы для каких-то классов? если да хз где достать новые, есть только старые маковские бинарки посмотри на uc, если тебе нужны не символы а вмт то да, создаешь интерфейс и получаешь указатель на класс. первая ячейка(8 байт) этого класса и будет вмт, то есть
адрес |содержимое
ClassPtr | vmt*
ClassPtr+8|какие-то данные
чтобы получить вмт ты берешь ClassPtr и дереференсишь его *(unsigned long long*)ClassPtr, имеешь вмт. прибавляешь байтики(индекс функции, то есть какая функция по счету умножить на размер указателя(8 байт на х64)), дереференсишь и получаешь нужную тебе функцию
например:
C++:
CEngineClient = (ui)CreateInterface<void*>("engine2.dll", "Source2EngineToClient001");
    InGame = (IsInGame)
        *(ui*)(
            *(ui*)(CEngineClient)//дереференс указателя на класс
            + 8 * 26//я получил ячейку где хранится 26-я по счету функция если считать с 0
            );//дереференс ячейки где хранится вышеупомянутая функция и получение места где хранятся инструкции этой функции
Огромное спасибо за помощь, завтра непременно попробую <3
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Огромное спасибо за помощь, завтра непременно попробую <3
ui это unsigned long long если что, то есть 8 байт целочисленное. указатель это просто число, поэтому с ним всегда можно работать как с числом - прибавлять вычитать и т.д.
 
Начинающий
Статус
Оффлайн
Регистрация
24 Июн 2019
Сообщения
22
Реакции[?]
2
Поинты[?]
0
ui это unsigned long long если что, то есть 8 байт целочисленное. указатель это просто число, поэтому с ним всегда можно работать как с числом - прибавлять вычитать и т.д.
а что такое
InGame, isinGame ?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
а что такое
InGame, isinGame ?
функция чтобы проверить находится ли игрок в матче. InGame это переменная типа IsInGame, а IsInGame это прототип функции - указатель на функцию конвенции __fastcall без параметров с возвратом типа unsigned long long:
typedef ui(__fastcall* IsInGame)();
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
функция чтобы проверить находится ли игрок в матче. InGame это переменная типа IsInGame, а IsInGame это прототип функции - указатель на функцию конвенции __fastcall без параметров с возвратом типа unsigned long long:
typedef ui(__fastcall* IsInGame)();
вообще по факту это __thiscall(виртуальная функция же) и нужно бы засунуть CEngineClient первым параметром у __fastcall, но эта функция исключение - так как в ней никак не используется rcx, то и пихать его туда смысла нет.(другими словами, данной функции не нужно тыкать в лицо CEngineClientом, она либо его сама находит, либо им ваще не пользуется)
 
Начинающий
Статус
Оффлайн
Регистрация
24 Июн 2019
Сообщения
22
Реакции[?]
2
Поинты[?]
0
вообще по факту это __thiscall(виртуальная функция же) и нужно бы засунуть CEngineClient первым параметром у __fastcall, но эта функция исключение - так как в ней никак не используется rcx, то и пихать его туда смысла нет.(другими словами, данной функции не нужно тыкать в лицо CEngineClientом, она либо его сама находит, либо им ваще не пользуется)
Все получилось, спасибо огромное.
 
Похожие темы
Сверху Снизу