من الأسف الشديد أن أعلنت أن العمل التنموي على IL2CppinSpector قد توقف في المستقبل المنظور.
والسبب في ذلك هو أنه بسبب الصحة والتغيرات في حياتي الشخصية ، ليس لدي وقت للالتزام بالعمل في المشروع بعد الآن. هذا أمر محبط للغاية بالنسبة لي ولكن هناك القليل الذي يمكنني فعله حيال ذلك.
لا تتردد في توتر المشروع وإجراء تحسينات! يمكنك أيضًا الاستمرار في نشر المشكلات لأنني أرغب في الحصول على مجموعة من الأخطاء والمشاكل المحفوظة في حالة أن أنا أو أي شخص آخر لديه فرصة للعودة إلى العمل على هذا. يرجى ملاحظة أنني لن أستجيب للقضايا أو المضي قدمًا في المستقبل المنظور.
إذا كنت بحاجة إلى Tooling IL2CPP ، فإنني أوصي بمشروع صديقي وزميله الممتاز CPP2IL ، وهو أداة عمل محدودة لتحويل ثنائيات IL2CPP مباشرة إلى رمز IL والتي يمكن مشاهدتها بسهولة في DNSPY وما إلى ذلك. هذه مهمة ماموث لذا يرجى الذهاب ودعم عمله في هذا المشروع المذهل!
قرصنة سعيد ،
كاتي.
يساعدك IL2CPPINSPECTOR على عكس تطبيقات IL2CPP على هندسة ، مما يوفر التحليل الأكثر اكتمالا حاليًا.

