Как достать код из Unity-игр если разработчики против
Репозиторий давно не обновлялся
Последнее обновление было 1 год назад.
Представьте ситуацию: вы решили покопаться во внутренностях мобильной игры на Unity. Хочется посмотреть, как устроена логика, достать ассеты или просто понять, почему приложение тормозит. Вы скачиваете APK, распаковываете его и... видите стену из обфусцированного кода или зашифрованные метаданные. Обычные инструменты вроде стандартного Il2CppDumper пасуют, потому что защита игры подменяет данные в памяти или расшифровывает их только в момент запуска.
Тут на сцену выходит Zygisk-Il2CppDumper. Это не просто очередной скрипт для декомпиляции, а модуль для Magisk, который работает «изнутри» процесса.
Почему обычные дамперы не справляются
Большинство инструментов пытаются анализировать файлы игры статически. Они берут libil2cpp.so и global-metadata.dat, сопоставляют их и выдают читаемый код. Разработчики игр об этом знают. Поэтому они упаковывают файлы, шифруют метаданные или используют кастомные загрузчики. В итоге на диске лежит «каша», которую невозможно прочитать без ключа.
Но есть нюанс: чтобы игра работала, процессор должен получить чистый, расшифрованный код. В какой-то момент в оперативной памяти устройства все секреты становятся явными. Zygisk-Il2CppDumper пользуется именно этим моментом.
Что умеет этот инструмент
Проект Perfare использует механизм Zygisk (часть современного Magisk). Он внедряется в процесс игры сразу после её старта и ждет, пока движок Unity инициализирует все свои структуры.
Главные фишки проекта:
- Работает в рантайме. Ему плевать, как зашифрован файл на диске, если в памяти он уже расшифрован.
- Обход защиты. Многие анти-дамп системы ищут запущенные процессы отладчиков, но Zygisk работает скрытно на уровне системного процесса Zygote.
- Автоматизация через GitHub Actions. Вам даже не обязательно ставить Android Studio, чтобы собрать модуль под конкретную игру.
Как это устроено внутри
Инструмент написан на C и опирается на возможности Zygisk по внедрению в адресное пространство приложений. Когда вы указываете имя пакета игры, модуль начинает следить за запуском процессов. Как только нужная игра стартует, код дампера «подселяется» внутрь.
Он находит в памяти структуру Il2CppCodeRegistration и Il2CppMetadataRegistration. Это своего рода дорожные карты, которые объясняют движку, где лежат методы, классы и поля. Дампер просто копирует эти данные и сохраняет их в текстовый файл dump.cs.
Как запустить дамп
У автора есть два пути: для тех, кто хочет быстро получить результат, и для тех, кто любит контролировать процесс сборки.
Вариант с GitHub Actions
Это, пожалуй, самый ленивый и удобный способ. Не нужно настраивать окружение и мучиться с NDK.
- Делаете форк репозитория.
- Вкладка Actions -> выбираете воркфлоу Build.
- Нажимаете Run workflow и вводите имя пакета игры (например,
com.supercell.brawlstars). - Через пару минут забираете готовый zip-архив в артефактах.
Сборка в Android Studio
Если нужно что-то подправить в логике или вы не доверяете облачным сборкам:
- Клонируете код.
- В файле
game.hменяетеGamePackageNameна нужный вам. - Запускаете задачу
:module:assembleRelease. - Забираете готовый модуль из папки
out.
После этого устанавливаете полученный zip через Magisk, перезагружаетесь и запускаете игру. Если всё прошло успешно, ищите файл по адресу /data/data/имя.пакета.игры/files/dump.cs.
Практическая польза
Для чего это может пригодиться разработчику? Во-первых, это отличный способ изучить архитектуру крупных проектов. Как устроены сетевые запросы? Как реализована система плагинов? Во-вторых, это незаменимый инструмент для поиска уязвимостей. Если вы занимаетесь безопасностью мобильных приложений, Zygisk-Il2CppDumper покажет вам все «голые» эндпоинты и методы, которые разработчик пытался скрыть за обфускацией.
Стоит ли пробовать
Проект специфичный, но в своей нише он один из лучших. Если вы занимаетесь реверс-инжинирингом Unity-игр на Android, этот инструмент сэкономит вам часы (а иногда и дни) ручного копания в дампе памяти через GDB или IDA.
Из минусов — проект требует Root-прав и установленного Magisk с включенным Zygisk. На «чистом» устройстве из коробки ничего не заработает. Но для тех, кто в теме, это небольшая цена за возможность увидеть код практически любой игры как на ладони.
Если вам нужно быстро вытащить структуру классов и сигнатуры методов без борьбы с упаковщиками — Zygisk-Il2CppDumper точно заслуживает места в вашем арсенале.