Loading...
Loading...
Write and execute Python scripts using the IDA Domain API for reverse engineering. Analyze binaries, extract functions, strings, cross-references, decompile code, work with IDA Pro databases (.i64/.idb). Use when user wants to analyze binaries, reverse engineer executables, or automate IDA Pro tasks.
npx skill4agent add hexrayssa/ida-claude-code-plugins ida-domain-scripting$SKILL_DIR<project>/.claude/skills/ida-domain-scripting~/.claude/skills/ida-domain-scripting/tmp/ida-domain-YYYYMMDD_HHMMSS_ffffff-<name>/tmp/ida-domain-20260109_143052_847291-list-functionsdatetime.now(). strftime ('%Y%m%d_%H%M%S_%f')cd $SKILL_DIR && uv run python run.py <work_dir>/script.py -f <binary>--save<work_dir>/script.pycd $SKILL_DIR && uv run python run.py <work_dir>/script.py -f <binary>cd $SKILL_DIR && uv run python setup.pyuv run python setup.py --ref v0.1.0 # Specific release
uv run python setup.py --ref main # Bleeding edge# <work_dir>/script.py
for func in db.functions:
name = db.functions.get_name(func)
print(f"{name}: 0x{func.start_ea:08X}")cd $SKILL_DIR && uv run python run.py <work_dir>/script.py -f /path/to/binaryDatabase.open()db# <work_dir>/script.py
for func in db.functions:
name = db.functions.get_name(func)
size = func.end_ea - func.start_ea
print(f"{name}: 0x{func.start_ea:08X} - 0x{func.end_ea:08X} ({size} bytes)")# <work_dir>/script.py
func = db.functions.get_function_by_name("main")
if func:
print(f"Found main at 0x{func.start_ea:08X}")
# Get callers
callers = db.functions.get_callers(func)
print(f"Called by {len(callers)} functions:")
for caller in callers:
print(f" - {db.functions.get_name(caller)}")
else:
print("main not found")# <work_dir>/script.py
import re
# Find all strings
for s in db.strings:
print(f"0x{s.address:08X}: {s}")
# Find URLs
url_pattern = re.compile(r"https?://[\w./]+", re.IGNORECASE)
for s in db.strings:
try:
content = str(s)
if url_pattern.search(content):
print(f"URL found: {content}")
except:
pass# <work_dir>/script.py
# Get xrefs TO an address
target = 0x00401000
print(f"References TO 0x{target:08X}:")
for xref in db.xrefs.to_ea(target):
print(f" From 0x{xref.from_ea:08X} (type: {xref.type.name})")
# Get xrefs FROM an address
print(f"References FROM 0x{target:08X}:")
for xref in db.xrefs.from_ea(target):
print(f" To 0x{xref.to_ea:08X} (type: {xref.type.name})")# <work_dir>/script.py
func = db.functions.get_function_by_name("main")
if func:
try:
lines = db.functions.get_pseudocode(func)
print("\n".join(lines))
except RuntimeError as e:
print(f"Decompilation failed: {e}")# <work_dir>/script.py
complex_funcs = []
for func in db.functions:
flowchart = db.functions.get_flowchart(func)
if flowchart:
block_count = len(flowchart)
edge_count = sum(b.count_successors() for b in flowchart)
cyclomatic = edge_count - block_count + 2
if cyclomatic > 10:
name = db.functions.get_name(func)
complex_funcs.append((name, func.start_ea, cyclomatic))
complex_funcs.sort(key=lambda x: x[2], reverse=True)
print("Most complex functions:")
for name, addr, cc in complex_funcs[:10]:
print(f" {name}: complexity={cc} at 0x{addr:08X}")# <work_dir>/script.py
# Search for NOP sled
pattern = b"\x90\x90\x90\x90"
results = db.bytes.find_binary_sequence(pattern)
for addr in results:
print(f"Found NOP sled at 0x{addr:08X}")
# Search for x64 function prologue
prologue = b"\x55\x48\x89\xE5" # push rbp; mov rbp, rsp
for addr in db.bytes.find_binary_sequence(prologue):
print(f"Prologue at 0x{addr:08X}")# <work_dir>/script.py
import json
from pathlib import Path
functions = []
for func in db.functions:
name = db.functions.get_name(func)
functions.append({
"name": name,
"start": f"0x{func.start_ea:08X}",
"end": f"0x{func.end_ea:08X}",
"size": func.end_ea - func.start_ea,
})
output = {"module": db.module, "functions": functions}
Path("/tmp/functions.json").write_text(json.dumps(output, indent=2))
print(f"Exported {len(functions)} functions to /tmp/functions.json")# Quick function count
cd $SKILL_DIR && uv run python run.py -c "print(f'Functions: {len(db.functions)}')" -f binary
# Get binary info
cd $SKILL_DIR && uv run python run.py -c "print(f'{db.module}: {db.architecture} {db.bitness}-bit')" -f binary--save--timeout 0--no-wrapDatabase.open()get_function_by_name()$SKILL_DIR/ida-domain/ida_domain/cd $SKILL_DIR && uv run python setup.pyexport IDADIR=/path/to/idacd $SKILL_DIR && uv run python run.py --timeout 3600 ... # 1 hour
cd $SKILL_DIR && uv run python run.py --timeout 0 ... # No timeoutdb.xrefs.to_ea(addr)db.xrefs.get_xrefs_to(addr)db.functions# Wrong: func.get_callers()
# Right: db.functions.get_callers(func)for s in db.strings:
try:
content = str(s)
except:
continue # Skip problematic stringsUser: "How many functions are in this binary?"
Claude: I'll count the functions. Let me analyze the binary...
[Writes: <work_dir>/script.py]
[Runs: cd $SKILL_DIR && uv run python run.py <work_dir>/script.py -f binary]
[Output: Functions: 250]
The binary contains 250 functions.User: "Find all functions that call malloc"
Claude: I'll find all callers of malloc...
[Writes: <work_dir>/script.py]
[Runs: cd $SKILL_DIR && uv run python run.py <work_dir>/script.py -f binary]
[Output: malloc called by 15 functions: sub_401000, sub_402000, ...]
Found 15 functions that call malloc:
- sub_401000 at 0x00401000
- sub_402000 at 0x00402000
...User: "Decompile the main function and save it"
Claude: I'll decompile main and save the output...
[Writes: <work_dir>/script.py]
[Runs: cd $SKILL_DIR && uv run python run.py <work_dir>/script.py -f binary]
[Output: Saved to /tmp/main.c]
Done! The decompiled code is saved to /tmp/main.c