Вопрос Поиск смещений структур

I love C++
Пользователь
Статус
Оффлайн
Регистрация
26 Мар 2021
Сообщения
218
Реакции[?]
46
Поинты[?]
1K
Всем здравствуйте.
Задаюсь вопросом почему такие странные смещения, так ещё и деляться на 8, а в некоторых исходниках на 4.
Как я понял это смещения виртуальных функции класса, можете объяснить как их находить и по возможности как использовать?

C++:
// Один из исходников

namespace _IActor
{
    // static DWORD64 idx_CPlayer = 3344;
    static DWORD64 v_GetCurrentItem = 464 / 8;//++
    static DWORD64 v_GetAnimationGraphState = 296 / 8;//++
    static DWORD64 v_GetHealth = 224 / 8;//?  v8 = (*(int (__fastcall **)(__int64))(*(_QWORD *)v7 + GetHealth))(v7);
    static DWORD64 v_GetMaxHealth = 256 / 8;//? v8 = (*(int (__fastcall **)(__int64))(*(_QWORD *)v7 + GetMaxHealth))(v7);
    static DWORD64 v_GetArmor = 264 / 8;//? v8 = (*(int (__fastcall **)(__int64))(*(_QWORD *)v7 + GetArmor))(v7);
    static DWORD64 v_GetMaxArmor = 272 / 8;//? v8 = (*(int (__fastcall **)(__int64))(*(_QWORD *)v7 + GetMaxArmor))(v7);
    static DWORD64 v_SetViewRotation = 416 / 8;//++
    static DWORD64 v_RecoilAnimation = 736 / 8;
};
 
Начинающий
Статус
Оффлайн
Регистрация
26 Ноя 2018
Сообщения
57
Реакции[?]
18
Поинты[?]
0
Всем здравствуйте.
Задаюсь вопросом почему такие странные смещения, так ещё и деляться на 8, а в некоторых исходниках на 4.
Как я понял это смещения виртуальных функции класса, можете объяснить как их находить и по возможности как использовать?

C++:
// Один из исходников

namespace _IActor
{
    // static DWORD64 idx_CPlayer = 3344;
    static DWORD64 v_GetCurrentItem = 464 / 8;//++
    static DWORD64 v_GetAnimationGraphState = 296 / 8;//++
    static DWORD64 v_GetHealth = 224 / 8;//?  v8 = (*(int (__fastcall **)(__int64))(*(_QWORD *)v7 + GetHealth))(v7);
    static DWORD64 v_GetMaxHealth = 256 / 8;//? v8 = (*(int (__fastcall **)(__int64))(*(_QWORD *)v7 + GetMaxHealth))(v7);
    static DWORD64 v_GetArmor = 264 / 8;//? v8 = (*(int (__fastcall **)(__int64))(*(_QWORD *)v7 + GetArmor))(v7);
    static DWORD64 v_GetMaxArmor = 272 / 8;//? v8 = (*(int (__fastcall **)(__int64))(*(_QWORD *)v7 + GetMaxArmor))(v7);
    static DWORD64 v_SetViewRotation = 416 / 8;//++
    static DWORD64 v_RecoilAnimation = 736 / 8;
};
В некоторых делится на 4 потому-что игрока раньше была 32 битная, а щас делится на 8 потому что игра стала 64 битной
 
I love C++
Пользователь
Статус
Оффлайн
Регистрация
26 Мар 2021
Сообщения
218
Реакции[?]
46
Поинты[?]
1K
В некоторых делится на 4 потому-что игрока раньше была 32 битная, а щас делится на 8 потому что игра стала 64 битной
Это я понимаю почему 4 и 8, но почему (смещение / 8) не особо понимаю
 
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
I love C++
Пользователь
Статус
Оффлайн
Регистрация
26 Мар 2021
Сообщения
218
Реакции[?]
46
Поинты[?]
1K
ты не понимаешь почему делится на 8 или как узнать что индекс должен делится на 8?
Раньше я не встречал что смещение делят на размер тип данных(8 в случае с варфейс x64). Почему просто не указать смещение?
Можно сказать я не знаю первого и второго.
 