إخراج تعريفات نوع IL2CPP ، بيانات البيانات الوصفية والطريقة مثل رمز C# C#
إنشاء .NET Assembly Shim DLLs يحتوي على بنية تطبيق IL2CPP وبيانات التعريف لاستخدامها في عمليات إزالة الإلغاء مثل ILSPY و DNSPY أو Unity Asset مع AssetStudio أو توليد الوكيل المدارة مع IL2Cppassemblower
قم بإنشاء سقالات C ++ لجميع الأنواع والأساليب ووظائف الوظائف ووظائف API في تطبيق IL2CPP للاستخدام في X64DBG ، ركيزة Cydia إلخ.
إنشاء البرامج النصية IDA و Ghidra Python لإلغاء معلومات الرمز والوظيفة والنوع ؛ يتضمن خطافات API لتنفيذ البرامج النصية لأهداف أخرى
إنشاء مشاريع حقن Visual Studio C ++ DLL مباشرة من ملفات IL2CPP
قم بإنشاء حلول كود كود Visual Studio C# مباشرة من ملفات IL2CPP
إنشاء بيانات التعريف JSON مع خريطة عنوان كاملة مباشرة من ملفات IL2CPP.
إنشاء ثنائيات IL2CPP من رمز المصدر C# التعسفي بدون مشروع الوحدة
ثلاثة واجهات برمجة التطبيقات الرئيسية لاستخدامها في مشاريع التحليل الثابت المخصص الخاص بك للاستعلام عن البيانات الوصفية الثنائية ذات المستوى المنخفض ، ونموذج نوع .NET وتطبيق C ++ بالكامل. هذه متوفرة أيضا كحزمة nuget.
يتيح لك SDK المكوّن الإضافي إنشاء مكونات إضافية مخصصة لتوسيع قدرات IL2CppinSpector
يهزم أنواع معينة من التشويش
يدعم جميع تنسيقات الملفات الرئيسية وأبنية المعالجات
يعمل على Windows و MacOS X و Linux. واجهة المستخدم الرسومية المتكاملة لمستخدمي Windows بدعم السحب والإسقاط
تم اختباره مع كل إصدار من IL2CPP منذ الوحدة 5.3.0
يمكنك قراءة المزيد حول كيفية عمل IL2CPP في سلسلتي IL2CPP Engineering:
الجزء 1: Hello World و IL2CPP Toolchain
الجزء 2: نظرة عامة هيكلية وإيجاد البيانات الوصفية
IL2CPPINSPECTOR تطوير البرنامج المساعد ويكي
كيفية إنشاء واستخدام وتصحيح مشاريع حقن IL2CPP DLL
العمل مع رمز في مشاريع حقن IL2CPP DLL
باستخدام نموذج نوع IL2CppinSpector لاستخراج تعريفات Net Protobuf (دراسة الحالة: خريف الرجال)
يشرح العثور على اللوادر اللوحيين لملفات metadata.dat global-metadata-كيفية العثور على رمز اللودر ، deobfuscation و/أو فك التشفير لـ global-metadata.dat في أي تطبيق IL2CPP تقريبًا
تمكين تحميل League of Legends: Wild Rift - يغطي فك التشفير Xor ، وفك تشفير سلسلة XOR ، وفك تشفير تصدير API ، وبيانات بيانات البيانات الوصفية الثنائية
تمكين تحميل Honkai Impact (3 أجزاء) - يغطي وظائف العثور على صورة في صورة ، واضطراب البيانات من Metadata.dat ، Ida Decompiler Techniques ، كيفية كتابة المكون الإضافي
VMPROTECT CONTROL تدفق التغلب في Honkai Impact - يغطي استخراج مسار الكود من دالة مع تسطيح تدفق التحكم باستخدام X64DBG و IDA Decompiler
عكس تأثير Genshin Engineering مع PowerShell - يغطي كتابة تسخير اختبار للعثور على وظيفة في ثنائي مفعم بالحيوية من خلال هجوم / هجوم عكسي الغاشمة
تنسيق الملف ودعم الهندسة المعمارية:
جميل أن يكون:
using التوجيهات. يتم حل تعارضات النطاق والنوع تلقائيًا لإنتاج رمز يجمع.أهداف مكتبة الفصل .NET CORE 3.1. بنيت مع Visual Studio 2019.
ملاحظة : IL2CppinSpector ليس decompiler. يمكن أن يوفر لك بنية عناوين التطبيق وعناوين الوظائف لكل طريقة بحيث يمكنك بسهولة القفز مباشرة إلى طرق الاهتمام في Disassembler. لا يحاول استرداد رمز المصدر بالكامل للتطبيق.
git clone --recursive https://github.com/djkaty/Il2CppInspector
cd Il2CppInspector
بناء إصدارات CLI و Windows GUI:
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 .
يتم وضع الإخراج الثنائي لنظام التشغيل Windows في 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 و APKS/Xapks مع ثنائيات للبنية المتعددة : عند استخدام CLI ، سيتم إنشاء ملفات الإخراج المتعددة ، مع كل اسم ملف إلى جانب اللاحقة الأولى التي تم تحريكها بواسطة فهرس الصورة في الثنائي. سيتم تخطي الصور غير المدعومة.
حزم IPA : يجب فك تشفير القابلة للتنفيذ أولاً. الثنائيات القابلة للتنفيذ المشفرة غير مدعومة.
تقسيم حزم APK : عند استخدام CLI ، حدد قائمة ملفات APK مع فاصلة بين كل اسم ملف.
ثنائيات ELF التي تم إنشاؤها من مقالب الذاكرة : حدد قاعدة الصور (في HEX) باستخدام --image-base . إذا كانت قاعدة الصور المقدمة غير صحيحة ، فقد يعطل التطبيق.
GameGuardian Dumps (وغيرها من مقالب خريطة عملية Linux) : يمكنك استخدام ملف *-maps.txt بدلاً من ثنائي IL2CPP. سيقوم IL2CppinSpector بمسح المجلد الذي يحتوي على ملف الخرائط لمطابقة ملفات .bin وإعادة تجميعها وإعادة تجميعها libil2cpp.so تلقائيًا. لذلك لا تحتاج إلى إنشاء الملف يدويًا أو توفير عنوان قاعدة صورة عند استخدام هذا النوع من التفريغ. لكي ينجح هذا ، لا يجب إعادة تسمية الملف النصي أو أي من الملفات الثنائية ، ويجب أن يكون كل شيء في نفس المجلد.
ملفات PE المعبأة (DLLS) : تحذير: إن تحميل ملف PE المعبأ سيؤدي إلى تنفيذ نقطة إدخال DLL ووظائف التهيئة. لا تقم بتحميل DLLs الضارة وعدم تشغيل IL2CppinSpector كمسؤول عند التعامل مع ملفات PE المعبأة. استخدم على مسؤوليتك الخاصة.
يمكن لـ IL2CppinSpector إنشاء ملفات C# Code Coll مع بيانات تعريف المؤشر للسماح لك باستكشاف 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 ، أي. ستكون سلسلة من Sub-Folders System/IO/Compression بدلاً من ذلك 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 افتراضيًا إذا كنت تستخدم CLI ، أو il2cpp.h إذا كنت تستخدم GUI). يجب أن تكون هذه الملفات موجودة حتى يعمل البرنامج النصي بنجاح.
إذا كنت تعرف أي إصدار من الوحدة التي تم تجميعها الثنائي ، فيمكنك تحسين الإخراج من خلال تحديد ذلك مع- --unity-version ، على سبيل المثال- --unity-version 2019.3.1f1 . يمكنك أيضًا تزويد أي ملف أصول من التطبيق للكشف عن إصدار الوحدة باستخدام- --unity-version-from-asset . وإلا فإن IL2CppinSpector سوف يقوم بتخمين متعلم استنادًا إلى محتويات الثنائي.
ينشئ IL2CppinSpector البيانات التالية لمشاريع IDA:
مثال IDA C ++ بعد تطبيق IL2CPPINSPECTOR (تم حذف رمز التهيئة للإيجاز):

