rev-symbol - Symbol Recovery
Analyze function code characteristics to recover/identify function symbols and names.
Pre-check
Determine which IDA access method is available:
Option A — IDA Pro MCP (preferred if connected):
Check if the IDA Pro MCP server is connected (look for an active ida-pro or equivalent MCP connection). If connected, you can query IDA directly via MCP tools — no exported files needed. Proceed with the analysis using MCP.
Option B — IDA-NO-MCP exported data:
If MCP is not connected, check if IDA-NO-MCP exported data exists in the current directory:
- Check if
decompile/ directory exists
- Check if there are
.c files inside
If neither MCP nor exported data is available, prompt the user:
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
Export Directory Structure
./
├── 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)
Function File Format (decompile/*.c)
Each .c file contains function metadata comments and decompiled code:
/*
* 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...
}
Symbol Recovery Steps
Step 1: Analyze Internal Characteristics
Carefully examine the target function for:
- String constants: Strings used in the function may reveal its purpose
- Numeric constants / Magic Numbers:
- MD5:
0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476
- CRC32:
0xEDB88320
- Base64 charset:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
- AES S-Box:
0x63, 0x7C, 0x77, 0x7B...
- Zlib:
0x78, 0x9C (compression header)
- other constants/magic numbers...
- Code structure: Loop patterns, bitwise operations, specific algorithm flows
If you can identify a known algorithm through constants/structure, tell the user directly.
Step 2: Analyze Cross-References
Analyze Callees (called functions):
Read functions in the callees list
For each callee, check if its address exists in imports.txt
Recognize call patterns even when symbols are missing:
Paired function patterns (identify by matching call pairs):
// 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
Return value patterns:
// 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
Analyze Callers (calling functions):
- Read functions in the callers list
- If a caller has a symbol (check exports.txt), infer the callee's purpose from context
- Recursive check: trace up the call chain until you find a function with a symbol
- Analyze how the return value is used by callers
Step 3: Information Gathering and Search
Collect the following information:
- Strings in the function (check
strings.txt for addresses used in the function)
- Magic Numbers / constants
- Known imports called (cross-reference callees with
imports.txt)
- Caller/callee symbols from
exports.txt
- Paired function patterns identified
Based on collected information:
First attempt local reasoning based on:
- Function signature (number and types of parameters)
- Paired call patterns (alloc/free, lock/unlock)
- Known imports in the call chain
- Code structure similarity to known algorithms
If uncertain, use Web Search to search:
- Search Magic Numbers:
0x67452301 0xEFCDAB89 algorithm
- Search code patterns:
rotate left xor constant algorithm
- Search unique strings found in the function
- Search parameter patterns:
function(int, int, 0) socket
Output Format
## 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>
1---2name: rev-symbol3description: Restore function symbols by analyzing code patterns, strings, constants, and cross-references4---5
6# rev-symbol - Symbol Recovery
7
8Analyze function code characteristics to recover/identify function symbols and names.
9
10## Pre-check
11
12**Determine which IDA access method is available:**
13
14**Option A — IDA Pro MCP (preferred if connected):**
15Check if the IDA Pro MCP server is connected (look for an active `ida-pro` or equivalent MCP connection). If connected, you can query IDA directly via MCP tools — no exported files needed. Proceed with the analysis using MCP.
16
17**Option B — IDA-NO-MCP exported data:**
18If MCP is not connected, check if IDA-NO-MCP exported data exists in the current directory:
19
201. Check if `decompile/` directory exists
212. Check if there are `.c` files inside
22
23If neither MCP nor exported data is available, prompt the user:
24```
25No IDA access method detected. Choose one of the following:
26
27Option A — IDA Pro MCP (recommended):
28 Connect the IDA Pro MCP server so Claude can query IDA directly.
29
30Option B — IDA-NO-MCP export:
31 1. Download plugin: https://github.com/P4nda0s/IDA-NO-MCP
32 2. Copy INP.py to IDA plugins directory
33 3. Press Ctrl-Shift-E in IDA to export
34 4. Open the exported directory with Claude Code
35```
36
37---
38
39## Export Directory Structure
40
41```
42./
43├── decompile/ # Decompiled C code directory
44│ ├── 0x401000.c # One file per function, named by hex address
45│ ├── 0x401234.c
46│ └── ...
47├── decompile_failed.txt # Failed decompilation list
48├── decompile_skipped.txt # Skipped functions list
49├── strings.txt # String table (address, length, type, content)
50├── imports.txt # Import table (address:function_name)
51├── exports.txt # Export table (address:function_name)
52└── memory/ # Memory hexdump (1MB chunks)
53```
54
55## Function File Format (decompile/*.c)
56
57Each `.c` file contains function metadata comments and decompiled code:
58
59```c
60/*
61 * func-name: sub_401000
62 * func-address: 0x401000
63 * callers: 0x402000, 0x403000 // List of functions that call this function
64 * callees: 0x404000, 0x405000 // List of functions called by this function
65 */
66
67int __fastcall sub_401000(int a1, int a2)
68{
69 // Decompiled code...
70}
71```
72
73---
74
75## Symbol Recovery Steps
76
77### Step 1: Analyze Internal Characteristics
78
79Carefully examine the target function for:
80
81- **String constants**: Strings used in the function may reveal its purpose
82- **Numeric constants / Magic Numbers**:
83 - MD5: `0x67452301`, `0xEFCDAB89`, `0x98BADCFE`, `0x10325476`
84 - CRC32: `0xEDB88320`
85 - Base64 charset: `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`
86 - AES S-Box: `0x63, 0x7C, 0x77, 0x7B...`
87 - Zlib: `0x78`, `0x9C` (compression header)
88 - other constants/magic numbers...
89- **Code structure**: Loop patterns, bitwise operations, specific algorithm flows
90
91If you can identify a known algorithm through constants/structure, tell the user directly.
92
93### Step 2: Analyze Cross-References
94
95**Analyze Callees (called functions):**
96- Read functions in the callees list
97- For each callee, check if its address exists in `imports.txt`
98- Recognize call patterns even when symbols are missing:
99
100 **Paired function patterns (identify by matching call pairs):**
101 ```c
102 // malloc/free, new/delete, alloc/dealloc
103 xx = sub_A(0x100); // alloc: takes size, returns pointer
104 ...
105 sub_B(xx); // free: takes the same pointer
106
107 // mutex_lock/mutex_unlock, pthread_mutex_lock/unlock
108 sub_A(lock_ptr); // lock
109 ... // critical section
110 sub_B(lock_ptr); // unlock (same lock object)
111
112 // open/close, fopen/fclose, CreateFile/CloseHandle
113 fd = sub_A("/path", 0); // open: path + flags, returns handle
114 ...
115 sub_B(fd); // close: takes the handle
116
117 // pthread_create/pthread_join
118 sub_A(&tid, 0, func, arg); // create: out param, attr, func, arg
119 ...
120 sub_B(tid, &ret); // join: tid, out param
121
122
123 **Argument pattern recognition:**
124 ```c
125 // socket(AF_INET, SOCK_STREAM, 0) - fixed constants
126 sub_XXX(2, 1, 0); // socket: domain=2, type=1, protocol=0
127
128 // connect/bind(sockfd, addr, addrlen)
129 sub_XXX(fd, &var, 16); // addr struct, len=16 for IPv4
130
131 // memcpy/memmove(dst, src, size)
132 sub_XXX(dst, src, n); // 3 params: dst, src, count
133
134 // memset(ptr, value, size)
135 sub_XXX(ptr, 0, 0x100); // 3 params: ptr, byte value, count
136
137 // read/write(fd, buf, count)
138 ret = sub_XXX(fd, buf, n); // returns bytes read/written
139
140 // strcmp/strncmp(s1, s2) or (s1, s2, n)
141 if (sub_XXX(s1, s2) == 0) // returns 0 on equal
142 ```
143
144 **Return value patterns:**
145 ```c
146 // file/socket operations: -1 on error
147 if ((fd = sub_XXX(...)) == -1) goto error;
148
149 // allocation: NULL on failure
150 if (!(ptr = sub_XXX(size))) goto error;
151
152 // success/error: 0 = success
153 if (sub_XXX(...) != 0) goto error;
154
155 // strlen: returns size_t
156 len = sub_XXX(str);
157 sub_YYY(dst, src, len); // len used in memcpy
158 ```
159
160**Analyze Callers (calling functions):**
161- Read functions in the callers list
162- If a caller has a symbol (check exports.txt), infer the callee's purpose from context
163- Recursive check: trace up the call chain until you find a function with a symbol
164- Analyze how the return value is used by callers
165
166### Step 3: Information Gathering and Search
167
168Collect the following information:
169- Strings in the function (check `strings.txt` for addresses used in the function)
170- Magic Numbers / constants
171- Known imports called (cross-reference callees with `imports.txt`)
172- Caller/callee symbols from `exports.txt`
173- Paired function patterns identified
174
175Based on collected information:
1761. First attempt local reasoning based on:
177 - Function signature (number and types of parameters)
178 - Paired call patterns (alloc/free, lock/unlock)
179 - Known imports in the call chain
180 - Code structure similarity to known algorithms
181
1822. If uncertain, use **Web Search** to search:
183 - Search Magic Numbers: `0x67452301 0xEFCDAB89 algorithm`
184 - Search code patterns: `rotate left xor constant algorithm`
185 - Search unique strings found in the function
186 - Search parameter patterns: `function(int, int, 0) socket`
187
188---
189
190## Output Format
191
192```
193## Symbol Recovery Analysis: <function_address>
194
195### Function Characteristics
196- Strings: <list discovered strings>
197- Constants: <list key constants>
198- Called imports: <list>
199
200### Cross-Reference Analysis
201- Callers: <callers and their symbols>
202- Callees: <callees and their symbols>
203
204### Inference Result
205- **Suggested symbol name**: <suggested_name>
206- **Confidence**: High / Medium / Low
207- **Reasoning**: <explain why this name is suggested>
208
209### Similar Open Source Implementation
210- <if similar open source code is found, provide link>
211```