Декомпиляция игры на Unity начинается с папки GameName_Data/Managed — именно там лежит файл Assembly-CSharp.dll, содержащий весь управляемый код проекта, и его можно открыть в dnSpy или ILSpy без какой-либо подготовки. В отличие от нативных программ, сборки .NET хранят метаданные типов, имена классов и методов, поэтому восстановленный код часто читается почти как исходник. Исключение — проекты, собранные через IL2CPP, где вместо DLL вы найдёте GameAssembly.dll, и задача резко усложняется.
В этой статье разберём, как определить тип сборки Unity-игры, какие инструменты подходят для кода и ресурсов, какие ограничения есть у декомпиляции и в каких случаях восстановить проект полностью не получится. Также отдельно затронем правовую сторону вопроса, потому что она здесь принципиальна.
Как устроена сборка Unity-игры
Unity компилирует игровую логику двумя разными способами, и от этого зависит весь дальнейший процесс. В режиме Mono скрипты на C# собираются в управляемые сборки .NET — те самые DLL в папке Managed. В режиме IL2CPP промежуточный код CIL транслируется в C++ и затем в нативный машинный код, после чего привычных DLL с логикой в сборке не остаётся.
Ресурсы — текстуры, модели, аудио, сцены — упаковываются в файлы форматов .assets, .resources и .unity3d (Asset Bundles). Они не зависят от выбранного scripting backend, поэтому извлечение ассетов работает одинаково в обоих случаях.
Быстрая диагностика: откройте корневую папку установленной игры и посмотрите на её содержимое. Если рядом с исполняемым файлом есть каталог *_Data/Managed с десятками DLL — перед вами Mono-сборка. Если присутствует GameAssembly.dll в корне и папка il2cpp_data — это IL2CPP.
Инструменты для декомпиляции кода
Для Mono-сборок инструментарий зрелый и бесплатный. dnSpy (и его поддерживаемый форк dnSpyEx) позволяет не только читать код, но и редактировать сборки и отлаживать их. ILSpy — лёгкая альтернатива с открытым исходным кодом. dotPeek от JetBrains удобен для навигации по большим проектам.
- 🧩 dnSpyEx — просмотр, редактирование и отладка управляемых сборок .NET;
- 🔍 ILSpy — быстрый просмотр кода с экспортом в проект Visual Studio;
- 🛠 dotPeek — декомпилятор с удобным поиском по типам и ссылкам;
- ⚙️ Il2CppDumper — извлечение метаданных из IL2CPP-сборок для последующего анализа;
- 🧪 Cpp2IL — попытка восстановить управляемые сборки из IL2CPP-файлов.
Для IL2CPP всё сложнее: Il2CppDumper принимает на вход GameAssembly.dll и файл global-metadata.dat из папки il2cpp_data, после чего генерирует дамп с именами классов и методов. Сам по себе дамп не даёт читаемый C# — он используется вместе с Ghidra или IDA для анализа машинного кода. Инструмент Cpp2IL идёт дальше и пытается восстановить стаб-сборки, но качество результата сильно зависит от версии Unity и настроек компиляции.
Пошаговая инструкция: декомпиляция Mono-сборки
Порядок действий для типичной Mono-сборки выглядит так. Сначала скопируйте папку игры в отдельный каталог, чтобы работать с копией и не повредить установленную версию. Затем откройте папку Managed и найдите Assembly-CSharp.dll — именно там находится пользовательский код игры; файлы вида UnityEngine.*.dll — это библиотеки движка и интереса не представляют.
Откройте Assembly-CSharp.dll в dnSpyEx. В дереве слева разверните сборку и просматривайте классы с их методами — декомпилятор покажет код на C#. Для сохранения всего кода используйте экспорт: в dnSpy это делается через контекстное меню сборки с сохранением в проект, в ILSpy — через пункт сохранения кода в файлы .cs.
☑️ Проверка перед декомпиляцией
Что проверить, если код выглядит странно: имена методов вида a.b() и бессмысленные строки — признак обфускации. В таком случае логику придётся восстанавливать вручную по контексту вызовов, строковым константам и ссылкам на API Unity.
Извлечение ресурсов: текстуры, модели, аудио
Код — только половина проекта. Для ресурсов используются отдельные инструменты, и здесь наиболее известен AssetRipper: он читает файлы .assets и Asset Bundles и восстанавливает их в структуру проекта Unity, насколько это возможно. Альтернатива — AssetStudio, который ориентирован на просмотр и экспорт отдельных ресурсов: текстур в PNG, аудио, моделей.
Практический нюанс: сцены и префабы восстанавливаются не всегда идеально. Связи между объектами, настройки компонентов и скрипты, привязанные к объектам сцены, могут частично теряться, особенно если игра собрана старой или, наоборот, очень новой версией Unity, которую инструмент ещё не полностью поддерживает. После импорта восстановленного проекта в Unity Editor почти всегда требуется ручная доработка.
Почему восстановленный проект не собирается сразу
Декомпилятор восстанавливает логику CIL-кода, но не исходную структуру проекта: комментарии, имена локальных переменных, порядок файлов и настройки сборки теряются при компиляции. Сериализованные данные сцен ссылаются на скрипты по GUID, и если структура классов изменилась, связи разрываются. Поэтому результат декомпиляции — это справочный материал для изучения логики, а не готовый к сборке проект.
Сравнение инструментов
| Инструмент | Назначение | Тип сборки | Результат |
|---|---|---|---|
| dnSpyEx | Декомпиляция и редактирование кода | Mono | Читаемый C#, правка DLL |
| ILSpy | Просмотр и экспорт кода | Mono | Файлы .cs, проект |
| Il2CppDumper | Извлечение метаданных | IL2CPP | Дамп классов и методов |
| Cpp2IL | Восстановление сборок | IL2CPP | Стаб-сборки .NET |
| AssetRipper | Извлечение ресурсов | Любая | Проект Unity с ассетами |
Выбор зависит от цели. Если нужно понять алгоритм — достаточно dnSpy. Если требуется перенести ресурсы в свой учебный проект — основным инструментом будет AssetRipper, а декомпилятор кода станет вспомогательным.
Ограничения и типичные проблемы
Декомпиляция — не обратный процесс компиляции в полном смысле. Компилятор C# выполняет оптимизации: инлайнит методы, преобразует циклы, генерирует скрытые классы для лямбд и async-методов. Декомпилятор восстанавливает эквивалентный, но не идентичный код. Комментарии, имена локальных переменных и исходное форматирование теряются безвозвратно — их просто нет в скомпилированной сборке.
Отдельные сложности создают защитные меры. Обфускаторы переименовывают типы и методы, шифруют строки и запутывают поток управления. Некоторые игры дополнительно шифруют сами DLL или Asset Bundles, и тогда сначала требуется получить расшифрованные файлы — например, из памяти запущенного процесса. Это уже область исследования ПО, и простых универсальных рецептов здесь нет: метод зависит от конкретной защиты.
⚠️ Внимание: модификация DLL и подмена файлов игры могут нарушать лицензионное соглашение, а в онлайн-играх — привести к блокировке аккаунта античит-системой. Любые эксперименты проводите на копии файлов и только в одиночных проектах.
⚠️ Внимание: скачивайте dnSpyEx, ILSpy, AssetRipper и другие утилиты только с официальных репозиториев проектов (как правило, GitHub). Сборки «всё в одном» с посторонних сайтов нередко содержат вредоносный код.
Правовые аспекты
Правомерность декомпиляции зависит от юрисдикции и цели. В законодательстве ряда стран предусмотрены исключения для обратного инжиниринга ради совместимости, но они узки и не покрывают, например, извлечение чужих ассетов для использования в своих проектах. Лицензионные соглашения большинства игр прямо запрещают декомпиляцию, и этот пункт имеет юридическое значение.
Безопасные сценарии на практике: анализ собственного проекта, исходники которого утеряны; изучение механик в образовательных целях без распространения результатов; исследование с согласия правообладателя. Распространение декомпилированного кода или ресурсов — уже зона прямого нарушения авторских прав.
FAQ: частые вопросы
Можно ли получить полный исходный код игры на Unity?
Нет. Декомпилятор восстанавливает эквивалентный по логике C#-код из сборки Mono, но комментарии, имена локальных переменных, структура файлов и настройки проекта утрачены при компиляции. Для IL2CPP-сборок доступен только псевдокод и метаданные.
Как понять, что игра собрана через IL2CPP?
Откройте папку с игрой: при IL2CPP-сборке в корне находится GameAssembly.dll, а внутри *_Data есть каталог il2cpp_data с файлом global-metadata.dat. Папка Managed с пользовательскими DLL при этом отсутствует или почти пуста.
Почему dnSpy показывает бессмысленные имена методов?
Вероятная причина — обфускация сборки. Защитные инструменты переименовывают типы и методы, шифруют строки. Логику в таком коде восстанавливают вручную, отслеживая вызовы Unity API и строковые константы.
Можно ли декомпилировать мобильную Unity-игру с Android?
Да, принцип тот же. APK распаковывается как архив: управляемые сборки Mono лежат в assets/bin/Data/Managed, при IL2CPP — нативная библиотека libil2cpp.so в папке lib и метаданные в assets/bin/Data/Managed/Resources. Дальше применяются те же инструменты.
Восстановится ли проект в Unity Editor после AssetRipper?
Частично. Ресурсы и часть структуры сцен переносятся, но связи скриптов, настройки компонентов и параметры сборки обычно требуют ручной доработки. Результат зависит от версии Unity, в которой собрана игра, и от полноты поддержки этой версии инструментом.