idapython
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseIDAPython
IDAPython
Use modern modules. Avoid legacy module.
ida_*idc使用现代的模块,避免使用旧版的模块。
ida_*idcModule Router
模块路由表
| Task | Module | Key Items |
|---|---|---|
| Bytes/memory | | |
| Functions | | |
| Names | | |
| Types | | |
| Decompiler | | |
| Segments | | |
| Xrefs | | |
| Instructions | | |
| Stack frames | | |
| Iteration | | |
| UI/dialogs | | |
| Database info | | |
| Analysis | | |
| Flow graphs | | |
| Register tracking | | |
| 任务 | 模块 | 核心内容 |
|---|---|---|
| 字节/内存 | | |
| 函数 | | |
| 命名 | | |
| 类型 | | |
| 反编译 | | |
| 段 | | |
| 交叉引用 | | |
| 指令 | | |
| 栈帧 | | |
| 迭代 | | |
| UI/对话框 | | |
| 数据库信息 | | |
| 分析 | | |
| 流程图 | | |
| 寄存器追踪 | | |
Core Patterns
核心使用模式
Iterate functions
遍历函数
python
for ea in idautils.Functions():
name = ida_funcs.get_func_name(ea)
func = ida_funcs.get_func(ea)python
for ea in idautils.Functions():
name = ida_funcs.get_func_name(ea)
func = ida_funcs.get_func(ea)Iterate instructions in function
遍历函数中的指令
python
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}")python
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
交叉引用
python
for xref in idautils.XrefsTo(ea):
print(f"{xref.frm:#x} -> {xref.to:#x} type={xref.type}")python
for xref in idautils.XrefsTo(ea):
print(f"{xref.frm:#x} -> {xref.to:#x} type={xref.type}")Read/write bytes
读取/写入字节
python
data = ida_bytes.get_bytes(ea, size)
ida_bytes.patch_bytes(ea, b"\x90\x90")python
data = ida_bytes.get_bytes(ea, size)
ida_bytes.patch_bytes(ea, b"\x90\x90")Names
命名操作
python
name = ida_name.get_name(ea)
ida_name.set_name(ea, "new_name", ida_name.SN_NOCHECK)python
name = ida_name.get_name(ea)
ida_name.set_name(ea, "new_name", ida_name.SN_NOCHECK)Decompile function
反编译函数
python
cfunc = ida_hexrays.decompile(ea)
if cfunc:
print(cfunc) # pseudocode
for lvar in cfunc.lvars:
print(f"{lvar.name}: {lvar.type()}")python
cfunc = ida_hexrays.decompile(ea)
if cfunc:
print(cfunc) # 伪代码
for lvar in cfunc.lvars:
print(f"{lvar.name}: {lvar.type()}")Walk ctree (decompiled AST)
遍历反编译AST(ctree)
python
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)python
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
应用类型
python
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)python
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
创建结构体
python
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")python
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
字符串列表
python
for s in idautils.Strings():
print(f"{s.ea:#x}: {str(s)}")python
for s in idautils.Strings():
print(f"{s.ea:#x}: {str(s)}")Wait for analysis
等待分析完成
python
ida_auto.auto_wait() # Block until autoanalysis completespython
ida_auto.auto_wait() # 阻塞直到自动分析完成Key Constants
关键常量
| Constant | Value/Use |
|---|---|
| Invalid address sentinel |
| Skip name validation |
| Force type application |
| Operand types |
| Data types |
| Code xref types |
| Data xref types |
| 常量 | 值/用途 |
|---|---|
| 无效地址标记 |
| 跳过名称验证 |
| 强制应用类型 |
| 操作数类型 |
| 数据类型 |
| 代码交叉引用类型 |
| 数据交叉引用类型 |
Critical Rules
重要规则
- NEVER convert hex/decimal manually — use MCP tool
int_convert - Wait for analysis: Call before reading results
ida_auto.auto_wait() - Thread safety: IDA SDK calls must run on main thread (use )
@idasync - 64-bit addresses: Always assume can be 64-bit
ea_t
- 绝对不要手动转换十六进制/十进制 — 使用MCP工具
int_convert - 等待分析完成:读取结果前调用
ida_auto.auto_wait() - 线程安全:IDA SDK调用必须在主线程运行(使用)
@idasync - 64位地址:始终假设为64位
ea_t
Anti-Patterns
反模式
| Avoid | Do Instead |
|---|---|
| Use |
| Hardcoded addresses | Use names, patterns, or xrefs |
| Manual hex conversion | Use |
| Blocking main thread | Use |
| Guessing at types | Derive from disassembly/decompilation |
| 需避免的做法 | 推荐做法 |
|---|---|
| 使用 |
| 硬编码地址 | 使用名称、模式或交叉引用 |
| 手动十六进制转换 | 使用 |
| 阻塞主线程 | 长操作使用 |
| 猜测类型 | 从反汇编/反编译结果推导 |
Detailed API Reference
详细API参考
For comprehensive documentation on any module, read :
docs/<module>.md- High-use: ,
ida_bytes,ida_funcs,ida_hexrays,ida_typeinf,ida_nameidautils - Medium-use: ,
ida_segment,ida_xref,ida_ua,ida_frameida_kernwin - Specialized: (debugger),
ida_dbg(netnode storage),ida_nalt(register tracking)ida_regfinder
Full RST sources from hex-rays.com available at .
docs/<module>.rst如需任何模块的完整文档,请查看:
docs/<module>.md- 高频使用:,
ida_bytes,ida_funcs,ida_hexrays,ida_typeinf,ida_nameidautils - 中频使用:,
ida_segment,ida_xref,ida_ua,ida_frameida_kernwin - 特殊用途:(调试器)、
ida_dbg(网络节点存储)、ida_nalt(寄存器追踪)ida_regfinder
完整的RST源文件可从hex-rays.com获取,路径为。
docs/<module>.rst