【翻译】IDAPython 官方教程|(一)IDAPython 入门指南
本文翻译自Getting Started | Hex-Rays Docs,该文档更新速度较快,上次更新还是在3个月之前。最新版本建议去官网查看或者连接其 MCP 进行查阅。该网站需要科学上网才能正常访问,因此不便国内学者进行研究,所以直接在博客中进行翻译。
未选择翻译分类,是因为 ZEEKLOG 中的翻译的大分类要求比较复杂,而且推流方面也很大的问题,检索不到,并且 tag 也会变得很丑,并非缺失版权意识而蓄意为之,请见谅。
本文由 Gemini 3.0 翻译,对目录结构多有整理(我觉得比官方整理得好),仅供学习交流使用,如有侵权请私联删除。
文章目录
- IDAPython 入门指南
IDAPython 入门指南
启用方式:先装好 Python <= 3.11,运行 IDA 根目录下的idapyswitch.exe 即可。

1. 简介
IDAPython API 为您提供了一系列功能函数,用于与反汇编器进行交互、在输出结果中导航,以及操作各种元素(如函数、指令、数据和注释)。
本指南旨在加快您学习 IDAPython 的速度,并开启您的 IDA 脚本编写之旅。我们要假设您已经熟悉了 IDA 的操作界面,并掌握了 IDA 基础知识。
我们的 IDA SDK 是开源的,可以在 GitHub 上找到。

