IDAPython API 是如何构建的?

逆向工程 艾达 蟒蛇 idapro-sdk
2021-06-10 21:04:28

在 IDA 的文档中,有对名为ida_*idcidaapi和 的模块的引用idautils前面的模块似乎是较低级别的模块。几乎总是这样说IDA Plugin SDK API wrapper: <some_module>

我有一些关于文档和 IDAPython 的具体问题:

  1. 这个 IDA 插件 SDK 是什么?IDC 中是否有类似 C 的 API?
  2. 较高级别的 API 是否允许访问所有较低级别的功能?
  3. 我似乎无法加载较低级别的模块?(当我尝试时import ida_lines,IDA 说ImportError: No module named ida_lines
1个回答

一点历史:(又名一个年迈的家伙喋喋不休)

在过去,我们在 IDA 中没有 Python,当一个人想要开发一个 IDA 插件时,他必须用 C 语言实现它,并使用您购买 IDA 许可证时收到的凭据使用hex-ray下载中心提供的 SDK . 然而,我们确实有 IDC。IDC 是 IDA 的旧的、专有的和有点过时的脚本语言,这与 C 无关,但是使用类似 C 的语法有明显的努力。它在过去很常用,但 IDAPython 几乎完全取代了它。现在看到 IDC 的唯一原因是旧代码,它位于 IDAPython 之前。

从那时起,开发了 IDAPython(最初作为使用上述 SDK 的插件,然后被 hex-rays 采用并成为 IDA 的一部分)。直到最近的 IDA 6.95,我们只有一个模块在 python 中公开所有 IDA 的 C SDK。该模块是idaapi. idc正在实施从 IDC 迁移到 IDAPython 的更高级别的功能。idautils实现了一些以前没有的更高级的功能。这些是粗略的划分,并不完全准确。这里的重点是有一个(长)python 文件公开所有 SDK 函数(使用SWIG公开给 python )。

在 IDA 6.95 中,我们仍然拥有它,但它也是第一个包含多个ida_*模块的版本,用于替换广泛的idaapi. idaapi仅包含在 6.95 中以实现向后兼容性,并且预计会在 IDA 7 中删除。通常,模块的名称(ida_前缀后面的内容)是定义这些函数的头文件的名称。例如,ida_lines将公开lines.h.

实际答案

  1. IDA 插件 SDK 是 C 头文件和二进制库的集合,允许第三方使用提供的 API 开发 IDA 插件。它可以从下载中心下载,它的文档可以在这里找到
  2. 虽然 C SDK 有很好的文档记录,但 IDAPython 没有那么多。我经常发现在开发 IDAPython 插件时浏览 SDK 很有用,因为函数通常暴露给 python 但没有像 SDK 中那样被记录或描述。基本上大多数函数都是对应的,您会在 IDAPython 和 SDK 中找到具有相同名称的相同函数(因为这主要是由/为SWIG自动生成的代码)。
  3. 第一个猜测是您使用的是旧版本的 IDA,其中ida_*模块尚不存在。通常,使用idaapi而不是所有其他模块就可以了。

为 IDA 开发:

有兴趣为 IDA 开发的人有三种选择:

  • 使用 IDA SDK 编写 C 代码并编译它,将 aplwp64二进制文件作为输出。
  • 编写IDC代码。这是一种体面的脚本语言,在语法上类似于简化的 C。输出将是一个文本文件。在 IDAPython 流行并且所有权转移到 hexrays 之前,这是 IDA 选择的脚本语言。
  • 编写 IDAPython 代码。这主要是使用从 IDA 中运行时可用的附加模块的 Python,以及注册为插件所需的简单 IDA 插件接口。