- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 703
- Реакции
- 21
Здорово, реверсеры. Пока одни ждут обновлений на Гитхабе, нормальные люди открывают IDA и обновляют свои пасты сами. Сегодня разберем базу по поиску оффсетов в Valorant (и других играх на Unreal Engine), используя исходники движка. В частности, достанем GWorld и затронем Pak-оффсеты.
Для серьезной работы нам понадобятся IDA Pro и доступ к исходному коду Unreal Engine (через привязку GitHub к Epic Games). Функции типа K2 или меши проще вытащить через SDK дамперы (тот же Reezli), но коренные оффсеты ищем руками.
Суть метода: сопоставление исходников с бинарником
Первым делом нужно понять, как игра инициализирует свои структуры. Нам интересен GWorld. Ищем в исходниках UE что-то связанное с инициализацией мира. Например, класс FSignificanceManagerModule.
Видим строку SIGNIFICANCEMANAGER. Это наш зацеп для поиска в IDA.
Пошаговый алгоритм в IDA Pro:
Пример того, что вы должны увидеть в декомпиляторе:
Здесь qword_7FF70B0BAFA0 — это наш кандидат. Но это виртуальный адрес (VA), а нам нужен RVA.
Математика для пастеров:
Вычисляем по формуле: RVA = VA - ImageBase.
Пример расчета:
VA: 7FF70B0BAFA0
ImageBase: 7FF6FEF20000
Результат: 0xC19AFA0
Вот ваш готовый оффсет GWorld. Для тех, кому лень реверсить, под текущие билды Валоранта сигнатура выглядит так:
Аналогичным образом через поиск строк (например, по логам LogPakFile) и сопоставление с FPakPlatformFile::Initialize в исходниках ищутся оффсеты для работы с паками.
Метод рабочий для любой версии UE. Если Vanguard не дает нормально дебажить — крутите статический анализ в IDA, строк в UE-играх всегда хватает, чтобы зацепиться за нужную логику.
Кто пробовал этот метод на последних патчах — делитесь, на каких функциях сейчас больше всего затыков из-за обфускации.
Для серьезной работы нам понадобятся IDA Pro и доступ к исходному коду Unreal Engine (через привязку GitHub к Epic Games). Функции типа K2 или меши проще вытащить через SDK дамперы (тот же Reezli), но коренные оффсеты ищем руками.
Суть метода: сопоставление исходников с бинарником
Первым делом нужно понять, как игра инициализирует свои структуры. Нам интересен GWorld. Ищем в исходниках UE что-то связанное с инициализацией мира. Например, класс FSignificanceManagerModule.
Код:
// Из исходников UE
FORCEINLINE static USignificanceManager* Get(const UWorld* World)
{
return WorldSignificanceManagers.FindRef(World);
}
Видим строку SIGNIFICANCEMANAGER. Это наш зацеп для поиска в IDA.
Пошаговый алгоритм в IDA Pro:
- Жмем Shift + F12, открываем список строк.
- Через Ctrl + F ищем ту самую строку из исходников (SignificanceManager).
- Двойной клик по строке, попадаем в секцию .rdata.
- Жмем Ctrl + X (Xrefs), чтобы найти места, где эта строка используется.
- Ищем инструкцию lea RCX. В архитектуре x64 регистр RCX обычно содержит первый аргумент — это наш поинтер.
- Проваливаемся в адрес и жмем F5 для декомпиляции функции.
- Теперь самое важное — логика. Нам нужен цикл (loop). В Unreal Engine GWorld часто ищется через итерацию по внутренним таблицам.
Пример того, что вы должны увидеть в декомпиляторе:
Код:
while ( 1 )
{
result = qword_7FF70B0BAFA0 + 24LL * v7;
if ( *(_QWORD *)result == v5 )
break;
v7 = *(_DWORD *)(result + 16);
if ( v7 == -1 )
return result;
}
Здесь qword_7FF70B0BAFA0 — это наш кандидат. Но это виртуальный адрес (VA), а нам нужен RVA.
Математика для пастеров:
Вычисляем по формуле: RVA = VA - ImageBase.
Пример расчета:
VA: 7FF70B0BAFA0
ImageBase: 7FF6FEF20000
Результат: 0xC19AFA0
Вот ваш готовый оффсет GWorld. Для тех, кому лень реверсить, под текущие билды Валоранта сигнатура выглядит так:
Код:
48 8B 15 ?? ?? ?? ?? 66 66 66 0F 1F 84 00 00 00 00 00 48 63 C1 48 8D 0C 40 48 8D 04 CA 4C 39 08 74 ?? 8B 48 10 83 F9 FF 75 ?? EB ??
Аналогичным образом через поиск строк (например, по логам LogPakFile) и сопоставление с FPakPlatformFile::Initialize в исходниках ищутся оффсеты для работы с паками.
Метод рабочий для любой версии UE. Если Vanguard не дает нормально дебажить — крутите статический анализ в IDA, строк в UE-играх всегда хватает, чтобы зацепиться за нужную логику.
Кто пробовал этот метод на последних патчах — делитесь, на каких функциях сейчас больше всего затыков из-за обфускации.