mcpField
R
rev-symbol

rev-symbol

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

rev-symbol について

rev-symbolは、コードのパターン、定数、インポート、相互参照から関数名を推定するリバースエンジニアリング用スキルです。IDA Pro MCPまたはエクスポート済み解析データを利用します。

主な機能

  1. 01文字列と数値定数の確認
  2. 02呼び出し元・呼び出し先・インポートの分析
  3. 03コードや戻り値のパターンによる名前の推定
  4. 04候補名と確度、根拠の提示

活用シーン

  1. 01バイナリ内の名前のない関数を特定
  2. 02呼び出し状況から関数の役割を推定

MCP 対応

IDA Pro MCPが接続されている場合はIDAを直接照会し、そうでない場合はIDA-NO-MCPのエクスポートデータを使用します。

インストール

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

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

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

詳細

rev-symbol - シンボルの復元

関数コードの特徴を分析して、関数のシンボルと名前を復元・特定します。

事前確認

利用可能な IDA アクセス方法を確認してください:

オプション A — IDA Pro MCP(接続されている場合は推奨): IDA Pro MCP サーバーが接続されているか確認します(有効な ida-pro または同等の MCP 接続があるか確認してください)。接続されていれば、MCP ツール経由で IDA に直接問い合わせることができ、エクスポート済みファイルは不要です。MCP を使用して分析を進めてください。

オプション B — IDA-NO-MCP のエクスポートデータ: MCP が接続されていない場合は、現在のディレクトリに IDA-NO-MCP のエクスポートデータがあるか確認します。

  1. decompile/ ディレクトリがあるか確認します
  2. その中に .c ファイルがあるか確認します

MCP とエクスポートデータのどちらも利用できない場合は、ユーザーに次の内容を提示してください:

No IDA access method detected. Choose one of the following:

Option A — IDA Pro MCP (recommended):
  Connect the IDA Pro MCP server so Claude can query IDA directly.

Option B — IDA-NO-MCP export:
  1. Download plugin: https://github.com/P4nda0s/IDA-NO-MCP
  2. Copy INP.py to IDA plugins directory
  3. Press Ctrl-Shift-E in IDA to export
  4. Open the exported directory with Claude Code

エクスポートディレクトリの構造

./
├── decompile/              # Decompiled C code directory
│   ├── 0x401000.c          # One file per function, named by hex address
│   ├── 0x401234.c
│   └── ...
├── decompile_failed.txt    # Failed decompilation list
├── decompile_skipped.txt   # Skipped functions list
├── strings.txt             # String table (address, length, type, content)
├── imports.txt             # Import table (address:function_name)
├── exports.txt             # Export table (address:function_name)
└── memory/                 # Memory hexdump (1MB chunks)

