Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Гайд Valorant — Поиск оффсетов GWorld и Pak через исходники UE и IDA

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
703
Реакции
21
Здорово, реверсеры. Пока одни ждут обновлений на Гитхабе, нормальные люди открывают IDA и обновляют свои пасты сами. Сегодня разберем базу по поиску оффсетов в Valorant (и других играх на Unreal Engine), используя исходники движка. В частности, достанем GWorld и затронем Pak-оффсеты.

Для серьезной работы нам понадобятся IDA Pro и доступ к исходному коду Unreal Engine (через привязку GitHub к Epic Games). Функции типа K2 или меши проще вытащить через SDK дамперы (тот же Reezli), но коренные оффсеты ищем руками.

Суть метода: сопоставление исходников с бинарником

Первым делом нужно понять, как игра инициализирует свои структуры. Нам интересен GWorld. Ищем в исходниках UE что-то связанное с инициализацией мира. Например, класс FSignificanceManagerModule.

Код:
Expand Collapse Copy
// Из исходников UE
FORCEINLINE static USignificanceManager* Get(const UWorld* World)
{
 return WorldSignificanceManagers.FindRef(World);
}

Видим строку SIGNIFICANCEMANAGER. Это наш зацеп для поиска в IDA.

Пошаговый алгоритм в IDA Pro:

  1. Жмем Shift + F12, открываем список строк.
  2. Через Ctrl + F ищем ту самую строку из исходников (SignificanceManager).
  3. Двойной клик по строке, попадаем в секцию .rdata.
  4. Жмем Ctrl + X (Xrefs), чтобы найти места, где эта строка используется.
  5. Ищем инструкцию lea RCX. В архитектуре x64 регистр RCX обычно содержит первый аргумент — это наш поинтер.
  6. Проваливаемся в адрес и жмем F5 для декомпиляции функции.
  7. Теперь самое важное — логика. Нам нужен цикл (loop). В Unreal Engine GWorld часто ищется через итерацию по внутренним таблицам.

Пример того, что вы должны увидеть в декомпиляторе:

Код:
Expand Collapse Copy
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. Для тех, кому лень реверсить, под текущие билды Валоранта сигнатура выглядит так:
Код:
Expand Collapse Copy
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-играх всегда хватает, чтобы зацепиться за нужную логику.

Кто пробовал этот метод на последних патчах — делитесь, на каких функциях сейчас больше всего затыков из-за обфускации.
 
Назад
Сверху Снизу