Инструмент WIP, чтобы обратить внимание на процесс сборки Unity IL2CPP обратно в исходные управляемые DLL.
Информация ниже почти полностью применяется к приложению CLI, доступным в выпусках GitHub. Для документации по использованию модуля «Core» - который CLI - это просто обертка - в ваших собственных проектах см. Redectme_core.md
Использует Libcpp2il для начального анализа и загрузки структур метаданных. Libcpp2IL можно получить от артефактов сборки, если вы хотите что -то сделать сами с помощью метаданных IL2CPP, и выпускается по лицензии MIT. Ссылка выше приведет вас к документации для Libcpp2il.
CPP2IL в настоящее время переписывается. Эта ветвь представляет собой работу в процессе и может быть изменена.
Сборщики CI для разработчиков могут быть получены из моего корма Nuget.
Интерфейс командной строки был упрощен, перейдя от множества параметров командной строки к концепции форматов выходных данных и обработки. Тем не менее, многие из этих форматов и слоев еще не реализованы, поэтому функциональность ограничена по сравнению с ранее выпущенными версиями.
Многие варианты, такие как --analysis-level , --skip-analysis и т. Д., Были удалены. Игнорируя тот факт, что анализ еще не реализован, эти варианты не вернутся. Анализ будет выключен по умолчанию и будет включен с помощью использования уровня обработки.
В равной степени, такие варианты, как --supress-attributes , которые ранее подавляли атрибуты CPP2Ilinjected, были заменены на уровне процесса -этот фактически реализован и называется attributeinjector . Вы можете включить этот слой, используя опцию --use-processor , и вы можете перечислить другие варианты, используя --list-processors .
Демблеты метаданных и методики также будут их собственным форматом вывода, вместо того, чтобы быть по умолчанию, и контролируются с помощью выделенного варианта. В настоящее время это означает, что вам нужно будет запустить CPP2IL несколько раз, если вам нужны оба дампа, хотя это может измениться в будущем, если мы добавим поддержку для вывода в несколько форматов одновременно. Как и слои обработки, выходные форматы могут быть перечислены с помощью опции --list-output-formats и выбираются с помощью опции --output-as .
Под капотом заявление было почти полностью переписано. В первую очередь это было необходимо из -за степени, что CPP2IL зависел от библиотеки моно.cecil, которая имела некоторые ограничения. Когда мы заглянули на переключение, мы поняли, насколько мы были зависимы от библиотеки. Это больше не так - приложение записано вокруг типов Libcpp2il и новых объектов контекста анализа, а библиотека моно.cecil больше не используется, заменяя asmresolver.dotnet.
Кроме того, в настоящее время мы находимся в процессе переопределения анализа, основанного на промежуточном представлении, называемом ISIL (независимый от инструкции) язык), что позволит обеспечить гораздо более легкую поддержку новых наборов инструкций. Затем ИГИЛ преобразуется в график потока управления, который можно анализировать более разумно, чем разборка необработанной.
Мы также работаем над системой плагинов, которая позволит сторонним разработчикам писать плагины, чтобы добавить поддержку для пользовательских наборов инструкций, двоичных форматов и в конечном итоге загружать запутанные или зашифрованные метаданные или двоичные файлы.
Самое простое использование этого приложения для игры Windows X86 или X64 Unity. В этом случае вы можете просто запустить Cpp2IL-Win.exe --game-path=C:PathToYourGame и cpp2il обнаружит вашу версию Unity, найдите файлы, в которых он нуждается, и сбрасывает выход в папку CPP2IL_OUT, где вы запустили команду.
Предполагая, что у вас есть один файл APK (а не APKM или XAPK), и вы запускаете хотя бы CPP2IL 2021.4.0, вы можете использовать тот же аргумент, что и выше, но передать путь к APK, и CPP2IL извлекает файлы, которые ему нужны из APK.
| Вариант | Пример аргумента | Описание |
|---|---|---|
| -игра-пат | C: path to Game | Укажите путь к игровой папке. Необходимый. |
| -Испытание | Тестовая игра | Укажите имя EXE -файла игры на случай, если вы обнаружение автоматического выявления (потому что в каталоге Game есть другие файлы EXE) |
| -Вербоз | <Нет> | Войдите больше информации о том, что мы делаем |
| -list-processors | <Нет> | Перечислите доступные обработки слоев, затем выйдите. |
| -Процессор использования | атрибут | Выберите перерабатывающий уровень для использования, который может изменить необработанные данные перед выводом. Эта опция может появиться несколько раз. |
| -Процессор-конфиг | Key = значение | Предоставьте параметры конфигурации выбранным уровням обработки. Они будут задокументированы плагином, который добавляет слой обработки. |
| -list-opput-форматы | <Нет> | Перечислите доступные выходные форматы, затем выйдите. |
| -Попредад | DummyDll | Укажите формат вывода, который вы хотите использовать. |
| -Попреда | cpp2il_out | Корневой каталог для вывода. Этот путь будет передаваться в выбранное формат вывода, который затем может создавать подкатарии и т. Д. В этом месте. |
| -Фазма-Фрама-Флель | C: path to webgl.framework.js | Используется только в сочетании с двоичными файлами WASM. Некоторые из них имеют запутанный экспорт, но они могут быть восстановлены с помощью файла Framework.js, который вы можете предоставить путь к использованию этого аргумента. |
Каждый коммит построен в сборке CI с использованием действий GitHub - файл действий можно найти в папке .github, если вы хотите воспроизвести сборки самостоятельно. Имейте в виду, что они могут быть не самыми стабильными - в то время как есть тесты, чтобы обеспечить совместимость с целым рядом игр, иногда все сломается! Они версируются коммитом, из которого они были построены.
Файлы выпуска могут быть загружены с вкладки «Действия», если вы подписаны в GitHub, или вы можете использовать следующие ссылки, которые всегда указывают на новейшую успешную сборку CI. Обратите внимание, что сборка .NET Framework предоставляется для совместимости с вином/протоном.
Кроме того, я вручную выпускаю выпуск «Milestone», когда я думаю, что был сделан серьезный набор улучшений. Они не помечены как предварительные отдачи на GitHub и должны (по крайней мере, в теории) быть стабильными и подходящими для использования в ряде игр.
Из первой мировозздной сборки 2021.0 и далее CPP2IL теперь выводит более строго структурированные данные в консоли. Это включает в себя уровни журналов (глагол, информация, предупреждение, сбой) и связанные с ними цвета (серый для глагола, Blue для информации, желтый для Warn, Red For Fail).
По состоянию на Milestone 2021.1, если CPP2IL может обнаружить, что вы работаете в вине/протоне, эти цветные коды ANSI отключены, поскольку они не поддерживаются вином и выглядят ужасно.
Сообщения глаголов будут зарегистрированы только в том случае, если CPP2IL будет запущен с опцией --verbose , и было бы полезно, если бы вы могли сообщить о проблемах с включенным флагом. Для нормальной работы они не должны понадобиться, если вам не любопытно.
Если вы не хотите, чтобы вывод был окрашен, установите переменную среды NO_COLOR=true .
Это приложение создано в основном с использованием .NET 9.0, но сборка Framework 4.7.2 также опубликована для устаревших целей.
Он использует следующие библиотеки, за которые я очень благодарен:
(Все лицензированы MIT, помимо XUNIT, который является Apache 2.0+MIT)
WasmDisassembler .В сборке Net472 используется следующие дополнительные библиотеки:
Некоторые плагины также используют дополнительные библиотеки:
CPP2IL (очень свободно, на данный момент) на основе IL2CppDumper, который я развевал в 2018 году и удалил много кода, много переписал и добавил намного больше. Но в своей основе в нем все еще остается немного самосвоения, в основном в Libcpp2il.
Он содержит кусочки от IL2Cppinspector, взятые с разрешения DJKaty, и я хотел бы выразить свою благодарность ей здесь за ее бесценную помощь.
Я хотел бы поблагодарить сообщество Audica Modding и Discord за первоначальное вдохновение для этого проекта, большую поддержку в первые дни и запросы функций в наши дни.
И, наконец, проверьте некоторые другие крутые проекты, которые связаны с этим. Конечно, я упомянул IL2CppInterop дальше, но также проверяю MelonLoader, который использует CPP2IL для фиктивного генерации DLL.