関数ファイルの形式(decompile/*.c)

各 .c ファイルには、関数のメタデータコメントとデコンパイルされたコードが含まれています:

/*
 * func-name: sub_401000
 * func-address: 0x401000
 * callers: 0x402000, 0x403000    // List of functions that call this function
 * callees: 0x404000, 0x405000    // List of functions called by this function
 */

int __fastcall sub_401000(int a1, int a2)
{
    // Decompiled code...
}

シンボル復元の手順

ステップ 1:内部特性の分析

対象の関数を注意深く調べます。

  • 文字列定数:関数内で使用されている文字列から、関数の目的が分かる場合があります
  • 数値定数/マジックナンバー:
    • MD5:0x67452301、0xEFCDAB89、0x98BADCFE、0x10325476
    • CRC32:0xEDB88320
    • Base64 の文字セット:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
    • AES S-Box:0x63, 0x7C, 0x77, 0x7B...
    • Zlib:0x78、0x9C(圧縮ヘッダー)
    • その他の定数/マジックナンバーなど…
  • コード構造:ループパターン、ビット演算、特定のアルゴリズムの流れ

定数や構造から既知のアルゴリズムを特定できる場合は、ユーザーに直接伝えてください。

ステップ 2:クロスリファレンスの分析

呼び出し先を分析する:

  • 呼び出し先リストにある関数を読みます

  • 各呼び出し先について、そのアドレスが imports.txt に存在するか確認します

  • シンボルが欠落している場合でも、呼び出しパターンを特定します。

    関数のペアパターン(呼び出しのペアを照合して特定):

    // malloc/free, new/delete, alloc/dealloc
    xx = sub_A(0x100);        // alloc: takes size, returns pointer
    ...
    sub_B(xx);                // free: takes the same pointer
    
    // mutex_lock/mutex_unlock, pthread_mutex_lock/unlock
    sub_A(lock_ptr);          // lock
    ...                       // critical section
    sub_B(lock_ptr);          // unlock (same lock object)
    
    // open/close, fopen/fclose, CreateFile/CloseHandle
    fd = sub_A("/path", 0);   // open: path + flags, returns handle
    ...
    sub_B(fd);                // close: takes the handle
    
    // pthread_create/pthread_join
    sub_A(&tid, 0, func, arg); // create: out param, attr, func, arg
    ...
    sub_B(tid, &ret);          // join: tid, out param
    
    
    **Argument pattern recognition:**
    ```c
    // socket(AF_INET, SOCK_STREAM, 0) - fixed constants
    sub_XXX(2, 1, 0);         // socket: domain=2, type=1, protocol=0
    
    // connect/bind(sockfd, addr, addrlen)
    sub_XXX(fd, &var, 16);   // addr struct, len=16 for IPv4
    
    // memcpy/memmove(dst, src, size)
    sub_XXX(dst, src, n);     // 3 params: dst, src, count
    
    // memset(ptr, value, size)
    sub_XXX(ptr, 0, 0x100);   // 3 params: ptr, byte value, count
    
    // read/write(fd, buf, count)
    ret = sub_XXX(fd, buf, n); // returns bytes read/written
    
    // strcmp/strncmp(s1, s2) or (s1, s2, n)
    if (sub_XXX(s1, s2) == 0)  // returns 0 on equal
    

    戻り値のパターン:

    // file/socket operations: -1 on error
    if ((fd = sub_XXX(...)) == -1) goto error;
    
    // allocation: NULL on failure
    if (!(ptr = sub_XXX(size))) goto error;
    
    // success/error: 0 = success
    if (sub_XXX(...) != 0) goto error;
    
    // strlen: returns size_t
    len = sub_XXX(str);
    sub_YYY(dst, src, len);   // len used in memcpy
    

呼び出し元を分析する:

  • 呼び出し元リストにある関数を読みます
  • 呼び出し元にシンボルがある場合(exports.txt を確認)、そのコンテキストから呼び出し先の目的を推測します
  • 再帰的に確認します。シンボルがある関数を見つけるまで、呼び出しチェーンをさかのぼります
  • 戻り値が呼び出し元でどのように使用されているか分析します
ステップ 3:情報の収集と検索

次の情報を収集します。

  • 関数内の文字列(関数内で使用されているアドレスを strings.txt で確認します)
  • マジックナンバー/定数
  • 呼び出される既知のインポート(呼び出し先を imports.txt と照合します)
  • exports.txt にある呼び出し元/呼び出し先のシンボル
  • 特定された関数のペアパターン

収集した情報に基づいて、次の手順で進めます。

  1. まず、次の情報をもとにローカルで推論します。

    • 関数シグネチャ(パラメーターの数と型)
    • ペアの呼び出しパターン(割り当て/解放、ロック/アンロック)
    • 呼び出しチェーン内にある既知のインポート
    • 既知のアルゴリズムとのコード構造の類似性
  2. 判断が難しい場合は、Web 検索を使って次の項目を検索します。

    • マジックナンバーを検索する:0x67452301 0xEFCDAB89 algorithm
    • コードパターンを検索する:rotate left xor constant algorithm
    • 関数内で見つかった固有の文字列を検索する
    • パラメータパターンを検索する:function(int, int, 0) socket

出力形式

## Symbol Recovery Analysis: <function_address>

### Function Characteristics
- Strings: <list discovered strings>
- Constants: <list key constants>
- Called imports: <list>

### Cross-Reference Analysis
- Callers: <callers and their symbols>
- Callees: <callees and their symbols>

### Inference Result
- **Suggested symbol name**: <suggested_name>
- **Confidence**: High / Medium / Low
- **Reasoning**: <explain why this name is suggested>

### Similar Open Source Implementation
- <if similar open source code is found, provide link>

コメント