Skip to content
Security
Skill

/idapython

IDA Pro Python scripting for reverse engineering. Use when writing IDAPython scripts, analyzing binaries, working with IDA's API for disassembly, decompilation (Hex-Rays), type systems, cross-references, functions, segments, or any IDA database manipulation. Covers ida_* modules

From plugin
ida-pro-mcp
11k1 skill
Install
$ npx -y skills add mrexodia/ida-pro-mcp --skill idapython --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/idapython

Context preview

The summary Claude sees to decide when to auto-load this skill.

IDA Pro Python scripting for reverse engineering. Use when writing IDAPython scripts, analyzing binaries, working with IDA's API for disassembly, decompilation (Hex-Rays), type systems, cross-references, functions, segments, or any IDA database manipulation. Covers ida_* modules

SKILL.md

idapython.SKILL.md
name: idapython
description: IDA Pro Python scripting for reverse engineering. Use when writing IDAPython scripts, analyzing binaries, working with IDA's API for disassembly, decompilation (Hex-Rays), type systems, cross-references, functions, segments, or any IDA database manipulation. Covers ida_* modules (50+), idautils iterators, and common patterns.

IDAPython

Use modern `ida_*` modules. Avoid legacy `idc` module.

Module Router

| Task | Module | Key Items | |------|--------|-----------| | Bytes/memory | `ida_bytes` | `get_bytes`, `patch_bytes`, `get_flags`, `create_*` | | Functions | `ida_funcs` | `func_t`, `get_func`, `add_func`, `get_func_name` | | Names | `ida_name` | `set_name`, `get_name`, `demangle_name` | | Types | `ida_typeinf` | `tinfo_t`, `apply_tinfo`, `parse_decl` | | Decompiler | `ida_hexrays` | `decompile`, `cfunc_t`, `lvar_t`, ctree visitor | | Segments | `ida_segment` | `segment_t`, `getseg`, `add_segm` | | Xrefs | `ida_xref` | `xrefblk_t`, `add_cref`, `add_dref` | | Instructions | `ida_ua` | `insn_t`, `op_t`, `decode_insn` | | Stack frames | `ida_frame` | `get_frame`, `define_stkvar` | | Iteration | `idautils` | `Functions()`, `Heads()`, `XrefsTo()`, `Strings()` | | UI/dialogs | `ida_kernwin` | `msg`, `ask_*`, `jumpto`, `Choose` | | Database info | `ida_ida` | `inf_get_*`, `inf_is_64bit()` | | Analysis | `ida_auto` | `auto_wait`, `plan_and_wait` | | Flow graphs | `ida_gdl` | `FlowChart`, `BasicBlock` | | Register tracking | `ida_regfinder` | `find_reg_value`, `reg_value_info_t` |

Core Patterns

Iterate functions

for ea in idautils.Functions():
    name = ida_funcs.get_func_name(ea)
    func = ida_funcs.get_func(ea)

Iterate instructions in function

for head in idautils.FuncItems(func_ea):
    insn = ida_ua.insn_t()
    if ida_ua.decode_insn(insn, head):
        print(f"{head:#x}: {insn.itype}")

Cross-references

for xref in idautils.XrefsTo(ea):
    print(f"{xref.frm:#x} -> {xref.to:#x} type={xref.type}")

Read/write bytes

data = ida_bytes.get_bytes(ea, size)
ida_bytes.patch_bytes(ea, b"\x90\x90")

Names

name = ida_name.get_name(ea)
ida_name.set_name(ea, "new_name", ida_name.SN_NOCHECK)

Decompile function

cfunc = ida_hexrays.decompile(ea)
if cfunc:
    print(cfunc)  # pseudocode
    for lvar in cfunc.lvars:
        print(f"{lvar.name}: {lvar.type()}")

Walk ctree (decompiled AST)

class MyVisitor(ida_hexrays.ctree_visitor_t):
    def visit_expr(self, e):
        if e.op == ida_hexrays.cot_call:
            print(f"Call at {e.ea:#x}")
        return 0

cfunc = ida_hexrays.decompile(ea)
MyVisitor().apply_to(cfunc.body, None)

Apply type

tif = ida_typeinf.tinfo_t()
if ida_typeinf.parse_decl(tif, None, "int (*)(char *, int)", 0):
    ida_typeinf.apply_tinfo(ea, tif, ida_typeinf.TINFO_DEFINITE)

Create structure

udt = ida_typeinf.udt_type_data_t()
m = ida_typeinf.udm_t()
m.name = "field1"
m.type = ida_typeinf.tinfo_t(ida_typeinf.BTF_INT32)
m.offset = 0
m.size = 4
udt.push_back(m)
tif = ida_typeinf.tinfo_t()
tif.create_udt(udt, ida_typeinf.BTF_STRUCT)
tif.set_named_type(ida_typeinf.get_idati(), "MyStruct")

Strings list

for s in idautils.Strings():
    print(f"{s.ea:#x}: {str(s)}")

Wait for analysis

ida_auto.auto_wait()  # Block until autoanalysis completes

Key Constants

| Constant | Value/Use | |----------|-----------| | `BADADDR` | Invalid address sentinel | | `ida_name.SN_NOCHECK` | Skip name validation | | `ida_typeinf.TINFO_DEFINITE` | Force type application | | `o_reg`, `o_mem`, `o_imm`, `o_displ`, `o_near` | Operand types | | `dt_byte`, `dt_word`, `dt_dword`, `dt_qword` | Data types | | `fl_CF`, `fl_CN`, `fl_JF`, `fl_JN`, `fl_F` | Code xref types | | `dr_R`, `dr_W`, `dr_O` | Data xref types |

Critical Rules

1. **NEVER convert hex/decimal manually** — use `int_convert` MCP tool 2. **Wait for analysis**: Call `ida_auto.auto_wait()` before reading results 3. **Thread safety**: IDA SDK calls must run on main thread (use `@idasync`) 4. **64-bit addresses**: Always assume `ea_t` can be 64-bit

Anti-Patterns

| Avoid | Do Instead | |-------|------------| | `idc.*` functions | Use `ida_*` modules | | Hardcoded addresses | Use names, patterns, or xrefs | | Manual hex conversion | Use `int_convert` tool | | Blocking main thread | Use `execute_sync()` for long ops | | Guessing at types | Derive from disassembly/decompilation |

Detailed API Reference

For comprehensive documentation on any module, read `docs/<module>.md`:

  • **High-use**: `ida_bytes`, `ida_funcs`, `ida_hexrays`, `ida_typeinf`, `ida_name`, `idautils`
  • **Medium-use**: `ida_segment`, `ida_xref`, `ida_ua`, `ida_frame`, `ida_kernwin`
  • **Specialized**: `ida_dbg` (debugger), `ida_nalt` (netnode storage), `ida_regfinder` (register tracking)

Full RST sources from hex-rays.com available at `docs/<module>.rst`.

Read more
Ships withida-pro-mcp

Simple MCP Server to allow vibe reversing in IDA Pro. The binaries and prompt for the video are available in the mcp-reversing-dataset repository.

Get the whole plugin
Stats
11,213
Stars
1,336
Forks
Active
Maintenance
Python
Language
MIT
License
13h ago
Last commit
1y ago
Created

Repo: mrexodia/ida-pro-mcp