قم بتشغيل IL2CppinSpector مع مفتاح -p لاختيار ملف إخراج Script Ghidra ، و -t Ghidra (حساس للحالة) لتحديد Ghidra كنوع البرنامج النصي الذي ترغب في إنتاجه.
يتم إنشاء ثلاثة ملفات بواسطة IL2CppinSpector لـ Ghidra: The Python Script نفسه ، ملف بيانات تعريف JSON وملف رأس C ++. يجب أن تكون هذه الملفات موجودة حتى يعمل البرنامج النصي بنجاح.
إذا كنت تعرف أي إصدار من الوحدة التي تم تجميعها الثنائي ، فيمكنك تحسين الإخراج من خلال تحديد ذلك مع- --unity-version ، على سبيل المثال- --unity-version 2019.3.1f1 . يمكنك أيضًا تزويد أي ملف أصول من التطبيق للكشف عن إصدار الوحدة باستخدام- --unity-version-from-asset . وإلا فإن IL2CppinSpector سوف يقوم بتخمين متعلم استنادًا إلى محتويات الثنائي.
ملاحظة: للحصول على أفضل النتائج ، اختر لا عندما يسأل Ghidra عما إذا كنت ترغب في إجراء التحليل التلقائي عندما يتم تحميل الثنائي لأول مرة. إذا تلقيت Conflicting data exists at address عند تشغيل البرنامج النصي أدناه ، فأعد تحميل الثنائي في المشروع واختر لا في موجه التحليل التلقائي.
ملاحظة: لتسريع التحليل بشكل كبير لملفات ELF ، قم بتعيين قاعدة الصور على الصفر ( 0x00000000 ) في خيارات التحميل للثنائي. لأسباب توافق ، سيؤدي تنفيذ البرنامج النصي Ghidra Python على ملف ELF إلى تغيير قاعدة صور الملف إلى صفر لك إذا لزم الأمر ، ولكن إذا كانت قاعدة الصورة الحالية غير صفرية ، فقد يستغرق الأمر وقتًا طويلاً لإكماله. سوف تحتفظ تنسيقات الملفات الأخرى بنفس قاعدة الصور.
لاستيراد البيانات الوصفية إلى مشروع Ghidra الحالي:
من متصفح الرمز ، اختر ملف -> Parse C Source ...
قم بإنشاء ملف تعريف جديد وأضف ملف رأس C ++ الذي تم إنشاؤه. هذا هو cpp/appdata/il2cpp-types.h افتراضيًا إذا كنت تستخدم CLI ، أو il2cpp.h إذا كنت تستخدم واجهة المستخدم الرسومية.
تأكد من تعيين خيارات التحليل بالضبط على النحو التالي:
-D_GHIDRA_
انقر فوق Parse لبرنامج وقبول أي تحذيرات. هذا قد يستغرق وقتا طويلا لإكمال.
افتح Script Manager وأضف مجلد الإخراج الذي اخترته في IL2CppinSpector كمجلد نص.
إذا كنت قد استخدمت البرامج النصية من IL2CppinSpector للثنائيات الأخرى ، فتأكد من تسمية ملفات Python بشكل مختلف ، أو تعطيل استخدام مجلد (مجلد) البرنامج النصي السابق.
انقر فوق Refresh لجعل البرنامج النصي يظهر في Script Manager .
انقر بزر الماوس الأيمن فوق البرنامج النصي واختر التشغيل . هذا قد يستغرق بعض الوقت لإكمال.

