mcpField
R
rev-u3d-dump

rev-u3d-dump

github.com/p4nda0s開発2.3k1.8k 回インストール25 週間前に更新
リポジトリ

rev-u3d-dump について

rev-u3d-dumpは、Unity IL2CPPビルドからC#のメソッド名、アドレス、型定義を抽出し、IDAやGhidraでの解析に使うスキルです。ネイティブバイナリとメタデータの対応付け、ツール選択、結果の取り込み手順を扱います。

主な機能

  1. 01メソッド名とアドレスの抽出
  2. 02C#型定義のダンプ
  3. 03メタデータバージョンの確認
  4. 04IDA/Ghidra用インポートファイルの生成
  5. 05IL2CPPビルドファイルの特定

活用シーン

  1. 01IDAで関数名を復元
  2. 02型定義をバイナリ解析に取り込む
  3. 03Unity IL2CPPビルドを解析

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/p4nda0s/reverse-skills --skill rev-u3d-dump

インストール後、Claude Code で/rev-u3d-dumpを入力して読み込まれたか確認します。

詳細

rev-u3d-dump - Unity IL2CPP シンボルダンパー

IDA/Ghidra での解析に向けて、Unity IL2CPP ビルドから C# のメソッド名、アドレス、型定義を抽出します。


概要

Unity IL2CPP は C# をネイティブコードにコンパイルします。元のクラス名やメソッド名はバイナリから削除されますが、global-metadata.dat には保持されています。このツールは、ネイティブ関数のアドレスと元の C# 名との対応関係を復元します。

Unity ビルドの主要ファイル
ファイル場所用途
ネイティブバイナリiOS: Frameworks/UnityFramework.framework/UnityFramework
Android: lib/{arch}/libil2cpp.so
コンパイル済み C# コード(Mach-O/ELF)
メタデータData/Managed/Metadata/global-metadata.datすべての型/メソッド/文字列情報

ツールの選択

Il2CppDumper(メタデータ v39 以降に推奨)

Unity 6 以降のビルドでは、v39 フォークを使用します。

  • リポジトリ:https://github.com/roytu/Il2CppDumper(ブランチ:v39)
  • メタデータ v24~v39 に対応
  • 関数アドレスを含む script.json を出力し、IDA/Ghidra にそのままインポートできます

オリジナルの Il2CppDumper(https://github.com/Perfare/Il2CppDumper)は、v29 までしか対応していません。

Cpp2IL(代替)
  • リポジトリ:https://github.com/SamboyCoding/Cpp2IL
  • メタデータ v39 に対応していますが、ダミー DLL に [Address] 属性がありません
  • C# ソースの再構築には役立ちますが、IDA へのインポートには適していません

手順

手順 1:IL2CPP ファイルを見つける

iOS(IPA):

# Unzip IPA
unzip -o app.ipa -d .

# Binary
BINARY="Payload/<AppName>.app/Frameworks/UnityFramework.framework/UnityFramework"

# Metadata
METADATA="Payload/<AppName>.app/Data/Managed/Metadata/global-metadata.dat"

Android(APK):

# Unzip APK
unzip -o app.apk -d .

# Binary (pick target arch)
BINARY="lib/arm64-v8a/libil2cpp.so"

# Metadata
METADATA="assets/bin/Data/Managed/Metadata/global-metadata.dat"
手順 2:メタデータのバージョンを確認する
# First 8 bytes: magic (4) + version (4), little-endian
xxd -l 8 "$METADATA"
# Expected: af1b b1fa 2700 0000  → magic OK, version = 0x27 = 39
バージョンUnityツール
≤ 29Unity 2021 以前オリジナルの Il2CppDumper
31Unity 2022オリジナルの Il2CppDumper(一部対応)
39Unity 6(6000.x)roytu/Il2CppDumper v39 フォーク
手順 3:Il2CppDumper(v39 フォーク)をビルドして実行する
# Clone v39 fork
git clone -b v39 https://github.com/roytu/Il2CppDumper.git

# Build
cd Il2CppDumper
DOTNET_ROLL_FORWARD=LatestMajor dotnet build -c Release

# Run (use net8.0 framework)
DOTNET_ROLL_FORWARD=LatestMajor dotnet run \
  --project Il2CppDumper/Il2CppDumper.csproj \
  -c Release --framework net8.0 \
  -- "$BINARY" "$METADATA" output_dir

注意:

  • DOTNET_ROLL_FORWARD=LatestMajor を設定すると、プロジェクトが .NET 6/8 を対象としていても、.NET 9/10 で実行できます
  • 非対話モードでの終了コード 134 は正常です(最後の Console.ReadKey() が原因です)
  • macOS でバイナリが SIGKILL で終了される場合は、アドホック署名を付与します:codesign -s - <binary>
手順 4:出力を確認する

正常に実行されると、出力ディレクトリに次のファイルが生成されます。

ファイルサイズ(一般的な値)用途
script.json50~100 MB関数アドレス+名前+シグネチャ(IDA/Ghidra へのインポート用)
dump.cs10~30 MBRVA/VA アドレスを含む C# クラスダンプ
il2cpp.h50~100 MB型のインポート用 C 構造体定義
ida_py3.py約 2 KBIDA Python インポートスクリプト

script.json の形式を確認します。

{
  "ScriptMethod": [
    {
      "Address": 40865744,
      "Name": "ClassName$$MethodName",
      "Signature": "ReturnType ClassName__MethodName (args...);",
      "TypeSignature": "viii"
    }
  ]
}

dump.cs の形式を確認します。

// RVA: 0x1A2B3C4 Offset: 0x1A2B3C4 VA: 0x1A2B3C4
public void MethodName() { }
手順 5:IDA にインポートする
  1. IDA でネイティブバイナリ(UnityFramework/libil2cpp.so)を開きます
  2. script.json と ida_py3.py を同じディレクトリに配置します
  3. File → Script file... → ida_py3.py を選択します
  4. スクリプトが script.json を読み込み、すべての関数の名前を自動変更します
  5. 任意:File → Load file → Parse C header file... → il2cpp.h を選択して構造体型を読み込みます
手順 5(代替):Ghidra にインポートする
  1. Ghidra でバイナリを開きます
  2. Il2CppDumper に含まれる ghidra.py または ghidra_with_struct.py スクリプトを使用します
  3. 同じディレクトリに script.json を配置し、Window → Script Manager → Run を実行します

トラブルシューティング

エラー原因対処方法
not a supported version[39]オリジナルの Il2CppDumper を使用しているroytu/Il2CppDumper v39 フォークに切り替えます
終了コード 137(SIGKILL)macOS でバイナリが未署名codesign -s - <binary>
Cannot read keys(終了コード 134)非対話型コンソール無視してください。ダンプは正常に完了しています
DOTNET_ROLL_FORWARD エラー.NET のバージョン不一致DOTNET_ROLL_FORWARD=LatestMajor を設定します
出力が空バイナリとメタデータの組み合わせが誤っている両方のファイルが同じビルドのものか確認します

出力の活用に関するヒント

  • dump.cs は最も手早く参照できます。RVA アドレスを使ってクラス名やメソッド名を検索してください
  • script.json の Address 値は 10 進数です。IDA で使用するには 16 進数に変換します:hex(40865744) → 0x26F8FD0
  • dump.cs のフィールドオフセット(例:// 0x20)はオブジェクトのベースからの相対値であり、Frida を使ったメモリ検査に役立ちます

コメント