IDAPython 模块:更喜欢使用 idaapi 或 ida_*,并完全忽略 idc?

逆向工程 艾达 蟒蛇 idapro-sdk
2021-06-14 09:28:29

我最近开始编写一些 IDAPython 插件或脚本,而不是使用本机 SDK,但我想我并没有真正弄清楚建议导入哪些模块。通常,我的脚本导入看起来像这样:

import ida_funcs
import ida_kernwin
import ida_lines
import ida_nalt
import ida_name
import ida_segment
import ida_struct
import idaapi
import idautils
import idc
from ida_bytes import *
from PyQt5 import QtCore, QtGui, QtWidgets

我现在才意识到该idaapi模块导入了所有单个模块。例如,我可以将一个动作处理程序定义为

class MyHandler(ida_kernwin.action_handler_t):

但也作为

class MyHandler(idaapi.action_handler_t):

到目前为止,我一直试图找到成员源自的模块,并idaapi在可能的情况下替换为原始模块名称。但是后来我发现BADADDR起源于一个ida_idaapi模块,这个名字感觉很可笑,我想知道我是否一直在做正确的事情。它的来源文档非常空洞。

  • 是否建议使用idaapi而不是单个模块?为什么idaapi存在?

然后,另一方面,有idc,它似乎提供类似 IDC 的功能,即使使用 C 风格的名称外壳。如果我没记错的话,我读到该模块的用法已被弃用,仅用于快速移植 IDC 脚本;该文件显着地指出

This file is subject to change without any notice.
Future versions of IDA may use other definitions.
  • 我应该使用ida_*/idaapi方法,如果可能,idc完全忽略吗?
1个回答

简短的回答是,如果可能,应该避免使用idaapiidc模块。

idaapi模块用于向后兼容,应尽可能避免使用。它将在 IDA 的未来版本中删除(可能几乎没有提前警告)。您应该强烈喜欢带ida_前缀的模块。

在旧版本的 IDA 中,单个模块暴露了所有 IDA 功能(即idaapi),其中一些模块实现了实用程序功能(在idautils)和 IDC 转换以简化从 IDC 到 IDAPython 的迁移(在idc)。

在 IDA 6.95 中,IDA 的 python SDK 被分成多个模块并idaapi留下来避免破坏依赖于该idaapi模块的所有现有代码

由于该idc模块长期以来一直是 IDA 的一部分(自 IDAPython 启动以来),我认为它将在 IDA 中保留的时间超过idaapi,因此如果您必须选择是否使用idcor idaapi(并且不能使用特定ida_*模块,对于一些模糊的原因),我建议你喜欢idcidaapi

同样重要的是要注意它idaapi本身几乎没有内容,你会看到现在idaapi.py主要由将其他模块导入它的命名空间组成。这也是错误的,有几个原因(意外的命名空间遮蔽,加载不必要的代码导致加载时间更长),并且是命名空间拆分的部分原因。

ida_idaapi但是,模块是新界面的一部分,应在需要时使用。这是进行没有其他合理模块的一般定义的地方。

提示:当我想将idaapi用法转换ida_*用法时,我只需导入手头的对象并打印它的help,它将列出该对象实际定义的位置。

PS 虽然不是真正的重复,但这与IDAPython API的结构如何有关