我试图编写IDA PRO插件,主要是因为我想在自定义中间语言上使用漂亮的图形功能。在看完IDA插件系统后,我有点迷失了。
SDK是否执行结构对齐?如果没有,我如何接收或提供指向跨编译器兼容的结构的指针?
为什么插件会导出数据strcut(PLUGIN),而不是标准导出函数?有什么好处?再次,我担心跨编译器的对齐问题。
更令人惊讶的是,至少sdk的HexRays部分似乎提供了类ABI兼容性,这意味着我可以从提供的类定义中派生并将结果与​​SDK结合使用(所有虚拟功能)!
此外,SDK可以使用“ delete”关键字返回指向我应该销毁的类的指针。难道注定要陷入困境吗?

所有这些让我有些紧张。有谁知道这是怎么做的?

评论

以防万一您没有看过本教程-binarypool.com/idapluginwriting

#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字节对齐。只要遵循该步骤,就不会出现任何对齐问题。我猜该结构只是为了方便起见,因为加载程序仅需要查找并跟踪一个导出的符号,而不是几个符号。 sdk的HexRays部分似乎提供了ABI类兼容性,这意味着我可以从提供的类定义中派生出来,并将结果与​​SDK(虚拟函数及所有)一起使用!


HexRays使您可以检查/修改反编译的源树表示形式,并使用访问者模式来进行操作。将一个指针传递给一个包含多个指针的类,而不是为不同的操作传递大量单独的回调指针。此外,还可以使用一个类来捕获/跟踪本地状态,使用单独的回调指针进行此操作将需要对函子进行额外的工作。应该使用“删除”关键字来销毁。难道注定要陷入困境吗?


您担心什么?您正在释放另一个模块分配的内存,还是您负责对象的生存期?

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