С большим сожалением я должен объявить, что работы по развитию на IL2Cppinspector были остановлены в обозримом будущем.
Причина этого заключается в том, что из -за здоровья и изменений в моей личной жизни у меня просто нет времени, чтобы больше принять участие в работе над проектом. Это очень расстраивает для меня, но я мало что могу с этим поделать.
Пожалуйста, не стесняйтесь раскошелиться на проект и вносить улучшения! Вы также можете продолжать публиковать проблемы, так как я хотел бы, чтобы сборник ошибок и проблем со сэкономленным на случай, если у меня или кто -то еще есть возможность вернуться к работе над этим. Обратите внимание, что я не буду отвечать на проблемы или PR в ожидаемом будущем.
Если вам нужен инструмент IL2CPP, я рекомендую отличный проект моего друга и коллеги CPP2IL, который представляет собой инструмент для преобразования бинарных файлов IL2CPP непосредственно обратно в код IL, который можно легко просмотреть в DNSPY и т. Д.
Счастливого взлома,
Кэти.
IL2CPPINSPECTOR помогает вам переключить приложения IL2CPP, предоставляя наиболее полный анализ в настоящее время.

Выходные определения типа IL2CPP, метаданные и указатели метода в виде кода C# stub
Создайте .NET Assembly Shim DLL, содержащие структуру приложения IL2CPP и метаданные для использования в декомпиляторах, таких как ILSPY, DNSPY, Unity Asset Asset Asset Asset с AssetStudio или управляемым поколением прокси с IL2CppassemblyUnhollower
Создайте каркасы C ++ для всех типов, методов, указателей функций и функций API в приложении IL2CPP для использования в x64DBG, субстрате Cydia и т. Д.
Создать сценарии IDA и Ghidra Python для заполнения символа, функции и типа информации; Включает крючки API для реализации сценариев для других целей
Создать проекты Visual Studio C ++ DLL непосредственно из файлов IL2CPP
Создание решений Code Stub Stub Studio C# непосредственно из файлов IL2CPP
Создайте метаданные JSON с полной адресной картой непосредственно из файлов IL2CPP.
Создать двоичные файлы IL2CPP из произвольного исходного кода C# без проекта Unity Project
Три основных API для использования в ваших собственных проектах статического анализа для запроса бинарных метаданных низкого уровня, модели типа .NET и всего приложения C ++. Они также доступны в виде пакета Nuget.
Плагин SDK позволяет создавать пользовательские плагины для расширения возможностей IL2Cppinspector
Побеждает определенные типы запутывания
Поддерживает все основные форматы файлов и архитектуры процессоров
Работает на Windows, MacOS X и Linux. Интегрированный графический интерфейс для пользователей Windows с поддержкой перетаскивания
Протестировано с каждым выпуском IL2CPP с Unity 5.3.0
Вы можете узнать больше о том, как работает IL2CPP в моей серии IL2CPP Reverse Engineering:
Часть 1: Hello World и IL2CPP Toolchain
Часть 2: Структурный обзор и поиск метаданных
Il2cppinspecter plugin development вики вики
Как создавать, использовать и отлаживать проекты IL2CPP DLL
Работа с кодом в проектах IL2CPP DLL впрыска
Использование модели типа IL2Cppinspector для извлечения определений Protobuf-Net (тематическое исследование: Fall Ready)
Поиск погрузчиков для запутанных файлов Global- global-metadata.dat -объясняет, как найти загрузчик, деобфускацию и/или дешифрование
Включение загрузки League of Legends: Wild Rift - охватывает дешифрование XOR, дешифрование строки XOR, расшифровка экспорта API, расшифрование, запутывание данных бинарных метаданных
Включить загрузку удара HONKAI (3 части) - охватывает функции поиска в изображении, запутывание данных Global -MetAdata.Dat, методы декомпилятора IDA, как написать плагин
VMProtect управление запутыванием потока потока в Honkai Impact - охватывает экстраполяцию пути кода от функции с уплощением потока управления с использованием x64dbg и декомпилятора IDA
Обратное инженерное управление Genshin Impact с PowerShell - охватывает написание жгута испытаний, чтобы найти функцию в запутанном двоине с помощью атаки грубой силы / обратное пузырь
Формат файлов и поддержка архитектуры:
Приятно иметь:
using директив. Область и имя типа конфликты разрешаются автоматически для создания кода, который компилируется.Цели библиотеки классов .NET CORE 3.1. Построен из Visual Studio 2019.
ПРИМЕЧАНИЕ : IL2Cppinspector не декомпилятор. Он может предоставить вам структуру адресов приложения и функции для каждого метода, чтобы вы могли легко прыгать прямо к методам интереса к вашему разборщику. Он не пытается восстановить весь исходный код приложения.
git clone --recursive https://github.com/djkaty/Il2CppInspector
cd Il2CppInspector
Создайте версии GUI CLI и Windows:
dotnet publish -c Release
Получить все текущие плагины (необязательно):
powershell -f get-plugins.ps1
Создайте версию CLI:
cd Il2CppInspector.CLI
dotnet publish -r osx-x64 -c Release
Получить все текущие плагины (необязательно):
../get-plugins.sh
Создайте версию CLI:
cd Il2CppInspector.CLI
dotnet publish -r linux-x64 -c Release
Получить все текущие плагины (необязательно):
../get-plugins.sh
Для других операционных систем, поддерживающих .NET Core, добавьте -r xxx в окончательную команду, в которой xxx избавится от https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog
Двоирный двоичный файл для использования командной строки помещается в Il2CppInspector/Il2CppInspector.CLI/bin/Release/netcoreapp3.0/[win|osx|linux]-x64/publish/Il2CppInspector.exe .
Двоирный GUINAR для Windows GUI размещен в Il2CppInspector/Il2CppInspector.GUI/bin/Release/netcoreapp3.1/[win|osx|linux]-x64/publish/Il2CppInspector.exe .
Папка plugins должна быть помещена в ту же папку, что и Il2CppInspector.exe .
Запустите Il2CppInspector.exe в командной строке.
Формат файла и архитектура обнаруживаются автоматически.
Все выходы генерируются по умолчанию. Чтобы сгенерировать только конкретные выходы, используйте переключатель --select-outputs в сочетании с выбором выбора.
-i, --bin (Default: libil2cpp.so) IL2CPP binary, APK, AAB, XAPK, IPA, Zip or Linux process map text input file(s) (single file or comma-separated list for split APKs)
-m, --metadata (Default: global-metadata.dat) IL2CPP metadata file input (ignored for APK/AAB/XAPK/IPA/Zip)
--image-base For ELF memory dumps, the image base address in hex (ignored for standard ELF files and other file formats)
--select-outputs Only generate outputs specified on the command line (use --cs-out, --py-out, --cpp-out, --json-out, --dll-out to select outputs). If not specified, all outputs are generated
-c, --cs-out (Default: types.cs) C# output file (when using single-file layout) or path (when using per namespace, assembly or class layout)
-p, --py-out (Default: il2cpp.py) Python script output file
-h, --cpp-out (Default: cpp) C++ scaffolding / DLL injection project output path
-o, --json-out (Default: metadata.json) JSON metadata output file
-d, --dll-out (Default: dll) .NET assembly shim DLLs output path
--metadata-out IL2CPP metadata file output (for extracted or decrypted metadata; ignored otherwise)
--binary-out IL2CPP binary file output (for extracted or decrypted binaries; ignored otherwise; suffixes will be appended for multiple files)
-e, --exclude-namespaces (Default: System Mono Microsoft.Reflection Microsoft.Win32 Internal.Runtime Unity UnityEditor UnityEngine UnityEngineInternal AOT JetBrains.Annotations) Comma-separated list of namespaces to suppress in C# output, or 'none' to include all namespaces
-l, --layout (Default: single) Partitioning of C# output ('single' = single file, 'namespace' = one file per namespace in folders, 'assembly' = one file per assembly, 'class' = one file per class in namespace folders, 'tree' = one file per class in assembly and
namespace folders)
-s, --sort (Default: index) Sort order of type definitions in C# output ('index' = by type definition index, 'name' = by type name). No effect when using file-per-class or tree layout
-f, --flatten Flatten the namespace hierarchy into a single folder rather than using per-namespace subfolders. Only used when layout is per-namespace or per-class. Ignored for tree layout
-n, --suppress-metadata Diff tidying: suppress method pointers, field offsets and type indices from C# output. Useful for comparing two versions of a binary for changes with a diff tool
--suppress-dll-metadata Diff tidying: suppress method pointers, field offsets and type indices attributes from DLL output. Useful for comparing two versions of a binary for changes
-k, --must-compile Compilation tidying: try really hard to make code that compiles. Suppress generation of code for items with CompilerGenerated attribute. Comment out attributes without parameterless constructors or all-optional constructor arguments. Don't emit
add/remove/raise on events. Specify AttributeTargets.All on classes with AttributeUsage attribute. Force auto-properties to have get accessors. Force regular properties to have bodies. Suppress global::Locale classes. Generate dummy parameterless
base constructors and ref return fields.
--separate-attributes Place assembly-level attributes in their own AssemblyInfo.cs files. Only used when layout is per-assembly or tree
-j, --project Create a Visual Studio solution and projects. Implies --layout tree, --must-compile and --separate-attributes
--cpp-compiler (Default: BinaryFormat) Compiler to target for C++ output (MSVC or GCC); selects based on binary executable type by default
-t, --script-target (Default: IDA) Application to target for Python script output (IDA or Ghidra) - case-sensitive
--unity-path (Default: C:Program FilesUnityHubEditor*) Path to Unity editor (when using --project). Wildcards select last matching folder in alphanumeric order
--unity-assemblies (Default: C:Program FilesUnityHubEditor*EditorDataResourcesPackageManagerProjectTemplateslibcachecom.unity.template.3d-*ScriptAssemblies) Path to Unity script assemblies (when using --project). Wildcards select last matching folder in
alphanumeric order
--unity-version Version of Unity used to create the input files, if known. Used to enhance Python, C++ and JSON output. If not specified, a close match will be inferred automatically.
--unity-version-from-asset A Unity asset file used to determine the exact Unity version. Overrides --unity-version.
--plugins Specify options for plugins. Enclose each plugin's configuration in quotes as follows: --plugins "pluginone --option1 value1 --option2 value2" "plugintwo --option...". Use --plugins <name> to get help on a specific plugin
--help Display this help screen.
--version Display version information.
Apple Universal Binary и Apks/XAPK с двоичными файлами для нескольких архитектур : при использовании CLI будет сгенерировано несколько выходных файлов, с каждым именем файла, кроме первого суффикса, индексом изображения в двоичном. Неподдерживаемые изображения будут пропущены.
Пакеты IPA : исполняемый файл должен быть расшифрован сначала. Зашифрованные исполняемые двоичные файлы не поддерживаются.
Раздельные пакеты APK : при использовании CLI укажите список файлов APK с запятой между каждым именем файла.
Эльф-двоичные файлы, созданные из дамп памяти : укажите основание изображения (в HEX), используя --image-base . Если поставляемое основание изображения неверна, приложение может потерпеть неудачу.
Damples GameGuardian (и другие дампы карты процессов Linux) : вы можете использовать файл *-maps.txt вместо двоичного файла IL2CPP. IL2Cppinspector будет сканировать папку, содержащую файл карт для сопоставления файлов .bin , а также собирать и повторно libil2cpp.so автоматически. Поэтому вам не нужно создавать файл вручную или предоставлять базовый адрес изображения при использовании такого типа дампа. Чтобы это работало, ни текстовый файл, ни какой -либо из двоичных файлов не должны быть переименованы, и все должно быть в одной папке.
Переполненные PE -файлы (DLL) : Предупреждение: Загрузка упакованного PE -файла приведет к выполнению функций входа и инициализации DLL. Не загружайте вредоносные DLL и никогда не запускайте IL2Cppinspector в качестве администратора при обработке упакованных файлов PE. Используйте свой собственный риск.
IL2CPPINSPECTOR может создавать файлы Code Code Code с метаданными указателями, чтобы вы могли изучить двоичный файл IL2CPP в простом для чтения формате.
Укажите переключатель -c , чтобы выбрать выходной файл или путь C#.
Чтобы исключить типы из определенных пространств имен, из которых генерируются в выводе исходного файла C#, предоставьте список, чувствительные к случаям, чувствительные к случаям пространства имен в --exclude-namespaces . Следующие пространства имен будут исключены, если не указан аргумент:
System
Mono
Microsoft.Reflection
Microsoft.Win32
Internal.Runtime
Unity
UnityEditor
UnityEngine
UnityEngineInternal
AOT
JetBrains.Annotations
Предоставление аргумента- --exclude-namespaces переопределяет список по умолчанию. Для вывода всех пространств имен используйте --exclude-namespaces=none . Это относится только к выводу прототипов C#.
Вы можете указать выходной макет с переключателем --layout :
single - все типы в одном файлеnamespace - одно имена пространства для каждого файла (каждому файлу будет дано имя пространства имен)assembly - одна сборка на файл (каждому файлу будет дано имя сборки)class - один класс на файлtree -один класс на файл в структуре папок, похожей на дерево, с папками с сборкой верхнего уровня и папками пространства имен второго уровня Вы можете указать заказ внутри файла с помощью переключателя --sort :
index - сортировка по индексу определения типа, как найдено в метаданных IL2CPPname - сортировать алфавитно по названию типа Этот переключатель не влияет при использовании class или макета tree .
Переключатель --flatten позволяет сгладить иерархию вложенных пространств имен, когда layout является class или namespace , т.е. Серия System/IO/Compression будет представлена единственной суб-уровнем Sub- System.IO.Compression .
Переключатель --suppress-metadata позволяет подавлять выходные комментарии, включая указатели метода, смещения полевых и индексы типа. Это полезно, когда вы хотите различить изменения между двумя версиями приложения, чтобы увидеть только, какие типы изменились.
Переключатель --seperate-attributes направляет Il2cppinspector, чтобы помещать атрибуты на уровне сборки в свои собственные файлы AssemblyInfo.cs , а не в верхней части первого файла, сгенерированного для каждой сборки, когда layout является assembly или tree .
Просто запустите IL2Cppinspector с переключателем -p , чтобы выбрать выходной файл скрипта IDA. Загрузите свой двоичный файл в IDA, нажмите ALT+F7 и выберите сгенерированный скрипт. Соблюдайте окно вывода, пока IDA анализирует файл - это может занять много времени.
Три файла генерируются IL2Cppinspector для IdapyThon: сам скрипт Python, файл метаданных JSON и файл заголовка типа C ++ (это cpp/appdata/il2cpp-types.h il2cpp.h Эти файлы должны присутствовать для успешного запуска сценария.
Если вы знаете, с какой версией единства была составлена бинарная, вы можете улучшить результат, указав это с помощью --unity-version , например, --unity-version 2019.3.1f1 . Вы также можете предоставить любой файл активов из приложения, чтобы обнаружить версию Unity с помощью --unity-version-from-asset . В противном случае IL2Cppinspector сделает образованное предположение на основе содержимого бинарного.
IL2CPPINSPECTOR генерирует следующие данные для проектов IDA:
Пример декомпиляции IDA C ++ после применения IL2CPPINSPECTOR (код инициализации опущен для краткости):

Запустите IL2CPPINSPECTOR с переключателем -p , чтобы выбрать выходной файл скрипта Ghidra и -t Ghidra (чувствительный к случаям), чтобы указать Ghidra как тип скрипта, который вы хотите создать.
Три файла генерируются IL2Cppinspector для Ghidra: сам скрипт Python, файл метаданных JSON и файл заголовка типа C ++. Эти файлы должны присутствовать для успешного запуска сценария.
Если вы знаете, с какой версией единства была составлена бинарная, вы можете улучшить результат, указав это с помощью --unity-version , например, --unity-version 2019.3.1f1 . Вы также можете предоставить любой файл активов из приложения, чтобы обнаружить версию Unity с помощью --unity-version-from-asset . В противном случае IL2Cppinspector сделает образованное предположение на основе содержимого бинарного.
Примечание. Для достижения наилучших результатов выберите «Нет», когда Гидра спрашивает, хотите ли вы выполнить автоматический анализ, когда бинарник сначала загружен. Если вы получаете Conflicting data exists at address при запуске приведенного ниже сценария, перегрузите двоичный файл в проект и выберите «Нет» в подсказке автоматического анализа.
Примечание. Чтобы значительно ускорить анализ для файлов ELF, установите базу изображения на ноль ( 0x00000000 ) в параметрах нагрузки для двоичного файла. По причинам совместимости выполнение скрипта Ghidra Python в файле ELF изменит базу изображения файла на ноль для вас, если это необходимо, однако, если текущая база изображения ненулевая, это может занять очень много времени для завершения. Другие форматы файлов сохранят ту же базу изображения.
Чтобы импортировать метаданные в существующий проект Ghidra:
В браузере кода выберите File -> Parse C Source ...
Создайте новый профиль и добавьте сгенерированный файл заголовка типа C ++. Это cpp/appdata/il2cpp-types.h по умолчанию, если вы использовали CLI, или il2cpp.h , если вы использовали графический интерфейс.
Убедитесь, что параметры Parse установлены точно так:
-D_GHIDRA_
Нажмите Parse, чтобы программировать и принять любые предупреждения. Это может занять много времени, чтобы завершить.
Откройте диспетчер сценариев и добавьте выводную папку, которую вы выбрали в IL2Cppinspector в качестве папки сценария.
Если вы использовали сценарии от IL2Cppinspector для других двоичных файлов, убедитесь, что файлы Python называются по -разному или отключите использование предыдущей папки сценариев.
Нажмите обновить, чтобы сценарий появился в диспетчере скриптов .
Щелкните правой кнопкой мыши сценарий и выберите «Запустить» . Это может занять некоторое время, чтобы завершить.

IL2Cppinspector генерирует идентичные данные для проектов Ghidra, как это происходит для IDA - для получения подробной информации см. В приведенном выше разделе.
Пример декомпиляции Ghidra C ++ после применения IL2Cppinspector:

IL2Cppinspector генерирует серию исходных файлов C ++, которые вы можете использовать различными способами, например:
Запустите IL2Cppinspector с переключателем -h , чтобы выбрать выходную папку C ++.
Если вы знаете, с какой версией единства была составлена бинарная, вы можете улучшить результат, указав это с помощью --unity-version , например, --unity-version 2019.3.1f1 . Вы также можете предоставить любой файл активов из приложения, чтобы обнаружить версию Unity с помощью --unity-version-from-asset . В противном случае IL2Cppinspector сделает образованное предположение на основе содержимого бинарного.
Вы можете ориентироваться на какого компилятора C ++ вы хотите использовать выходные файлы с помощью: указать --cpp-compiler MSVC для Visual Studio и --cpp-compiler GCC для GCC или Clang.
IL2CPPINSPECTOR выполняет автоматическое разрешение конфликта имени, чтобы избежать использования предварительно определенных символов и ключевых слов в C ++, и для обработки повторного определения символов в приложении.
Некоторые двоичные файлы IL2CPP содержат только частичный набор экспортов API или вообще. Для этих случаев IL2Cppinspector будет создавать строительные леса, используя только доступный экспорт, чтобы гарантировать, что проект успешно компилируется.

Создаются следующие файлы:
appdata -Эта папка содержит, агрессические бинарные, специфичные для проекта объявления: ilc2pp-types.h :
il2cpp-functions.h :
MethodInfo ** ) il2cpp-types-ptr.h :
Il2CppClass ** ) il2cpp-api-functions.h :
il2cpp-api-functions-ptr.h :
il2cpp_ ) il2cpp-metadata-version.h :
#define для версии IL2CPP, используемой Target BinaryПриведенные выше файлы содержат все данные, необходимые для динамического анализа в отладчике.
Кроме того, следующие файлы генерируются для инъекции DLL:
framework -Проект-агрессивный двоичный и агнотический код шаблон и леса:
dllmain.cpp :
init_il2cpp() (см. Ниже) и запускает Run() (см. Ниже) в новом потоке helpers.cpp и helpers.h :
helpers.h для получения подробной информации. il2cpp-init.cpp , il2cpp-init.h и il2cpp-appdata.h :
void init_il2cpp() , которая использует все вышеперечисленные заголовки для генерации использования указателей функций и указателей классов, которые отображаются в правильных местах на изображении в памяти во время выполнения. pch-il2cpp.cpp и pch-il2cpp.h :
appdata user -Двоирный, агрессивный пользовательский код специфического для проекта, который вы можете изменить по желанию:
main.cpp и main.h :Run() , которая обозначает точку входа для вашего индивидуального инъекционного кода. Функция выполняется в новом потоке и, следовательно, не блокирует DllMain .Это единственная папка, чьи файлы вы должны отредактировать .
Для пользователей Visual Studio также генерируются следующие файлы:
IL2CppDLL.vcxproj , Il2CppDLL.vcxproj.filters и Il2CppDLL.sln : main.cpp по умолчанию включает в себя комментированный код, чтобы позволить вам записать в журнал или открыть новую консоль, используя функции от helpers.h . Чтобы указать цель файла журнала в вашем исходном коде, используйте extern const LPCWSTR LOG_FILE = L"my_log_file.txt" .
Совет: Когда выпущен новая версия целевого приложения, вы можете повторно выпустить проект каркасов C ++ на месте. Папки appdata и framework будут перезаписаны, но user папки и файлы проекта/решения не будут изменены. Это позволяет легко обновлять ваш проект, когда целевое приложение было обновлено!
Совместимость: рекомендуется использовать Visual Studio 2019 (MSVC ++ Инструменты сборки V142 или более поздней версии). Проекты лесов были протестированы с помощью Visual Studio 2019 и Visual Studio 2017 (MSVC ++ Инструменты сборки V141), однако некоторые вспомогательные коды опущены при использовании Visual Studio 2017, чтобы позволить компиляции для достижения успеха.
Il2CppDLL.sln ) в Visual StudioRun() на main.cppУ вас есть доступ ко всем C#-эквивалентным типам и методам в приложении, а также всем доступным функциям API IL2CPP. Не требуется дополнительного указателя функции или типовых объявлений.
Пример (создайте Vector3 и зарегистрируйте его y координировать в файл):
// in main.cpp
void Run ()
{
// Vector3 example
// (Call an IL2CPP API function)
Vector3__Boxed* myVector3 = (Vector3__Boxed*) il2cpp_object_new ((Il2CppClass*) *Vector3__TypeInfo);
// (Call an instance constructor)
Vector3__ctor (myVector3, 1 . 0f , 2 . 0f , 3 . 0f , NULL );
// (Access an instance field)
il2cppi_log_write ( to_string (myVector3-> fields . y ));
}Более подробные учебники можно найти здесь:
Как создавать, использовать и отлаживать проекты IL2CPP DLL
Работа с кодом в проектах IL2CPP DLL впрыска
IL2Cppinspector может создать полное рабочее пространство Visual Studio с файлом решения (.sln), проекта (. Каждый проект создает одну сборку.
Используйте переключатель --project , чтобы создать рабочую область решения.
Чтобы IL2Cppinspector мог создавать ScriptAssemblies .
Примечание. Настройки по умолчанию выберут последнюю установленную версию Unity и последнюю установленную версию шаблона 3D -проекта по умолчанию, если они были установлены в месте по умолчанию.
Типичное местонахождение редактора Unity (указано с --unity-path ): C: Program Files Unity Hub Editor 20xx.yz
Типичное местоположение шаблона проекта Unity (указано с помощью --unity-assemblies ): C: Program Files Unity Hub Editor 20xx.yz Editor Data Resources PackageManager ProjectTemplates libcache <name-f-template>
Типичное расположение сценариев сценария единства в существующем проекте (указано с --unity-aseemblies ): x: myproject Library scriptassemblies
Замените X , Y и Z на номер версии Unity. Замените <mame-of-template> на желаемый шаблон.
Примечание. Вы можете использовать подстановочный знак Asterisk (*) один или несколько раз при указании этих путей. IL2Cppinspector выберет последнюю подходящую папку в буквенно -цифровом порядке. Это полезно, если у вас есть несколько установки Unity, и вы хотите всегда выбирать последнюю версию или шаблон.
В случае, если ссылки на сборку неправильно разрешаются в первый раз, когда вы загружаете решение, просто закрывайте и повторно откройте решение, чтобы заставить их решить.

IL2CPPINSPECTOR может создать файл JSON, содержащий различные метаданные о приложении.
Используйте переключатель -o , чтобы указать выходной путь JSON.
Выходная схема заключается в следующем:
addressMap (объект)
Адресная карта всего контента, связанного с IL2CPP в двоичном
methodDefinitions (массив) Виртуальный адрес, бинарный символ, сигнатуру функции C ++ и подпись метода .NET каждого .NET-эквивалентного метода в двоичном
constructedGenericMethods (массив) Виртуальный адрес, двоичный символ, сигнатуру функции C ++ и подпись метода .NET каждого .NET-эквивалентного бетонного общего метода в двоичном
customAttributesGenerators (массив) Виртуальный адрес, имя и функция C ++ из каждой пользовательской функции генератора атрибутов в двоичном
methodInvokers (массив) Виртуальный адрес, имя и функция C ++ каждого метода. Инвентация функции Thunk в двоичном
stringLiterals (массив) для единичных версий ниже 5.3.2: порядковые, имя и текст каждого строкового буквального буква в двоичном
typeInfoPointers (массив) Виртуальный адрес, имя, C ++ Имя типа и имя типа .NET эквивалентное каждому указателю определения класса ( Il2CppClass * ) в двоичном
typeRefPointers (массив) Виртуальный адрес, имя и тип .NET Имя эквивалентное каждому указателю ссылки типа ( Il2CppType * ) в двоичном
methodInfoPointers (массив) Виртуальный адрес, имя и метод .NET Стоимость каждого указателя определения метода выполнения ( MethodInfo * ) в двоичном
functionAddresses (массив) Виртуальные адреса начала каждой известной функции в двоике, включая все вышеупомянутые, плюс все другие обнаруженные, но не включенные в вышеуказанные категории
typeMetadata (массив) Виртуальный адрес, имя и тип C ++ Имя элементов метаданных ключей в двоичном. Это включает в себя Il2CppCodeRegistration и Il2CppMetadataRegistration , и в зависимости от двоичной версии также может включать указатель на каждый Il2CppCodeGenModule
arrayMetadata (массив) Виртуальный адрес, имя, тип C ++ и размер массивов метаданных ключей в двоичном
functionMetadata (массив) Виртуальный адрес, имя и функция C ++ функций ключевых метаданных в двоичном файле. В зависимости от того, как бинарник был проанализирован IL2Cppinspector, это может включать il2cpp_codegen_register .
apis (массив) Виртуальный адрес, имя и функция C ++ в каждой функции API IL2CPP, идентифицированной в двоичном
exports (массив) виртуальный адрес и имя каждого экспорта в двоичном
symbols (массив) Виртуальный адрес, имя и тип символов каждого именованного (нелезовая длина имени) и определение ненулевого адреса, тип, имя поля и импорт (для ELF), определяемые в двоичном изображении. В настоящее время не поддерживается для файлов PE.
Три сценария PowerShell предоставляются, чтобы обеспечить легкое строительство и тестирование двоичных файлов IL2CPP:
il2cpp.ps1 - это основная рабочая лошадка и компилирует каждый указанный исходный файл C# в TestSources (или все из них, если их не поставляется) в качестве отдельной сборки, и выводит их в TestAssemblies . Затем он принимает каждую указанную сборку в TestAssemblies и компилирует каждый как отдельный проект IL2CPP для каждой из этих архитектур:
Они помещаются в папку TestBinaries . Исходный код C ++ для каждой сборки помещается в папку TestCpp . Затем вызовы generate-tests.ps1 .
Укажите -assemblies разделяемый запятой список исходных файлов (без .cs .
При желании вы можете указать версию Unity или Unity Install с 2 -м аргументом (или -unityVersion ). Если никто не поставлен, будет использоваться последняя установленная версия Unity. Вы также можете указать подстановочные знаки, например. 2019* будет использовать последнюю установленную версию Unity 2019, 2018.3* будет использовать последнюю установленную версию Unity 2018.3 и т. Д. Используйте Unity Hub для установки желаемых версий.
Поэтому с помощью одной команды вы можете сгенерировать Assembly DLL, исходный код C ++ и двоичный IL2CPP для каждой архитектуры для любого данного списка исходных файлов, одного набора выходов на исходный файл, для указанной версии Unity.
generate-tests.ps1 генерирует файл с именем Tests.cs в проекте Il2CppTests , содержащий один тест на проект IL2CPP в TestBinaries . Этот файл будет составлен с помощью проекта Il2CppTests . Затем вы сможете увидеть один тест на проект IL2CPP в тестовом исследователе Visual Studio.
Автопогенерированные тесты генерируют файлы заголовков C#, JSON и C в тестовой папке BINARY IL2CPP в TestBinaries (каждый из которых предпринимается с помощью test ) и сравнивает их (нечувствительные к пробегу) с соответствующими файлами имени проекта в TestExpectedResults . Таким образом, вы можете проверить на наличие файлов с известной структурой, что анализ выполняется правильно, или пройти анализ конкретных двоичных файлов в отладчике без необходимости менять аргументы командной строки проекта.
update-expected-results.ps1 копирует все результаты выходных тестов из TestBinaries в TestExpectedResults , поэтому обновление файлов, которые будут использоваться для проверки правильных результатов теста.
Пример использует:
./il2cpp.ps1
Создает каждый исходный файл C# ìnto ASMARCLY DLL .NET, папку источника C ++ и один двоичный файл IL2CPP на поддерживаемую архитектуру
./il2cpp.ps1 MyFirstTest
Создает MyFirstTest.cs в MyFirstTest.dll , создает исходную папку C ++ под названием MyFirstTest и двоичный файл IL2CPP для каждой поддерживаемой архитектуры
./il2cpp.ps1 MyFirstTest,MySecondTest 2019.3.1f1
Создает MyFirstTest.cs и MySecondTest.cs в отдельные DLLS Assembly DLL, папки C ++ и двоичные файлы IL2CPP, используя Unity 2019.3.1f1
./il2cpp.ps1 MyFirstTest,MySecondTest F:UnityHubEditor2019.3.1f1
Как указано выше, но указывает пользовательский путь для вашей установки Unity.
Минимально поддерживаемая версия Unity - 2017.1.0f3.
Чтобы узнать больше об этих функциях, см. В разделе « Использование IL2Cppinspector» для генерации кода IL2CPP в IL2CPP Reverse Engineering Part 1.
Примечание. API IL2Cppinspector также доступны в виде пакета Nuget! (Поиск: Noisycowstudios.il2cppinspector)
IL2Cppinspector предлагает следующие API-интерфейсы библиотеки повторного использования:
Используйте эти API, чтобы легко запросить типы IL2CPP, создать новые выходные модули и интегрировать IL2Cppinspector с вашим собственным приложением статического анализа.
Чтобы использовать IL2CPPINSPECTOR в ваших собственных проектах, добавьте ссылку на Il2CppInspector.Common.dll .
Включите следующее, using директивы:
using Il2CppInspector to use Il2CppInspector .using Il2CppInspector.Reflection to use TypeModel .using Il2CppInspector.Model to use AppModel .See the source code for further details or the tutorials above.
Plugins should be placed in the plugins folder in the same folder as Il2CppInspector.exe . Each plugin should be placed into its own sub-folder with any dependencies or configuration files needed.
From the GUI you can enable and disable plugins, change the execution order and configure individual plugin settings via the Manage plugins... button.
From the CLI you can specify which plugins and settings to use as follows.
For one plugin:
Il2CppInspector.exe --plugins "myplugin --firstOption value1 --secondOption value2"
For multiple plugins:
Il2CppInspector.exe --plugins "plugin1 --option1 ..." "plugin2 --option2 ..." ...
Plugins will be executed in the order specified.
Core plugins (those that are part of Il2CppInspector's base functionality) are always enabled when using the CLI, but can be disabled in the GUI.
When using the CLI, core plugins always execute first by default. You can force the core plugins to execute in a different order by specifying their names in the desired execution order. Например:
Il2CppInspector.exe --plugins "analytics --output foo.csv"
will run the core plugins first then the analytics example plugin, but:
Il2CppInspector.exe --plugins "analytics --output foo.csv" "xor"
will cause the xor core plugin to run after analytics .
For help on a specific plugin, specify the plugin name with no arguments:
Il2CppInspector.exe --plugins myplugin
To get more plugins, click Get Plugins in the Manage Plugins window in the GUI, visit the Il2CppInspectorPlugins repository or use the get-plugins.ps1 or get-plugins.sh scripts to update to the latest plugin releases.

Plugins let you extend the functionality of Il2CppInspector. For example you can pre and post-process metadata and binaries to enable inspection of IL2CPP applications that Il2CppInspector cannot handle automatically.
Plugin support is currently experimental and has limited functionality.
Details on how to create your own plugins can be found in the Il2CppInspector Plugin Development Wiki.
You can find out more about plugins, and browse the source code of current plugins and examples in the Il2CppInspectorPlugins repository.
The current version of Il2CppInspector can output Python scripts targeting the IDA and Ghidra disassemblers.
When Il2CppInspector generates such a script, it generates a concatenation of a shared block of code ( Outputs/ScriptResources/shared-main.py ) which parses the JSON metadata and dispatches it to a set of implementation-specific functions to be processed, and a block of code specific to the target application which implements these functions (a file from Outputs/ScriptResources/Targets ).
If you would like to add support for a new target application, create a new Python script in Outputs/ScriptResources/Targets with the nane <target-name-without-whitespace>.py and implement the following functions:
CustomInitializer() - perform any custom initialization required for the target before applying the metadataDefineCode(code) - parse and apply the specified C++ declaration text (this is not required for Unity 5.3.2 and later; if you don't need to support earlier versions, just specify pass as the implementation)GetScriptDirectory() - retrieve the directory that the Python script is running in. This will normally be os.path.dirname(os.path.realpath(__file__))MakeFunction(start, name=None) - define address start as the start of a function, optionally with name nameSetComment(addr, text) - place the comment text at address addrSetFunctionType(addr, sig) - parse the C++ function signature in sig and apply it to the function at address addrSetHeaderComment(addr, text) - place the header/plate/pre-item comment text at address addrSetName(addr, name) - set the symbol (or label or name) of address addr to nameSetType(addr, type) - define address addr to be an item of the C++ type type Refer to the source code of IDA.py and Ghidra.py for examples.
When you add a new target and re-compile Il2CppInspector:
-t ( --script-target ) switch via the CLIIf you develop an API for a target that you think might be useful to others, please feel free to submit a PR with the code!
| Unity version | IL2CPP version | Поддерживать |
|---|---|---|
| 4.6.1+ | First release | Unsupported |
| 5.2.x | 15 | Unsupported |
| 5.3.0-5.3.1 | 16 | Работающий |
| 5.3.2 | 19 | Работающий |
| 5.3.3-5.3.4 | 20 | Работающий |
| 5.3.5-5.4.6 | 21 | Работающий |
| 5.5.0-5.5.6 | 22 | Работающий |
| 5.6.0-5.6.7 | 23 | Работающий |
| 2017.1.0-2018.2.21 | 24 | Работающий |
| 2018.3.0-2018.4.x | 24.1 | Работающий |
| 2019.1.0-2019.3.6 | 24.2 | Работающий |
| 2019.3.7-2019.4.14 | 24.3 | Работающий |
| 2019.4.15-2019.4.20 | 24.4 | Работающий |
| 2019.4.21-2019.4.x | 24.5 | Работающий |
| 2020.1.0-2020.1.10 | 24.3 | Работающий |
| 2020.1.11-2020.1.17 | 24.4 | Работающий |
| 2020.2.0-2020.2.3 | 27 | Работающий |
| 2020.2.4-2020.3.x | 27.1 | Работающий |
| 2021.1.0-2021.1.x | 27.2 | Частично |
Please refer to the companion repository https://github.com/nneonneo/Il2CppVersions if you would like to track the changes between each IL2CPP release version.
If you have files that don't work or are in an unsupported format, please open a new issue on GitHub and attach a sample with details on the file format, and I'll try to add support. Include both the IL2CPP binary and global-metadata.dat in your submission.
Please check the binary file in a disassembler to ensure that it is a plain IL2CPP binary before filing an issue. Il2CppInspector is not intended to handle packed, encrypted or obfuscated IL2CPP files.
If you found Il2CppInspector useful, you can really help support the project by making a small donation at http://paypal.me/djkaty!
You can also donate with bitcoin: 3FoRUqUXgYj8NY8sMQfhX6vv9LqR3e2kzz
Much love! - Katy
Thanks to the following major contributors!
This project uses:
Thanks to the following individuals whose code and research helped me develop this tool:
The following books and documents were also very helpful:
Pizza spinner animation in the GUI made by Chris Gannon - https://gannon.tv/
This software is licensed under AGPLv3.