يقوم IL2CppinSpector بإنشاء بيانات متطابقة لمشاريع Ghidra كما هو الحال بالنسبة لـ IDA - راجع القسم أعلاه للحصول على التفاصيل.
مثال على إلغاء إبطال Ghidra C ++ بعد تطبيق IL2CppinSpector:

ينشئ IL2CppinSpector سلسلة من ملفات مصدر C ++ يمكنك استخدامها بطرق متنوعة ، على سبيل المثال:
قم بتشغيل IL2CppinSpector مع مفتاح -h لاختيار مجلد إخراج C ++.
إذا كنت تعرف أي إصدار من الوحدة التي تم تجميعها الثنائي ، فيمكنك تحسين الإخراج من خلال تحديد ذلك مع- --unity-version ، على سبيل المثال- --unity-version 2019.3.1f1 . يمكنك أيضًا تزويد أي ملف أصول من التطبيق للكشف عن إصدار الوحدة باستخدام- --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 الذي يستخدمه الهدف الثنائيتحتوي الملفات أعلاه على جميع البيانات اللازمة للتحليل الديناميكي في مصحح الأخطاء.
بالإضافة إلى ذلك ، يتم إنشاء الملفات التالية لحقن 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 ++ Scaffolding في مكانه. سيتم كتابة مجلدات appdata و framework ولكن لن يتم تغيير مجلد user وملفات المشروع/الحل. هذا يجعل من السهل تحديث مشروعك عند تحديث التطبيق المستهدف!
التوافق: يوصى باستخدام Visual Studio 2019 (MSVC ++ Build Tools V142 أو أحدث). تم اختبار مشاريع السقالات مع Visual Studio 2019 و Visual Studio 2017 (MSVC ++ Build Tools V141) ، ومع ذلك يتم حذف بعض رمز المساعد عند استخدام Visual Studio 2017 من أجل تمكين التجميع من النجاح.
Il2CppDLL.sln ) إلى Visual StudioRun() في main.cppيمكنك الوصول إلى جميع الأنواع والأساليب المكافئة في التطبيق ، بالإضافة إلى جميع وظائف 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 مع ملف Solution (.sln) ، وملفات Project (.csproj) وهيكل المجلد الشبيهة بالمساحة الفئة. كل مشروع يخلق مجموعة واحدة.
استخدم مفتاح --project لإنشاء مساحة عمل حل.
من أجل أن تكون IL2CPPInspector قادرة على إنشاء ملفات .csproj التي تحتوي على مراجع تجميع الوحدة الصحيحة ، يجب عليك توفير المسار إلى محرر الوحدة المثبت وقالب المشروع أو مجلد ScriptAssemblies لمشروع الوحدة الحالي.
ملاحظة: ستقوم الإعدادات الافتراضية بتحديد أحدث إصدار مثبت من Unity وأحدث إصدار مثبت من قالب المشروع ثلاثي الأبعاد الافتراضي ، إذا تم تثبيته في الموقع الافتراضي.
موقع محرر الوحدة النموذجي (محدد مع- --unity-path ): C: Program Files Unity Hub Editor 20xx.yz
موقع قالب مشروع الوحدة النموذجي (محدد مع- --unity-assemblies ): C: Program Files Unity Hub Editor 20xx.yz Editor Data Resources packagemanager projectTemplates libcache <name-tempth>
موقع مجموعات البرنامج النصي النموذجي في المشروع الحالي (محدد مع- --unity-aseemblies ): x: myProject library scriptassemblies
استبدل x و y و z برقم إصدار الوحدة الخاص بك. استبدل <name-themplate> بالقالب المطلوب.
ملاحظة: يمكنك استخدام Asterisk Wildcard (*) مرة أو أكثر عند تحديد هذه المسارات. سيقوم IL2CppinSpector باختيار آخر مجلد مطابقة بالترتيب الأبجدي الرقمي. يعد هذا مفيدًا إذا كان لديك العديد من الوحدة جنبًا إلى جنب ، وترغب دائمًا في تحديد أحدث إصدار أو قالب.
في حالة عدم حل مراجع التجميع بشكل صحيح في المرة الأولى التي تقوم فيها بتحميل حل ، ما عليك سوى إغلاق الحل وإعادة فتحه لإجبارهم على حلها.