Забаненный
Статус
Оффлайн
Регистрация
2 Мар 2021
Сообщения
1,083
Реакции[?]
406
Поинты[?]
1K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Раньше я не встречал что смещение делят на размер тип данных(8 в случае с варфейс x64). Почему просто не указать смещение?
Можно сказать я не знаю первого и второго.
если вкраце, определить что перед тобой виртуальный индекс очень просто
допустим найдем GetIGameFramework ( ищем строку sp_difficulty в IDA PRO, переходим по первому сабу и переходим в псевдокод )
1659004370263.png
В нашем случае, v4 = .... + 0x78i64 это и есть виртуальный индекс функции GetIGameFramework. В IDA для определения виртуального индекса используется приставочное i64.

Как нам выйти на это в коде? Для этого используется метод виртуальной таблицы VTable ( он есть в каждой пасте/сурсе )
C++:
template<typename VTable>
VTable Virtual( PVOID Call, DWORD64 Index ) {
    return (*(VTable** )Call )[Index / 8]; // в некоторых сурсах не делят на 8 через код, а делаю это вручную и пишут просто [Index]
}
Теперь, что бы написать функцию GetIGameFramework нам понадобится этим воспользоваться
IGameFramework* GetIGameFramework() { return Virtual<IGameFramework* (__fastcall*)(PVOID64)>(this, 0x78)(this); }
 
I love C++
Пользователь
Статус
Оффлайн
Регистрация
26 Мар 2021
Сообщения
218
Реакции[?]
46
Поинты[?]
1K
если вкраце, определить что перед тобой виртуальный индекс очень просто
допустим найдем GetIGameFramework ( ищем строку sp_difficulty в IDA PRO, переходим по первому сабу и переходим в псевдокод )
Посмотреть вложение 214342
В нашем случае, v4 = .... + 0x78i64 это и есть виртуальный индекс функции GetIGameFramework. В IDA для определения виртуального индекса используется приставочное i64.

Как нам выйти на это в коде? Для этого используется метод виртуальной таблицы VTable ( он есть в каждой пасте/сурсе )
C++:
template<typename VTable>
VTable Virtual( PVOID Call, DWORD64 Index ) {
    return (*(VTable** )Call )[Index / 8]; // в некоторых сурсах не делят на 8 через код, а делаю это вручную и пишут просто [Index]
}
Теперь, что бы написать функцию GetIGameFramework нам понадобится этим воспользоваться
IGameFramework* GetIGameFramework() { return Virtual<IGameFramework* (__fastcall*)(PVOID64)>(this, 0x78)(this); }
И лайк не где поставить, спасибо за ответы всем.
 
I love C++
Пользователь
Статус
Оффлайн
Регистрация
26 Мар 2021
Сообщения
218
Реакции[?]
46
Поинты[?]
1K
если вкраце, определить что перед тобой виртуальный индекс очень просто
допустим найдем GetIGameFramework ( ищем строку sp_difficulty в IDA PRO, переходим по первому сабу и переходим в псевдокод )
Посмотреть вложение 214342
В нашем случае, v4 = .... + 0x78i64 это и есть виртуальный индекс функции GetIGameFramework. В IDA для определения виртуального индекса используется приставочное i64.

Как нам выйти на это в коде? Для этого используется метод виртуальной таблицы VTable ( он есть в каждой пасте/сурсе )
C++:
template<typename VTable>
VTable Virtual( PVOID Call, DWORD64 Index ) {
    return (*(VTable** )Call )[Index / 8]; // в некоторых сурсах не делят на 8 через код, а делаю это вручную и пишут просто [Index]
}
Теперь, что бы написать функцию GetIGameFramework нам понадобится этим воспользоваться
IGameFramework* GetIGameFramework() { return Virtual<IGameFramework* (__fastcall*)(PVOID64)>(this, 0x78)(this); }
У тебя наверное старый дамп или у меня(я вчера делал), у меня смещение уже отличается
1659007577168.png
 
Начинающий
Статус
Оффлайн
Регистрация
11 Окт 2018
Сообщения
30
Реакции[?]
7
Поинты[?]
1K
Сверху Снизу