rev-symbol について
rev-symbolは、コードのパターン、定数、インポート、相互参照から関数名を推定するリバースエンジニアリング用スキルです。IDA Pro MCPまたはエクスポート済み解析データを利用します。
主な機能
- 01文字列と数値定数の確認
- 02呼び出し元・呼び出し先・インポートの分析
- 03コードや戻り値のパターンによる名前の推定
- 04候補名と確度、根拠の提示
活用シーン
- 01バイナリ内の名前のない関数を特定
- 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 のエクスポートデータがあるか確認します。
decompile/ディレクトリがあるか確認します- その中に
.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(圧縮ヘッダー) - その他の定数/マジックナンバーなど…
- MD5:
- コード構造:ループパターン、ビット演算、特定のアルゴリズムの流れ
定数や構造から既知のアルゴリズムを特定できる場合は、ユーザーに直接伝えてください。
ステップ 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にある呼び出し元/呼び出し先のシンボル- 特定された関数のペアパターン
収集した情報に基づいて、次の手順で進めます。
-
まず、次の情報をもとにローカルで推論します。
- 関数シグネチャ(パラメーターの数と型)
- ペアの呼び出しパターン(割り当て/解放、ロック/アンロック)
- 呼び出しチェーン内にある既知のインポート
- 既知のアルゴリズムとのコード構造の類似性
-
判断が難しい場合は、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>