mcpField
R
re-ios

re-ios

github.com/dslsdzcセキュリティ20651 回インストール2 週間前に更新
リポジトリ

re-ios について

IPA ファイルやインストール済みアプリを調べる、リバースエンジニア向けの iOS アプリ解析スキルです。Mach-O と Objective-C メタデータの静的解析に加え、管理下のデバイスでのデバッグや App Store バイナリの復号手順を扱います。

主な機能

  1. 01IPA の展開と署名の確認
  2. 02Objective-C ヘッダーとクラス情報の出力
  3. 03Mach-O のアーキテクチャと依存関係の確認
  4. 04脱獄環境でのアプリデバッグ
  5. 05対応する dumper による App Store バイナリの復号

活用シーン

  1. 01IPA と主実行ファイルの初期調査
  2. 02逆コンパイル前のアプリクラス確認
  3. 03静的解析前の暗号化状態の特定
  4. 04脱獄デバイスでのアプリデバッグ

インストール

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

$npx skills add https://github.com/dslsdzc/rev-skills --skill re-ios

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

同梱ファイルreferences/commands.mdreferences/gotchas.md

詳細

iOS アプリ分析

使用する場合/使用しない場合

  • 使用する:IPA/インストール済み iOS アプリを入手しており、Mach-O 構造、OC クラス構造、コード署名、脱獄環境での動的分析を確認する必要がある場合
  • 使用する:App Store の暗号化バイナリを復号する必要がある場合
  • 使用しない:目的が Mach-O 構造/load commands の確認だけの場合(直接 [[re-format-macho]] を使用)
  • 使用しない:実行時の hook/バイパスが必要な場合([[re-frida]] を使用)
  • 使用しない:脱獄済みデバイスも管理対象デバイスもない動的分析シナリオ(まず静的分析を行い、動的分析の制限については「落とし穴 3」を参照)

ツールの準備

静的分析(展開/class-dump/otool)はサンドボックス不要です。動的分析(脱獄デバイス/シミュレーター/管理対象デバイス)は、[[re-analyze/platform-tips]] の最優先原則に従い、管理された環境で実行してください。

unzip / zipinfo —— ipa の展開
  • Linux:apt install unzip / dnf install unzip / pacman -S unzip
  • macOS:/usr/bin/unzip が付属しています。Windows/WSL:WSL 内の Linux 版を使用します
  • 確認:unzip -v
class-dump —— OC ヘッダーファイルのエクスポート
  • macOS:公式リポジトリ nygard/class-dump の最新リリース 3.4 はソースのみで、ビルド済みバイナリはありません。ソースをビルド(xcodebuild)して使用します。brew install class-dump のフォーミュラは homebrew-core から削除されており(2026 年の実測で formulae.brew.sh に該当フォーミュラなし)、利用できません
  • 代替:class-dump-swift(mxms0/class-dump-swift)も OC と Swift のクラス/メソッドのエクスポートに対応しており、ソースをビルドして使用します(LLVM + make が必要で、Swift ツールチェーンは不要)。Swift の対象にはこちらを優先します
  • Linux/Windows:公式版はありません。class-dump-swift のソースをコンパイルして使用するか(LLVM + make が必要で、Swift ツールチェーンは不要)、macOS 仮想マシン/リモート macOS 上で実行してください
  • 確認:class-dump --help(usage が出力されれば問題ありません)
otool —— Mach-O 構造/シンボルの確認(Apple 付属)
  • macOS:xcode-select --install(Xcode Command Line Tools)
  • Linux の代替:llvm-otool(apt install llvm / brew install llvm)
  • 確認:otool -h /bin/ls
idevice ツールチェーン(libimobiledevice)—— デバイスの識別/情報取得
  • macOS:brew install libimobiledevice(idevice_id / ideviceinfo / ideviceinstaller を含む)
  • Linux:apt install libimobiledevice-utils(Debian/Ubuntu)。Arch:pacman -S libimobiledevice
  • 確認:idevice_id -l で接続済みデバイスの UDID を一覧表示します。ideviceinfo でデバイスのモデル/iOS バージョン/UDID を出力します
