IDA 插件编写通用问题

逆向工程 艾达 idapro插件
2021-06-20 08:52:19

我正在尝试为 IDA PRO 编写一个插件,主要是因为我想在自定义中间语言上使用漂亮的图形功能。第一次看IDA插件系统,有点迷茫。

在我深入挖掘之前,我有一些通用的理解问题,这让我感到不安:

  1. SDK 是否强制执行结构对齐?如果没有,我如何接收或提供指向跨编译器兼容的结构的指针?

  2. 为什么插件导出数据strcut(PLUGIN),而不是标准导出函数?有什么好处?同样,我会担心编译器之间的对齐问题。

  3. 更令人惊讶的是,至少 sdk 的 HexRays 部分似乎提供了类 ABI 兼容性,这意味着我可以从提供的类定义中派生,并将结果与​​ SDK(虚拟函数和所有)一起使用!这是如何运作的?

  4. 此外,SDK 可以返回指向我应该使用“delete”关键字销毁的类的指针。那不是注定要陷入困境吗?

这一切让我有点紧张。有谁知道这是怎么做的?

1个回答

1. SDK 是否强制执行结构对齐?如果没有,我如何接收或提供指向跨编译器兼容的结构的指针?

IDA SDK 标头确实指定了它们的对齐方式。它分为 1 字节和 4 字节。

也有类似这样有趣的评论:

/*
 *      Due to the use of STL and virtual functions, some parts of this
 *      interface might be incompatible with compilers other than BCB v6.0 
 */

但是考虑到 Borland C++ Builder 6 的年龄,我不确定它们是否仍然相关。

2. 为什么插件导出的是数据结构(PLUGIN),而不是标准的导出函数?有什么好处?同样,我会担心编译器之间的对齐问题。

plugin_t使用 1 字节对齐。只要你遵循这一点,就不应该有任何对齐问题。我猜这个结构只是为了方便起见,因为这样加载器只需要查找和跟踪一个导出的符号而不是几个。

3. 更令人惊讶的是,至少 sdk 的 HexRays 部分似乎提供了类 ABI 兼容性,这意味着我可以从提供的类定义派生并将结果与​​ SDK(虚拟函数和所有)一起使用!这是如何运作的?

HexRays 允许您检查/修改反编译的源树表示,并使用访问者模式来执行此操作。

将一个指针传递给包含多个指针的类比为不同的操作传递大量单独的回调指针要容易得多。此外,一个类允许您捕获/跟踪本地状态,使用单独的回调指针执行此操作将需要使用函子进行额外的工作。

4. 此外,SDK 可以返回指向我应该使用“delete”关键字销毁的类的指针。那不是注定要陷入困境吗?

你担心什么?您正在释放由另一个模块分配的内存的事实,或者您负责对象的生命周期的事实?

前者应该不是问题,它pro.h包含一个DEFINE_MEMORY_ALLOCATION_FUNCS宏,宏可以覆盖每个此类的内存​​管理,因此删除它将通过 IDA 的内存管理例程。

后者只是你必须忍受的东西。