1.1 本指南的结构
首先,请查看 2. 基础知识,了解常用变量等核心概念;然后深入学习我们简单、简短且可重用的 3. 代码片段,其中展示了常用函数的基本示例。
1.2 在哪里可以找到完整的示例库?
当您对最常用的 IDAPython API 用法感到得心应手时,可以深入研究我们更复杂的 示例集。完整的示例库随您的 IDA 安装包一起提供,位于 python/examples 文件夹中。您也可以在 GitHub 仓库 中找到它们。
2. 基础知识
2.1 常用模块
IDAPython API 是按模块组织的,乍一看其数量可能有点让人眼花缭乱。以下是您应该首先关注的模块列表:
idautils:该模块提取了最有用和最方便的函数,允许您直接与反汇编结果进行交互,而无需从一开始就仔细研究整个 IDAPython API。您可以在这里找到遍历整个段(Segments)、函数(包括 IDA 发现的和用户定义的)、命名位置等的函数。ida_idaapi:当您想要创建自定义插件或处理事件时,ida_idaapi模块非常有用,因为它为您提供了访问更高级函数的权限,并允许与整个系统进行交互。idc:该模块提供了最初属于原生 IDA IDC 脚本语言的函数,并将其封装以供 IDAPython API 使用。如果您已经熟悉 IDC 脚本,这将是一个很好的起点。ida_funcs:该模块为您提供了在 IDA 中创建和操作函数的工具。ida_kernwin:该模块提供了与 IDA 用户界面(UI)交互的功能,因此您可以创建自定义对话框等。
2.2 常用变量和常量
当您开始使用 IDAPython 时,您会意识到最常传递的变量之一是 ea,它指的是有效的内存地址(Effective Address)。另一方面,BADADDR 是一个表示无效地址的常量。它用于指示操作(例如查询函数)已失败或返回了无效结果,或者表示特定的内存位置不可用。每当您使用返回内存地址的函数时,最佳实践是检查结果是否等于 BADADDR,以确保操作成功。
3. 代码片段
在这里,您可以查看按主题分组的最常用函数,以及可用作长脚本构建块的简短代码示例。它们通常专注于执行特定操作,并且可以轻松地在更复杂的脚本中重用(您稍后可以在示例部分找到这些脚本)。
3.1 导航反汇编——地址和名称
获取当前地址
ea = idc.here()# 获取当前地址print(f"Current address: {hex(ea)}")或者使用:
idc.get_screen_ea()设置当前地址(跳转)
idc.jumpto(0x401000)# 跳转到地址 0x401000获取 IDB 中的最小地址
idc.get_inf_attr(INF_MIN_EA)获取 IDB 中的最大地址
idc.get_inf_attr(INF_MAX_EA)列出所有指令地址
for ea in idautils.Heads():print(hex(ea))获取与给定地址关联的名称
ida_name.get_name(0x100000da0)获取与给定名称关联的地址
ida_name.get_name_ea(0,"_main")3.2 读取和写入数据
读取字节(Byte)和字(Word)
byte_value = idc.get_wide_byte(0x401000)# 读取地址 0x401000 处的一个字节 word_value = idc.get_wide_word(0x401002)# 读取地址 0x401002 处的一个字(2字节) dword_value = idc.get_wide_dword(0x401004)# 读取地址 0x401004 处的一个双字(4字节)print(f"Byte: {byte_value}, Word: {word_value}, Dword: {dword_value}")写入字节(Byte)和字(Word)
idc.patch_byte(0x401000,0x90)# 在地址 0x401000 处写入一个字节 (0x90) idc.patch_word(0x401002,0x9090)# 在地址 0x401002 处写入一个字 (0x9090) idc.patch_dword(0x401004,0x90909090)# 在地址 0x401004 处写入一个双字 (0x90909090)3.3 注释操作
添加常规注释(不可重复)或可重复注释
idc.set_cmt(0x401000,"This is a comment",0)# 在地址 0x401000 处添加常规注释 idc.set_cmt(0x401000,"This is a repeatable comment",1)# 在地址 0x401000 处添加可重复注释获取常规注释
comment = idc.get_cmt(0x401000,0)# 获取地址 0x401000 处的常规注释print(f"Comment: {comment}")3.4 段(Segments)操作
获取段名称
idc.get_segm_name(ea)获取第一个段的地址
get_first_seg()遍历所有段并返回段名称
for seg in idautils.Segments():print(idc.get_segm_name(seg))3.5 函数操作
创建和删除函数
idc.add_func(0x401000,0x401050)# 创建一个起始于 0x401000 并结束于 0x401050 的函数 idc.del_func(0x401000)# 删除位于 0x401000 的函数获取函数名称
get_func_name(ea)遍历所有函数并打印其有效地址和名称
for func_ea in idautils.Functions(): func_name = idc.get_func_name(func_ea)print(hex(func_ea), func_name)3.6 导航交叉引用 (Xrefs)
列出指向某地址的交叉引用(XrefsTo)
for xref in idautils.XrefsTo(0x401000):print(f"Xref to 0x401000 from {hex(xref.frm)}")列出从某地址发出的交叉引用(XrefsFrom)
for xref in idautils.XrefsFrom(0x401000):print(f"Xref from 0x401000 to {hex(xref.to)}")遍历指向特定地址的所有交叉引用,并打印引用来源地址
for ref in idautils.XrefsTo(ea):print(hex(ref.frm))3.7 用户界面 (UI) 操作
设置函数的背景颜色
set_color(0x401000, idc.CIC_FUNC,0x007fff)# 为起始地址 0x401000 的函数设置背景颜色显示自定义对话框
ida_kernwin.info("This is a custom message dialog. Good luck with learning IDAPython API!")4. 复杂脚本示例
如果您现在对 IDAPython 感觉更自如了,可以深入研究随 IDA 实例提供的更复杂、更高级的示例。您可以在安装 IDA 的 python/examples 文件夹中找到它们,或者查看我们的 文档。这些集合汇总了更高级的代码示例,通常会使用更多的模块和 API。
5. 下一步做什么?
深入学习我们的教程:如何在 IDAPython 中创建您的第一个自定义插件。
更多翻译,请自行搜索我的主页,可能会更新,可能不会更新,但这篇文档不会再更新。
本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.ZEEKLOG.net/article/details/156644216。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。