يمكن لـ IL2CppinSpector إنشاء ملف JSON يحتوي على بيانات بيانات مختلفة حول التطبيق.
استخدم مفتاح -o لتحديد مسار إخراج JSON.
مخطط الإخراج كما يلي:
addressMap (كائن)
خريطة عنوان لجميع المحتوى المتعلق بـ IL2CPP في ثنائي
methodDefinitions (Array) العنوان الظاهري ، الرمز الثنائي ، توقيع وظيفة C ++ وتوقيع طريقة .NET لكل طريقة .NET المعادلة في الثنائي
constructedGenericMethods (صفيف) العنوان الظاهري ، الرمز الثنائي ، توقيع وظيفة C ++ وتوقيع طريقة .NET لكل طريقة عامة ملموسة .NET في الثنائي
customAttributesGenerators (Array) العنوان الظاهري والاسم ووظيفة C ++ لكل وظيفة مولد سمات مخصصة في الثنائي
methodInvokers (Array) العنوان الظاهري والاسم ووظيفة C ++ لكل طريقة.
stringLiterals (Array) لإصدارات الوحدة أقل من 5.3.2: الترتيب والاسم والنص لكل سلسلة حرفية في الإصدار الثنائي للوحدة 5.3.2 وبعد ذلك: العنوان الظاهري والاسم والنص لكل سلسلة حرفية في الثنائي
typeInfoPointers (صفيف) العنوان الظاهري ، الاسم ، C ++ اسم النوع المشتق و .NET اسم النوع المكافئ لكل مؤشر تعريف الفئة ( Il2CppClass * ) في الثنائي
typeRefPointers (صفيف) العنوان الافتراضي والاسم ونوع .NET اسم ما يعادل كل مؤشر مرجع النوع ( Il2CppType * ) في الثنائي
methodInfoPointers (Array) العنوان الظاهري والاسم MethodInfo *
functionAddresses (Array) العناوين الافتراضية لبداية كل وظيفة معروفة في الثنائي ، بما في ذلك كل تلك المذكورة أعلاه بالإضافة إلى أي غيرها تم اكتشافها ولكن لم يتم تضمينها في الفئات أعلاه
typeMetadata (صفيف) العنوان الظاهري والاسم ونوع C ++ من عناصر بيانات مفاتيح مفتاح في الثنائي. Il2CppCodeGenModule ذلك Il2CppCodeRegistration و Il2CppMetadataRegistration
arrayMetadata (Array) العنوان الظاهري ، الاسم ، اسم نوع C ++ وحجم صفائف البيانات الوصفية الرئيسية في الثنائي
functionMetadata (Array) العنوان الظاهري والاسم وتوقيع وظيفة C ++ لوظائف البيانات الوصفية الرئيسية في الثنائي. اعتمادًا على كيفية تحليل الثنائي بواسطة IL2CppinSpector ، قد يشمل ذلك il2cpp_codegen_register .
apis (صفيف) العناوين الظاهرية والاسم وتوقيع وظيفة C ++ لكل وظيفة API IL2CPP المحددة في الثنائي
exports (صفيف) العنوان الافتراضي واسم كل تصدير في الثنائي
symbols (صفيف) العنوان الظاهري والاسم ونوع الرمز لكل تسمية (طول الاسم غير الصفر) ووظيفة عنوان غير صفرية ، النوع ، اسم الحقل والاستيراد (لـ ELF) المحدد في الثنائي. غير مدعوم حاليًا لملفات PE.
يتم توفير ثلاث برامج نصية من PowerShell لتمكين بناء واختبار ثنائيات IL2CPP: IL2CPP:
il2cpp.ps1 هو العمود الفقري الرئيسي وتجمع كل ملف مصدر C# محدد في TestSources (أو جميعها إذا لم يتم توفير أي منها) كتجميع منفصل ، ويخرجها إلى TestAssemblies . ثم يستغرق كل مجموعة محددة في TestAssemblies وتجمع كل واحد كمشروع IL2CPP منفصل لكل من هذه البنية:
يتم وضع هذه في مجلد TestBinaries . يتم وضع رمز مصدر C ++ لكل بناء في مجلد TestCpp . ثم المكالمات generate-tests.ps1 .
حدد قائمة مفصولة بالفاصلة من ملفات المصدر (بدون امتداد .cs ) للمعالجة كوسيطة أولى (أو -assemblies ).
يمكنك اختياريا تحديد إصدار وحدة أو مسار تثبيت الوحدة مع الوسيطة الثانية (أو -unityVersion ). إذا لم يتم توفير أي منها ، فسيتم استخدام أحدث إصدار من الوحدة المثبتة. يمكنك أيضًا تحديد أحرف البدل ، على سبيل المثال. سيستخدم 2019* أحدث إصدار مثبت من Unity 2019 ، 2018.3* سيستخدم أحدث إصدار مثبت من Unity 2018.3 وما إلى ذلك.
لذلك باستخدام أمر واحد ، يمكنك إنشاء DLL التجميع ، ورمز المصدر C ++ و IL2CPP ثنائي لكل بنية لأي قائمة معينة من الملفات المصدر ، مجموعة واحدة من المخرجات لكل ملف مصدر ، للحصول على إصدار محدد من الوحدة.
generate-tests.ps1 يولد ملفًا يسمى Tests.cs في مشروع Il2CppTests ، يحتوي على اختبار واحد لكل مشروع IL2CPP في TestBinaries . سيتم تجميع هذا الملف بواسطة مشروع Il2CppTests . ستتمكن بعد ذلك من رؤية اختبار واحد لكل مشروع IL2CPP في مستكشف اختبار Visual Studio.
تقوم الاختبارات التي تم إنشاؤها تلقائيًا بإنشاء ملفات C#و JSON و C في مجلد Test IL2CPP Binary في TestBinaries (كل اسم ملف مسبوق مع test ) ويقارنها (غير حساسة للمسافة البيضاء) مع ملفات اسم المشروع المقابلة في TestExpectedResults . وبهذه الطريقة ، يمكنك التحقق من الملفات ذات بنية معروفة بأن التحليل يتم إجراؤه بشكل صحيح ، أو خطوة من خلال تحليل الثنائيات المحددة في مصحح الأخطاء دون الحاجة إلى تغيير وسيطات خط الأوامر للمشروع.
يقوم update-expected-results.ps1 بنسخ جميع نتائج اختبار الإخراج من TestBinaries إلى TestExpectedResults ، وبالتالي تحديث الملفات التي سيتم استخدامها للتحقق من نتائج الاختبار الصحيحة.
يستخدم مثال:
./il2cpp.ps1
يبني كل ملف مصدر C# ìnto A .NET Assembly DLL ، مجلد مصدر C ++ و IL2CPP ثنائي لكل بنية مدعومة
./il2cpp.ps1 MyFirstTest
يبني MyFirstTest.cs في MyFirstTest.dll ، ينشئ مجلد مصدر C ++ يدعى MyFirstTest و IL2CPP ثنائي لكل بنية مدعومة
./il2cpp.ps1 MyFirstTest,MySecondTest 2019.3.1f1
يبني MyFirstTest.cs و MySecondTest.cs في DLLs التجميع الفردية ، ومجلدات مصدر C ++ و IL2CPP ، باستخدام Unity 2019.3.1f1
./il2cpp.ps1 MyFirstTest,MySecondTest F:UnityHubEditor2019.3.1f1
كما هو مذكور أعلاه ولكن يحدد مسارًا مخصصًا لتثبيت الوحدة.
الحد الأدنى للوحدة المدعومة هو 2017.1.0f3.
لمعرفة المزيد حول هذه الميزات ، راجع القسم الذي يحق له استخدام IL2CPPInspector لإنشاء رمز IL2CPP في الجزء 1 من IL2CPP Engineering Part 1.
ملاحظة: تتوفر واجهات برمجة التطبيقات IL2CPPINSPECTOR أيضًا كحزمة nuget! (بحث: noisycowstudios.il2cppinspector)
يقدم IL2CppinSpector واجهات برمجة تطبيقات مكتبة الفصل القابلة لإعادة الاستخدام التالية:
استخدم واجهات برمجة التطبيقات هذه للاستعلام بسهولة عن أنواع IL2CPP ، وإنشاء وحدات إخراج جديدة ودمج IL2CppinSpector مع تطبيقات التحليل الثابت الخاص بك.
للاستفادة من IL2CppinSpector في مشاريعك الخاصة ، أضف إشارة إلى Il2CppInspector.Common.dll .
Include the following using directives:
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+ | الإصدار الأول | 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.