Гайд 2 способа поиска SetFiringPos

Забаненный
Статус
Оффлайн
Регистрация
20 Дек 2024
Сообщения
17
Реакции[?]
3
Поинты[?]
3K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я часто видел в разделе вопрос о том как найти смещения SetFiringPos. Хоть и структура класса IWeapon уже давно не обновлялась, всегда нужно быть на вооружении и в случае чего обновить игровые данные. Будем пользоваться этой возможностью и сейчас, раз игра нам предоставляет ее.

1. Поиск реализации виртуальной функции
Раз у нас есть информация, что индекс виртуальной функции SetFiringPos 0x2F0, то мы можем спокойно найти реализацию этого метода внутри дизасемблированного кода игры. Для этого вам понадобиться:
  • Получить указатель на виртуальную таблицу класса IWeapon
  • Получить указатель на функцию из виртуальной таблицы класса IWeapon
  • Вывести в 16-ой системе для получения результата
Выглядит это вот так:​
C++:
IWeapon* pWeapon = pItem->GetIWeapon();
if (!pWeapon) return;

void** pVTable = *reinterpret_cast<void***>(pWeapon);
void pSetFiringPos = pVTable[0x2F0 / sizeof(void*)];

std::cout << "Address of SetFiringPos: 0x" << std::hex << pSetFiringPos << std::endl;
На выходе, если вы сделали всё правильно, вы получите адрес виртуальной функции, на момент написания этой статьи адрес этой функции 0x141544030 который сможете найти в дизасемблере, например я буду использовать IDA Pro 7.7.​


Перейдите во вкладку Jump панели инструментов и нажмите Jump To Address (кнопка G для бинда), введите полученный адрес функции и нажмите Ok.
Вас перебросит на ассемблерный код участка данного адреса, который и представляет собой функцию SetFiringPos.
1736959679259.png
Давайте я разберу быстро этот ассемблер, дабы вы понимали как и что из чего берется и уже скорее перейдем ко второму пункту.
В регистр r8 помещается значение rcx+18h, то есть от нашего текущего указателя объекта класса (rcx) прибавляется смещение 0x18. Этим смещением является указатель на объект класса IItemBox в котором как раз лежит нужная для нас переменная. Эта переменная, кому интересно, называется m_firingTarget. Мы выходим на неё, добавив еще 0x1C к нашему полученному указателю на IItemBox. Таким образом, чтобы написать самостоятельно функцию SetFiringPos вам понадобиться выйти на класс IItemBox и записать свою позицию Vec3 координат в соответстующую переменную на pItemBox + 0x1C
Небольшая сводка:
1736960136208.png
2. Получение m_fireTarget через готовый паттерн
Я уже постарался за вас и нашёл где вызывается данная переменная. Теперь, в случае чего, вы легко сможете обновить свой функционал, если когда нибудь это значение изменится.

Держите готовый паттерн: F3 0F 10 59 ? 0F 57 C0 0F 2E D8. Он переведет вас ровно на тот дизасемблированную строку кода, которая выходит на данную переменную:
v3 = (__m128)*(unsigned int *)(a1 + 0x1C);
 
Сверху Снизу