Декомпиляция APK-файла игры на Unity упирается в структуру сборки: внутри архива лежат ресурсы в формате assets, а управляемый код C# компилируется либо в сборки .NET (Mono), либо в нативную библиотеку libil2cpp.so — и от этого зависит весь выбор инструментов. Универсального «Unity APK decompiler», который одной кнопкой вернёт исходный проект, не существует: каждый инструмент решает свою задачу — извлечение текстур, анализ скриптов или восстановление метаданных IL2CPP.
В этой статье разберём, какие программы реально применяются для анализа Unity-сборок, как определить тип компиляции конкретного APK, какой порядок действий безопасен и где проходят технические и юридические границы такого анализа.
Что находится внутри Unity APK
APK-файл — это ZIP-архив с фиксированной структурой. У игры на Unity внутри обычно присутствуют каталоги assets/bin/Data (ресурсы движка: сцены, текстуры, аудио), папка lib с нативными библиотеками под разные архитектуры (arm64-v8a, armeabi-v7a), а также файл classes.dex с Java-обёрткой и манифест AndroidManifest.xml.
Ключевой момент — то, как собран пользовательский код. При сборке через Mono скрипты C# лежат в виде файлов .dll внутри assets/bin/Data/Managed, и их можно открыть практически напрямую. При сборке через IL2CPP весь управляемый код преобразуется в C++ и компилируется в нативную библиотеку, а структуры классов сохраняются в файле global-metadata.dat. Второй вариант сегодня встречается значительно чаще, поскольку Google Play требует 64-битные сборки, а Mono для ARM64 в Unity недоступен.
Как определить тип сборки: Mono или IL2CPP
Проверка занимает меньше минуты и не требует специальных программ. Откройте APK любым архиватором (7-Zip подойдёт) и посмотрите содержимое папки lib.
- 🔍 Есть файл
libil2cpp.so— сборка через IL2CPP, понадобятся Il2CppDumper и анализ метаданных. - 📁 Нет
libil2cpp.so, но естьassets/bin/Data/Managedс DLL-файлами — сборка через Mono, код читается напрямую. - 🧩 Оба признака отсутствуют — возможно, игра не на Unity или ресурсы упакованы нестандартно.
Дополнительно посмотрите на assets/bin/Data: наличие файлов globalgamemanagers, level0 и подобных подтверждает, что проект собран именно на Unity. Версию движка иногда можно увидеть в строках этих файлов.
Инструменты для декомпиляции Unity APK
Ни один инструмент не восстанавливает проект Unity целиком — каждый работает со своим слоем данных. На практике используют связку из нескольких программ.
| Инструмент | Назначение | Тип сборки |
|---|---|---|
| apktool | Распаковка ресурсов APK, манифеста, smali-кода | Любая |
| JADX | Декомпиляция classes.dex в читаемый Java-код | Любая (Java-обёртка) |
| AssetStudio | Просмотр и экспорт ресурсов Unity: текстуры, модели, аудио | Любая |
| Il2CppDumper | Восстановление структуры классов из libil2cpp.so и метаданных | IL2CPP |
| dnSpy | Просмотр и анализ сборок .NET (DLL) | Mono |
AssetStudio — первый кандидат, если целью является извлечение графики, звуков или моделей. Программа открывает файлы ресурсов Unity напрямую из распакованного APK и позволяет экспортировать ассеты в стандартные форматы. Il2CppDumper работает иначе: он сопоставляет нативную библиотеку с файлом global-metadata.dat и генерирует заголовки классов, которые затем загружаются в IDA Pro или Ghidra для анализа логики.
Порядок действий при анализе
Работайте в такой последовательности — от простого к сложному. Сначала распакуйте APK как архив и определите тип сборки по инструкции выше. Затем запустите apktool d app.apk для получения читаемого манифеста и ресурсов Android-слоя.
Для извлечения ассетов откройте папку assets/bin/Data в AssetStudio и экспортируйте нужные объекты. Если требуется анализ кода при IL2CPP-сборке, выполните:
Il2CppDumper.exe libil2cpp.so global-metadata.dat output_dir
Результат — файлы с описанием классов и скрипт для импорта в дизассемблер. Для Mono-сборки просто откройте DLL из каталога Managed в dnSpy: код будет близок к исходному, если разработчик не применял обфускацию.
☑️ Базовый чек-лист анализа Unity APK
⚠️ Внимание: файл
global-metadata.datиногда шифруется разработчиком. В этом случае Il2CppDumper выдаст ошибку или пустой результат — автоматического обхода такой защиты не существует, и дальнейший анализ требует ручной работы с дампом памяти, что выходит за рамки базовой декомпиляции.
Ограничения и типичные проблемы
Даже при удачной декомпиляции результат далёк от исходного проекта. Восстановленный код не содержит комментариев, имена локальных переменных теряются, а при включённой обфускации (например, через Obfuscator или BeeByte) имена классов и методов заменяются на бессмысленные символы. Собрать из полученных данных работающий проект Unity невозможно — анализ носит исследовательский характер.
Частые сложности на практике:
- 🛡️ Обфускация — намеренное искажение имён и структуры кода, затрудняющее чтение.
- 🔐 Шифрование ассетов — AssetStudio не открывает зашифрованные bundles без ключа.
- 📦 Split APK / App Bundle — ресурсы распределены между несколькими файлами, нужен полный набор сплитов.
- 🧱 Защита от дампа — некоторые игры проверяют целостность и окружение при запуске.
⚠️ Внимание: скачивайте инструменты только с официальных репозиториев разработчиков (GitHub-проекты apktool, JADX, AssetStudio, Il2CppDumper). Сборки «всё в одном» со сторонних сайтов нередко содержат вредоносный код.
Правовые аспекты
Декомпиляция чужого приложения регулируется лицензионным соглашением и законодательством конкретной страны. В большинстве пользовательских соглашений прямо запрещён обратный инжиниринг, хотя закон некоторых юрисдикций допускает его в ограниченных целях — например, для обеспечения совместимости. Извлечение и повторное использование чужих ассетов, кода или игровых механик нарушает авторские права, даже если технически это легко выполнить.
Допустимые сценарии, как правило, ограничиваются анализом собственных приложений без исходников, исследованием безопасности с разрешения правообладателя и учебным изучением на личном уровне. Перед публикацией результатов анализа чужой игры проконсультируйтесь с юристом.
Почему нельзя получить исходный проект Unity
При компиляции теряется значительная часть информации: структура сцен, настройки инспектора, префабы и связи объектов хранятся в сериализованном виде, оптимизированном для загрузки, а не для редактирования. Декомпилятор восстанавливает отдельные данные, но не их организацию в проект.
Альтернативы декомпиляции
Если цель — понять, как реализована конкретная механика, часто быстрее изучить открытые проекты на GitHub, официальные обучающие материалы Unity и демо-сцены из Asset Store. Для восстановления доступа к собственной игре без исходников иногда проще переписать логику заново по извлечённым ассетам, чем реконструировать обфусцированный код.
Часто задаваемые вопросы
Можно ли декомпилировать Unity APK прямо на телефоне?
Полноценный анализ на Android-устройстве практически невозможен: AssetStudio, dnSpy и дизассемблеры работают на десктопных ОС. На телефоне доступна только распаковка APK и просмотр структуры файлов.
Почему Il2CppDumper выдаёт ошибку на моём файле?
Возможные причины: зашифрованный global-metadata.dat, несовпадение версии формата метаданных, повреждённый файл из-за неполного набора split-APK. Проверьте, что оба файла взяты из одного и того же APK и не модифицированы.
Восстановит ли декомпилятор исходный код C# полностью?
Нет. При Mono-сборке dnSpy показывает код, близкий к исходному, но без комментариев и имён локальных переменных. При IL2CPP восстанавливается только структура классов, а логику приходится читать в виде ассемблера или псевдокода.
Законно ли декомпилировать свою собственную игру?
Да, анализ приложения, права на которое принадлежат вам, законодательно не ограничен. Это распространённый сценарий при утере исходников проекта.
Что делать, если ассеты зашифрованы?
Автоматических легальных решений нет: ключ шифрования хранится внутри защищённого кода игры. Извлечение таких ключей требует глубокого реверс-инжиниринга и с высокой вероятностью нарушает условия лицензионного соглашения.