脱獄環境(任意)
  • 脱獄ツール:unc0ver / checkra1n / palera1n(デバイスのモデルと iOS バージョンに応じて選択)。脱獄後、OpenSSH + パッケージマネージャー(Sileo / Cydia)をインストールします
  • 確認:ssh root@<デバイスIP> でログインできること
  • 脱獄していない実機が必要な場合:Apple 開発者アカウントで署名してインストールします(無料アカウントの署名は 7 日間有効です。「落とし穴 2」を参照)。脱獄環境に特化した内容(tweak 開発/脱獄検出)は [[re-ios-jb]] を参照してください
iOS FairPlay の復号/脱殻(backend は環境に応じて選択)

App Store の暗号化アプリを復号するバックエンドは、対象の iOS と脱獄バージョンに応じて、現在の Frida API に対応したメンテナンス中の実装を選択してください。すべてのバージョンに共通する単一のツールはありません。

  • 前提条件:脱獄デバイス + frida-server([[re-frida]] のツールの準備を参照)+ usbmuxd による転送
  • 選定:まず frida --version を実行し、デバイスの frida-server のバージョンと一致させてから、その Frida 世代に対応した dumper を選択します。Frida 17 では静的な Module の検索/列挙 API が削除されているため([[re-frida]] のよくある落とし穴を参照)、これらの旧 API に依存する dumper は Frida 17 で直接エラーになります
  • legacy/参考実装:AloneMonkey/frida-ios-dump の Frida agent は Module.ensureInitialized、静的な Memory.read*、Module.findExportByName(null, …)、Process.enumerateModulesSync を使用します。これらの API は Frida 17 で削除されているため、このリポジトリは脱殻アルゴリズムと Mach-O 再構成ロジックの参考として利用するのが適切です。直接使用するには Frida 16 以下の frida-server を組み合わせるか、新しい API に合わせて自分で移植してください
  • 別の方法:mremap_encrypted をベースにした実装(UnFairPlay / unfaird など)です。frida のランタイムインスツルメンテーションに依存せず、対象の iOS バージョンでの利用可否を評価します
  • デバイス接続:macOS では brew install libusbmuxd(旧 usbmuxd フォーミュラは名称が変更されています)。Linux では apt install usbmuxd(Debian/Ubuntu、iproxy を含む)。Arch では pacman -S libusbmuxd
  • 確認:iproxy -h(転送ツールが利用できること)。選定した dumper については、ツール自身の -h 出力で引数を確認します

操作手順

