mcpField
I
idapython

idapython

github.com/mrexodia安全13.2k240 次安装5 周前更新
代码仓库

关于 idapython

idapython 是面向 IDA 逆向工程工作的 Skill,指导使用现代 ida_* 模块编写脚本。它汇总了反汇编数据库分析、反编译、类型处理和交叉引用等常用 API 模式。

主要功能

  1. 01按任务选择 ida_* 模块
  2. 02遍历函数与指令
  3. 03读取和修补字节
  4. 04处理名称、类型与结构
  5. 05反编译并遍历 ctree
  6. 06查询交叉引用和字符串

适用场景

  1. 01编写 IDA 数据库分析脚本
  2. 02遍历函数、指令和交叉引用
  3. 03反编译函数并检查局部变量或调用
  4. 04为地址应用类型或修补字节

MCP 相关

README 提及需使用 int_convert MCP 工具进行进制转换,但未说明如何连接或管理 MCP 服务。

安装

复制下面的命令,在终端中运行。

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

安装后在 Claude Code 中输入/idapython确认已加载。

包含的文件

除 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

详细介绍

IDAPython

使用现代的 ida_* 模块。避免使用旧版 idc 模块。

模块路由

任务模块关键项
字节/内存ida_bytesget_bytes、patch_bytes、get_flags、create_*
函数ida_funcsfunc_t、get_func、add_func、get_func_name
名称ida_nameset_name、get_name、demangle_name
类型ida_typeinftinfo_t、apply_tinfo、parse_decl
反编译器ida_hexraysdecompile、cfunc_t、lvar_t、ctree 访问器
段ida_segmentsegment_t、getseg、add_segm
交叉引用ida_xrefxrefblk_t、add_cref、add_dref
指令ida_uainsn_t、op_t、decode_insn
栈帧ida_frameget_frame、define_stkvar
迭代idautilsFunctions()、Heads()、XrefsTo()、Strings()
UI/对话框ida_kernwinmsg、ask_*、jumpto、Choose
数据库信息ida_idainf_get_*、inf_is_64bit()
分析ida_autoauto_wait、plan_and_wait
流程图ida_gdlFlowChart、BasicBlock
寄存器跟踪ida_regfinderfind_reg_value、reg_value_info_t

核心模式

遍历函数
for ea in idautils.Functions():
    name = ida_funcs.get_func_name(ea)
    func = ida_funcs.get_func(ea)
遍历函数中的指令
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}")
交叉引用
for xref in idautils.XrefsTo(ea):
    print(f"{xref.frm:#x} -> {xref.to:#x} type={xref.type}")
读取/写入字节
data = ida_bytes.get_bytes(ea, size)
ida_bytes.patch_bytes(ea, b"\x90\x90")
名称
name = ida_name.get_name(ea)
ida_name.set_name(ea, "new_name", ida_name.SN_NOCHECK)
反编译函数
cfunc = ida_hexrays.decompile(ea)
if cfunc:
    print(cfunc)  # pseudocode
    for lvar in cfunc.lvars:
        print(f"{lvar.name}: {lvar.type()}")
遍历 ctree(反编译后的 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)
应用类型
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)
创建结构体
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")
字符串列表
for s in idautils.Strings():
    print(f"{s.ea:#x}: {str(s)}")
等待分析完成
ida_auto.auto_wait()  # Block until autoanalysis completes

关键常量

常量值/用途
BADADDR无效地址标记值
ida_name.SN_NOCHECK跳过名称验证
ida_typeinf.TINFO_DEFINITE强制应用类型
o_reg、o_mem、o_imm、o_displ、o_near操作数类型
dt_byte、dt_word、dt_dword、dt_qword数据类型
fl_CF、fl_CN、fl_JF、fl_JN、fl_F代码交叉引用类型
dr_R、dr_W、dr_O数据交叉引用类型

关键规则

  1. 绝不要手动转换十六进制/十进制——使用 int_convert MCP 工具
  2. 等待分析完成:读取结果前调用 ida_auto.auto_wait()
  3. 线程安全:IDA SDK 调用必须在主线程上运行(使用 @idasync)
  4. 64 位地址:始终假定 ea_t 可能是 64 位

反模式

避免改用
idc.* 函数使用 ida_* 模块
硬编码地址使用名称、模式或交叉引用
手动转换十六进制使用 int_convert 工具
阻塞主线程对耗时操作使用 execute_sync()
猜测类型根据反汇编/反编译结果推导

详细 API 参考

如需了解任何模块的完整文档,请阅读 docs/<module>.md:

  • 高频使用:ida_bytes、ida_funcs、ida_hexrays、ida_typeinf、ida_name、idautils
  • 中频使用:ida_segment、ida_xref、ida_ua、ida_frame、ida_kernwin
  • 专用模块:ida_dbg(调试器)、ida_nalt(netnode 存储)、ida_regfinder(寄存器跟踪)

可在 docs/<module>.rst 获取 hex-rays.com 上的完整 RST 源文件。

评论

支持 Markdown