- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 703
- Реакции
- 21
DayZ завезли в Xbox Game Pass, и теперь мы можем гонять с консольщиками через кроссплей. Проблема в том, что Microsoft жестко закрутили гайки: если попытаться просто достать DayZ_x64.exe из папки Xbox, вы упретесь в package ACL. Файл нельзя скопировать, нельзя открыть в IDA — система его просто блокирует.
Даже если вытащите файл с диска, он будет зашифрован, так что IDA выдаст мусор. Единственный рабочий вариант — старый добрый рантайм-дамп, пока игра запущена.
Шаг 0 — Обходим ACL (Опционально)
Игры из Game Pass защищены NTFS ACL, привязанными к системе WindowsApps. Самый простой способ обойти эту бюрократию — зайти через Safe Mode, там эти правила не работают:
Шаг 1 — Рантайм-дамп
Xbox расшифровывает страницы бинарника прямо в памяти во время работы. Нам нужен кернел-драйвер, чтобы прочитать процесс DayZ_x64.exe постранично.
Шаг 2 — Работа в IDA
Открываем дамп как PE-файл. База будет кривая из-за ASLR (что-то вроде 0x7FF646B10000). Чтобы адреса были человеческими, делаем ребейс:
Edit —> Segments —> Rebase program —> 0x140000000
Теперь всё приведено к стандартному виду 0x14XXXXXXX. Чтобы получить RVA для своего чита, просто вычитаем базу:
Актуальные оффсеты (Xbox, ребейс 0x140000000)
Разница Player Names: Xbox vs Steam
Структура scoreboard_entity на Xbox отличается. На Стиме имя лежит по +0xF8, но на Xbox там заглушка "NoVoice". Реальный Gamertag и XUID лежат в других местах.
Логика arma_string:
Чтение ников на Xbox выглядит примерно так:
Сам дамп не выкладываю, гайд написан для тех, кто хочет разобраться сам.
Интересно, как быстро античит начнет триггериться на чтение XUID через скорборд в этой версии.
Даже если вытащите файл с диска, он будет зашифрован, так что IDA выдаст мусор. Единственный рабочий вариант — старый добрый рантайм-дамп, пока игра запущена.
Шаг 0 — Обходим ACL (Опционально)
Игры из Game Pass защищены NTFS ACL, привязанными к системе WindowsApps. Самый простой способ обойти эту бюрократию — зайти через Safe Mode, там эти правила не работают:
- Win+R —> msconfig —> вкладка Boot —> ставим Safe boot, ребутаемся.
- Идем в папку установки (обычно C:\XboxGames\DayZ\Content\ или C:\Program Files\WindowsApps\).
- Копируем DayZ_x64.exe в любое удобное место.
- Возвращаемся в нормальный режим.
Шаг 1 — Рантайм-дамп
Xbox расшифровывает страницы бинарника прямо в памяти во время работы. Нам нужен кернел-драйвер, чтобы прочитать процесс DayZ_x64.exe постранично.
- Аттачим драйвер к процессу.
- Читаем образ по 4KB, начиная с модуль-бейза.
- Если страница не читается — скипаем и пробуем позже.
- Важный нюанс: нужно побегать по карте. Это заставляет движок расшифровывать нужные секции и подгружать их в память.
- Когда покрытие устроит — жмем END и сохраняем.
- Не забудьте поправить PE-хидеры, иначе IDA не поймет структуру файла.
Шаг 2 — Работа в IDA
Открываем дамп как PE-файл. База будет кривая из-за ASLR (что-то вроде 0x7FF646B10000). Чтобы адреса были человеческими, делаем ребейс:
Edit —> Segments —> Rebase program —> 0x140000000
Теперь всё приведено к стандартному виду 0x14XXXXXXX. Чтобы получить RVA для своего чита, просто вычитаем базу:
Код:
RVA = IDA_address - 0x140000000
Актуальные оффсеты (Xbox, ребейс 0x140000000)
Код:
world = 0x42710C8
network_manager = 0x101CE50
landscape = 0x42742F0
day_progress = 0x427D570
Разница Player Names: Xbox vs Steam
Структура scoreboard_entity на Xbox отличается. На Стиме имя лежит по +0xF8, но на Xbox там заглушка "NoVoice". Реальный Gamertag и XUID лежат в других местах.
Код:
+0x30 uint32_t network_id (общий)
+0x80 arma_string* XUID (уникальный ID Xbox, 16 цифр)
+0xD8 arma_string* gamertag (имя игрока Xbox)
+0xF8 arma_string* player_name (только Steam, на Xbox тут NoVoice)
+0xA0 arma_string* steam_id (только Steam, на Xbox тут null)
Логика arma_string:
Код:
+0x08 uint16_t length
+0x10 char[] string data (ASCII)
Чтение ников на Xbox выглядит примерно так:
Код:
// game_base + 0x101CE50 -> networkmanager
// + 0x50 -> networkclient
// + 0x18 -> scoreboard*
// + 0x24 -> entry count
for (int i = 0; i < scoreboard_size; i++) {
uintptr_t entry = read<uintptr_t>(scoreboard + i * 0x8);
uint32_t network_id = read<uint32_t>(entry + 0x30);
arma_string* gamertag = read<arma_string*>(entry + 0xD8);
arma_string* xuid = read<arma_string*>(entry + 0x80);
}
Сам дамп не выкладываю, гайд написан для тех, кто хочет разобраться сам.
Интересно, как быстро античит начнет триггериться на чтение XUID через скорборд в этой версии.