順番に実行し、各手順の結果を記録してください(証拠のパス + sha256、[[re-triage]] を参照)。

  1. ipa の展開と署名の確認:

    unzip app.ipa -d app/
    file app/Payload/*.app/*                   # 确认主二进制是 arm64 Mach-O
    codesign -dv app/Payload/*.app/ 2>&1       # 签名类型(Apple Distribution / Development / adhoc)
    otool -l app/Payload/*.app/ | grep -B1 -A4 LC_ENCRYPTION_INFO   # 查 cryptid
    

    cryptid 1 = App Store の暗号化を意味します。ディスク上のコードは暗号文のため、先に脱殻(手順 5)してから続行します。

    • パッケージ構造の概要:Payload/<App>.app/ はメインバイナリとリソース、SwiftSupport/ はシステム Swift ライブラリ(シミュレーター用パッケージでよく見られます)、embedded.mobileprovision は署名プロファイル(macOS 上では security cms -D -i で entitlement と有効期限を確認できます)
    • file でメインバイナリが arm64/arm64e の実機アーキテクチャであることを確認します。x86_64 のシミュレーター成果物は動的分析に役立たないため、そのままスキップします
  2. class-dump のヘッダーファイル:

    class-dump -H app/Payload/*.app/ -o headers/
    

    クラス名/メソッド名/プロパティは、ほとんどのビジネスインターフェースに相当します。まずヘッダーを確認してから逆コンパイルに進みます。暗号化バイナリは先に脱殻(手順 5)してください。そうしないと、シェルのクラスしか取得できません。Swift のメソッドは OC ヘッダーファイルには含まれません(「落とし穴 4」を参照)。

  3. バイナリは [[re-format-macho]] を使用:

    otool -h app/Payload/*.app/                # 架构 / cputype
    otool -L app/Payload/*.app/                # 依赖 dylib(framework 清单)
    

    構造、load commands、エントリーポイント、セグメント、署名については [[re-format-macho]] の手順に従います。Swift バイナリでは strings -n 6 でシンボルやエラーメッセージを探し、位置の特定に役立てます。

  4. 脱獄環境での動的デバッグ:

    iproxy 2222 22 &                           # usbmuxd 转发设备 ssh 到本机 2222
    ssh -p 2222 [email protected]                 # 登录越狱设备
    

    デバイス上で対象アプリを起動します。ブレークポイント/ステップ実行には debugserver + lldb を使用します([[re-lldb]] を参照)。hook/バイパスには [[re-frida]] を優先します(frida-server のインストールについては同スキルを参照)。

  5. 脱殻(FairPlay の復号):

    frida --version                            # 主机 Frida 世代——选 dumper 前先定
    iproxy 2222 22 &
    <选定 dumper> <BundleID 或 App 名>          # 按目标 iOS / Frida 版本选维护实现,拉取并解密
    file <输出>.ipa
    otool -l <输出>/Payload/*.app/ | grep -A4 LC_ENCRYPTION_INFO # 确认 cryptid 0
    

    方法:復号済みのメモリイメージから Mach-O ヘッダーとセグメントを読み取り、復号済み ipa に再構成します。dumper はホストの frida --version とデバイスの frida-server の世代に一致させる必要があります(ツールの準備を参照)。脱殻した成果物を使って手順 1〜3 を再度実行します。

分野横断の連携

  • [[re-mobile]]:ワークフローの手順 2(iOS 分岐)では、このスキルを必ず呼び出します
  • バイナリ解析 → [[re-format-macho]]。ブレークポイントデバッグ → [[re-lldb]]。インスツルメンテーション/バイパス/脱殻の実行 → [[re-frida]]
  • [[re-analyze]] の triage「モバイルアプリ分析」経路からこのスキルが呼び出されます(re-mobile → re-ios)
  • デスクトップ macOS エコシステム(署名/entitlements/Secure Enclave)→ [[re-macos]]
  • Swift 層の分析(mangling/witness table)→ [[re-swift]]
  • 脱獄環境に特化した内容(tweak の分析と開発、脱獄検出の識別とバイパス)→ [[re-ios-jb]]

常见坑与陷阱

  • App Store 加密二进制直接分析:现象——class-dump 无输出 / otool 结构残缺、反编译只见壳;原因——cryptid 1 加密,磁盘上的代码是密文;对策——步骤 1 先查 LC_ENCRYPTION_INFO,加密先按步骤 5 脱壳
  • 签名失效无法安装:现象——重打包 / 修改后真机安装报"无法验证 App"或无法安装;原因——签名与内容不一致,或免费证书 7 天过期;对策——codesign -f -s - adhoc 重签(仅自签场景)或重新用开发者证书签名;免费账号到期重新安装
  • 无越狱 → 动态分析受限:现象——没有越狱设备,脱壳 / lldb attach / frida 全不可用;原因——iOS 沙盒与签名强制限制动态调试;对策——静态分析先行(步骤 1-3),动态转模拟器(需不加密应用)或受管设备(Apple Configurator 部署 + 开发证书),实在不行只做静态
  • Swift 方法不进 class-dump 头:现象——类头文件里找不到业务方法;原因——Swift 不导出 OC 运行时元数据;对策——strings / swift-demangle 找符号,逻辑分析靠 [[re-format-macho]] + 反编译([[re-binary-core]])
  • class-dump 对 arm64e 二进制报错:现象——class-dump 崩溃或输出为空;原因——arm64e 指针签名(PAC)干扰元数据遍历;对策——换新版 class-dump / class-dump-swift,或先脱壳再 dump
  • 拿到模拟器产物当真机分析:现象——file 显示主二进制是 x86_64,动态分析全不可用;原因——分发方给了模拟器包(常带 SwiftSupport/);对策——步骤 1 用 file 确认 arm64/arm64e 真机架构,模拟器产物跳过
  • class-dump 装不上(brew 公式下架):现象——brew install class-dump 报 No available formula;原因——homebrew-core 已移除该公式(2026 实测);对策——nygard/class-dump 源码构建,或换 class-dump-swift(见工具准备)

コメント