-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я часто видел в разделе вопрос о том как найти смещения SetFiringPos. Хоть и структура класса IWeapon уже давно не обновлялась, всегда нужно быть на вооружении и в случае чего обновить игровые данные. Будем пользоваться этой возможностью и сейчас, раз игра нам предоставляет ее.
Перейдите во вкладку Jump панели инструментов и нажмите Jump To Address (кнопка G для бинда), введите полученный адрес функции и нажмите Ok.
Вас перебросит на ассемблерный код участка данного адреса, который и представляет собой функцию SetFiringPos.

Давайте я разберу быстро этот ассемблер, дабы вы понимали как и что из чего берется и уже скорее перейдем ко второму пункту.
В регистр r8 помещается значение rcx+18h, то есть от нашего текущего указателя объекта класса (rcx) прибавляется смещение 0x18. Этим смещением является указатель на объект класса IItemBox в котором как раз лежит нужная для нас переменная. Эта переменная, кому интересно, называется m_firingTarget. Мы выходим на неё, добавив еще 0x1C к нашему полученному указателю на IItemBox. Таким образом, чтобы написать самостоятельно функцию SetFiringPos вам понадобиться выйти на класс IItemBox и записать свою позицию Vec3 координат в соответстующую переменную на pItemBox + 0x1C
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.

Давайте я разберу быстро этот ассемблер, дабы вы понимали как и что из чего берется и уже скорее перейдем ко второму пункту.
В регистр r8 помещается значение rcx+18h, то есть от нашего текущего указателя объекта класса (rcx) прибавляется смещение 0x18. Этим смещением является указатель на объект класса IItemBox в котором как раз лежит нужная для нас переменная. Эта переменная, кому интересно, называется m_firingTarget. Мы выходим на неё, добавив еще 0x1C к нашему полученному указателю на IItemBox. Таким образом, чтобы написать самостоятельно функцию SetFiringPos вам понадобиться выйти на класс IItemBox и записать свою позицию Vec3 координат в соответстующую переменную на pItemBox + 0x1C
2. Получение m_fireTarget через готовый паттерн
Я уже постарался за вас и нашёл где вызывается данная переменная. Теперь, в случае чего, вы легко сможете обновить свой функционал, если когда нибудь это значение изменится.
Держите готовый паттерн: F3 0F 10 59 ? 0F 57 C0 0F 2E D8. Он переведет вас ровно на тот дизасемблированную строку кода, которая выходит на данную переменную:
Держите готовый паттерн: F3 0F 10 59 ? 0F 57 C0 0F 2E D8. Он переведет вас ровно на тот дизасемблированную строку кода, которая выходит на данную переменную:
v3 = (__m128)*(unsigned int *)(a1 + 0x1C);