mcpField
I
idapython

idapython

github.com/mrexodiaSecurity13.2k240 installsUpdated 5w ago
Repository

About idapython

idapython is a Skill for scripting IDA reverse-engineering tasks with modern `ida_*` modules. It collects API patterns for database analysis, decompilation, types, names, instructions, and cross-references.

Key features

  1. 01Route tasks to relevant `ida_*` modules
  2. 02Iterate over functions and instructions
  3. 03Read and patch bytes
  4. 04Manage names, types, and structures
  5. 05Decompile functions and walk ctree
  6. 06Inspect cross-references and strings

Use cases

  1. 01Write scripts to analyze an IDA database
  2. 02Enumerate functions, instructions, and cross-references
  3. 03Decompile functions and inspect variables or calls
  4. 04Apply types to addresses or patch bytes

MCP support

The README mentions using an `int_convert` MCP tool for number-base conversion, but does not explain MCP server connections or management.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/mrexodia/ida-pro-mcp --skill idapython

After installing, type/idapythonin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

docs/
ida_auto.md
ida_auto.rst
ida_bitrange.md
ida_bitrange.rst
ida_bytes.md
ida_bytes.rst
ida_dbg.md
ida_dbg.rst
ida_dirtree.md
ida_dirtree.rst
ida_diskio.md
ida_diskio.rst
ida_entry.md
ida_entry.rst
ida_expr.md
ida_expr.rst
ida_fixup.md
ida_fixup.rst
ida_fpro.md
ida_fpro.rst
ida_frame.md
ida_frame.rst
ida_funcs.md
ida_funcs.rst
ida_gdl.md
ida_gdl.rst
ida_graph.md
ida_graph.rst
ida_hexrays.md
ida_hexrays.rst

Details

From the project README

IDAPython

Use modern ida_* modules. Avoid legacy idc module.

Module Router

TaskModuleKey Items
Bytes/memoryida_bytesget_bytes, patch_bytes, get_flags, create_*
Functionsida_funcsfunc_t, get_func, add_func, get_func_name
Namesida_nameset_name, get_name, demangle_name
Typesida_typeinftinfo_t, apply_tinfo, parse_decl
Decompilerida_hexraysdecompile, cfunc_t, lvar_t, ctree visitor
Segmentsida_segmentsegment_t, getseg, add_segm
Xrefsida_xrefxrefblk_t, add_cref, add_dref
Instructionsida_uainsn_t, op_t, decode_insn
Stack framesida_frameget_frame, define_stkvar
IterationidautilsFunctions(), Heads(), XrefsTo(), Strings()
UI/dialogsida_kernwinmsg, ask_*, jumpto, Choose
Database infoida_idainf_get_*, inf_is_64bit()
Analysisida_autoauto_wait, plan_and_wait
Flow graphsida_gdlFlowChart, BasicBlock
Register trackingida_regfinderfind_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

ConstantValue/Use
BADADDRInvalid address sentinel
ida_name.SN_NOCHECKSkip name validation
ida_typeinf.TINFO_DEFINITEForce type application
o_reg, o_mem, o_imm, o_displ, o_nearOperand types
dt_byte, dt_word, dt_dword, dt_qwordData types
fl_CF, fl_CN, fl_JF, fl_JN, fl_FCode xref types
dr_R, dr_W, dr_OData 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

AvoidDo Instead
idc.* functionsUse ida_* modules
Hardcoded addressesUse names, patterns, or xrefs
Manual hex conversionUse int_convert tool
Blocking main threadUse execute_sync() for long ops
Guessing at typesDerive 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.

Comments

Markdown supported