IDAPython 是由 Gergely Erdelyi 开发的一种插件,它在 IDA 中集成了 Python 解释器。除提供Python 的功能外,使用这个插件还可以编写出能够实现IDC 脚本语言所有功能的 Python 脚本。IDAPython 的一个显著优势在于,它可以访问 Python 的数据处理功能以及所有 Python 模块。此外,IDAPython 还具有IDA SDK的大部分功能,与使用 IDC 相比,使用它可以编写出功能更加强大的脚本。在 IDA 社区中,IDAPython 拥有众多支持者。Ilfak 的博客中包括大量使用 Python脚本解决的有趣问题,同时相关问题、答案和许多其他有用的 IDAPython 脚本也经常发布在 OpenRCE.org 论坛中。此外,一些第三方工具(如Zynamics 的 BinNavi3 )也依靠 IDA 和IDAPython执行各种所需的子任务。

从IDA 5.4 以来,Hex-Rays 一直将IDAPython 作为IDA 的标准插件。该插件的源代码可从IDA-Python 的项目页面下载,而 API 文档则位于Hex-Rays 网站上。只有在运行 IDA 的计算机安装了Python 的情况下,IDA 才会启用该插件。Windows 版本的IDA 附带并安装有兼容版本的Python,而Linux和OS X版本的IDA 需要你自行安装 Python 。

不过,我们都是用的整合版,所以不用担心 python 的问题,倒是需要注意环境变量的配置。

模块介绍

IDAPython 通过 3 个Python 模块(每个模块服务于特定的用途)将 Python 代码注入到 IDA 中。

所有 IDAPython 脚本会自动导入 idc 和idautils 模块。另一方面,如果你需要 idaapi 模块,你必须自己导入该模块。如果脚本出现 NameError 错误,就可能是模块未导入导致的。

idc 模块基本上是 IDC API 的写照,因此,你会发现,IDA 内置帮助文档中的 IDC 函数列表将非常有用。

注意事项

在使用IDAPython 时,请记住该插件将一个 Python 解释器实例嵌入到IDA 中。在关闭 IDA之前,该解释器将正常运行。因此,你可以查看所有脚本和语句,就好像它们在 Python shell会话中运行一样。例如,在 IDA 会话中首次导入 idaapi 模块后,在重新启动 IDA 之前,你根本不需要再次导入该模块。同样,已初始化的变量和函数定义将保留它们的值,直到被重新定义,或直到你退出 IDA 。

基本概念

在 IDAPython 的相关文档中,通常使用 ea 来表示地址。

我们可以使用 idc.get_screen_ea()idc.here() 来获取光标所在的地址。

ea = idc.get_screen_ea()

如果我们想要获取 IDB 中储存的最小/最大地址,可以使用:

idc.get_inf_attr(idc.INF_MIN_EA)
Out[49]: 0x401000

idc.get_inf_attr(idc.INF_MAX_EA)
Out[50]: 0x405000

可以与 Segments 的范围对比一下。