mcpField
R
rev-unicorn-debug

rev-unicorn-debug

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

rev-unicorn-debug について

rev-unicorn-debugは、Unicornエンジンでコード断片や関数をエミュレートするスキルです。ネイティブバイナリの解析向けに、JNIやシステムコールなどの依存先をフックで再現し、障害を段階的に調べます。

主な機能

  1. 01対象ファイルを生バイトでマッピング
  2. 02フックで外部依存先を再現
  3. 03メモリアクセスとシステムコールを捕捉
  4. 04エミュレーション障害を反復して修正
  5. 05基本ブロック単位のトレースを優先

活用シーン

  1. 01バイナリ内の特定関数をエミュレート
  2. 02JNIやlibc呼び出しをスタブ化
  3. 03未マッピングメモリの障害を調査

インストール

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

$npx skills add https://github.com/p4nda0s/reverse-skills --skill rev-unicorn-debug

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

詳細

rev-unicorn-debug - Unicorn エミュレーションデバッガー

Unicorn エンジンを使用して、特定のコード断片や関数をデバッグおよびエミュレートします。コンテキスト依存関係(JNI、システムコール、ライブラリ関数)を分析し、フック機構を通じてシミュレートして、ユーザーのデバッグ目標を達成します。


基本原則

  1. まずファイルを生データとして読み込む — ELF/PE/Mach-O ヘッダーを解析しないでください。ファイルを生バイト列として読み込み、Unicorn メモリに直接マッピングします。エミュレートするのは特定の関数だけで、バイナリ全体ではありません。生データの読み込みに失敗した場合(コードが特定のアドレスにあるセグメントを参照している場合)は、最小限の解析を行い、必要なセグメントだけをマッピングしてください。
  2. コンテキスト依存関係を特定する — 対象コードの外部呼び出し(JNI、システムコール、libc、インポート)を分析し、シミュレートした応答を返すようフックします。
  3. コールバックを積極的に利用する — Unicorn のフックシステムを活用して、デバッグ、トレース、エラー復旧、環境シミュレーションを行います。
  4. 反復的に修正する — エミュレーションがクラッシュしたら、コールバック情報を使って原因を診断し、修正します(不足しているメモリのマッピング、未処理の呼び出しのフック、レジスタ状態の修正)。
  5. トレース出力は最小限にする — 命令単位のトレースより、ブロック単位のトレースを優先します。命令トレースは、対象を絞った小さな範囲でのみ有効にしてください。ステップごとのログではなく、カウンターとサマリーを使用します。

環境シミュレーション戦略

エミュレートする前に、対象関数を読み込み、呼び出している関数を特定します。外部依存関係をアドレスでフックし、Python でシミュレートします。

カテゴリー例シミュレーション戦略
libcmalloc、free、memcpy、strlen、printfアドレスをフックし、Python で処理を実装します(malloc にはバンプアロケーターを使用)
JNIGetStringUTFChars、FindClass、GetMethodIDUC メモリ内に偽の JNIEnv 関数テーブルを構築し、各エントリーに RET スタブを書き込み、スタブのアドレスをフックします
システムコールread、write、mmap、ioctlUC_HOOK_INTR をフックし、システムコール番号に応じてディスパッチします
C++ ランタイムoperator new、__cxa_throwフックしてシミュレートします
ライブラリ呼び出しpthread_mutex_lock、dlopenフックし、成功を返すかスタブを返します

フックのパターン: UC_HOOK_CODE コールバックを登録します。PC が既知のインポートアドレスに到達したら、Python でシミュレーションを実行し、PC = LR を設定して元の関数をスキップします。


使用するコールバックの種類

コールバック用途
UC_HOOK_CODEアドレスによるインポート呼び出しのインターセプト。命令単位のトレース(使用は控えめにし、範囲を狭く限定)
UC_HOOK_BLOCKブロック単位のトレース(命令トレースより推奨)
UC_HOOK_MEM_UNMAPPEDマッピングされていないアクセスエラーから復旧するため、不足しているページを自動マッピング
UC_HOOK_MEM_READ | UC_HOOK_MEM_WRITE対象データ範囲のメモリアクセスのみをトレース
UC_HOOK_INTRシステムコールシミュレーションのために SVC/INT をインターセプト

反復デバッグのワークフロー

エミュレーションに失敗した場合は、次の手順を繰り返します。

  1. 実行する — エミュレーションを開始し、クラッシュさせます
  2. コールバック出力を読む — どのアドレスで障害が発生しましたか?種類は何ですか(読み取り/書き込み/フェッチ)?
  3. 診断する:
    • マッピングされていないメモリのフェッチ → コードページが不足しているため、マッピングします
    • マッピングされていないメモリの読み取り/書き込み → データセクションが不足しているか、ポインターが初期化されていないため、マッピングするかフックします
    • インポートスタブに到達 → 関数を特定し、シミュレーション用フックを追加します
    • 無限ループ → 実行カウンター付きのコードフックを追加し、しきい値に達したら停止します
  4. 修正する — フックを追加する/メモリをマッピングする/レジスタを調整します
  5. 再実行する — 対象関数が完了するまで繰り返します

Architecture Quick Reference

ArchUc ConstModeSPLRArgsReturnSyscall
ARM64UC_ARCH_ARM64UC_MODE_LITTLE_ENDIANSPX30X0-X7X0X8 + SVC #0
ARM32UC_ARCH_ARMUC_MODE_THUMB / UC_MODE_ARMSPLRR0-R3R0R7 + SVC #0
x86-64UC_ARCH_X86UC_MODE_64RSP(stack)RDI,RSI,RDX,RCX,R8,R9RAXRAX + syscall
x86-32UC_ARCH_X86UC_MODE_32ESP(stack)(stack)EAXEAX + int 0x80
MIPS32UC_ARCH_MIPSUC_MODE_MIPS32 + UC_MODE_BIG_ENDIAN$sp$ra$a0-$a3$v0$v0 + syscall

コメント