关于 idapython
idapython 是面向 IDA 逆向工程工作的 Skill,指导使用现代 ida_* 模块编写脚本。它汇总了反汇编数据库分析、反编译、类型处理和交叉引用等常用 API 模式。
主要功能
- 01按任务选择 ida_* 模块
- 02遍历函数与指令
- 03读取和修补字节
- 04处理名称、类型与结构
- 05反编译并遍历 ctree
- 06查询交叉引用和字符串
适用场景
- 01编写 IDA 数据库分析脚本
- 02遍历函数、指令和交叉引用
- 03反编译函数并检查局部变量或调用
- 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.mdida_auto.rstida_bitrange.mdida_bitrange.rstida_bytes.mdida_bytes.rstida_dbg.mdida_dbg.rstida_dirtree.mdida_dirtree.rstida_diskio.mdida_diskio.rstida_entry.mdida_entry.rstida_expr.mdida_expr.rstida_fixup.mdida_fixup.rstida_fpro.mdida_fpro.rstida_frame.mdida_frame.rstida_funcs.mdida_funcs.rstida_gdl.mdida_gdl.rstida_graph.mdida_graph.rstida_hexrays.mdida_hexrays.rst详细介绍
IDAPython
使用现代的 ida_* 模块。避免使用旧版 idc 模块。
模块路由
| 任务 | 模块 | 关键项 |
|---|---|---|
| 字节/内存 | ida_bytes | get_bytes、patch_bytes、get_flags、create_* |
| 函数 | ida_funcs | func_t、get_func、add_func、get_func_name |
| 名称 | ida_name | set_name、get_name、demangle_name |
| 类型 | ida_typeinf | tinfo_t、apply_tinfo、parse_decl |
| 反编译器 | ida_hexrays | decompile、cfunc_t、lvar_t、ctree 访问器 |
| 段 | ida_segment | segment_t、getseg、add_segm |
| 交叉引用 | ida_xref | xrefblk_t、add_cref、add_dref |
| 指令 | ida_ua | insn_t、op_t、decode_insn |
| 栈帧 | ida_frame | get_frame、define_stkvar |
| 迭代 | idautils | Functions()、Heads()、XrefsTo()、Strings() |
| UI/对话框 | ida_kernwin | msg、ask_*、jumpto、Choose |
| 数据库信息 | ida_ida | inf_get_*、inf_is_64bit() |
| 分析 | ida_auto | auto_wait、plan_and_wait |
| 流程图 | ida_gdl | FlowChart、BasicBlock |
| 寄存器跟踪 | ida_regfinder | find_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 | 数据交叉引用类型 |
关键规则
- 绝不要手动转换十六进制/十进制——使用
int_convertMCP 工具 - 等待分析完成:读取结果前调用
ida_auto.auto_wait() - 线程安全:IDA SDK 调用必须在主线程上运行(使用
@idasync) - 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