IDA - 关于函数/数据/代码识别的一些问题

逆向工程 艾达 拆卸 调试 蟒蛇 Python
2021-06-11 12:21:31

我必须编写一个IDAPython脚本,并且在 IDA 的函数/代码/数据识别中遇到了许多误报。

案例 1 - 无效的函数结束 (rpcrt4.dll):

在某些 DLL 中(尤其是在 rpcrt4.dll 中),IDA 将间接/取消引用调用识别为函数的结束,然后错误地识别了下一条指令(IDA 的no-return内核分析标志当然被禁用,所以这不是问题)。

示例(未知数据是有效jmp指令):

在此处输入图片说明

案例 2 -.text部分中的数据被标识为代码 (ExplorerFrame.dll):

大多数 Microsoft 的 DLL 都是用本.text开头的数据编译的,IDA 成功地将其识别为数据。然而,有时 IDA 未能将这些heads视为数据,而是将它们视为代码(我的猜测是它与错误识别的ret指令有关)。

例子:

在此处输入图片说明

情况 3 -函数代码被标识为数据(mimeTools.dll)

这个案例有点奇怪,因为我看不出有任何理由犯这个错误。如您所见,IDA 将代码识别为函数内部数据(错误识别的代码是 lea 指令)。

例子:

在此处输入图片说明

案例 4 - 混合错误识别代码 (igc32.dll):

无需详细说明,在以下示例中,它应该是所有代码,但它被标识为数据:

在此处输入图片说明

另一个例子:

在此处输入图片说明

很明显,我的问题是:有没有人以前遇到过这些问题之一并且知道其中一些问题的可能解决方案?我需要一个不涉及人工交互并且可以使用 IDAPython 脚本应用的解决方案。

提前致谢。

2个回答

反汇编可执行文件很困难对于机器来说,检测一小部分代码的边缘情况和类似的细微差别尤其困难。

这是 IDA(以及任何其他完整的反汇编程序)投入大量精力的事情,但基于不同反汇编程序中使用的设计决策和启发式方法,结果会有所不同。IDA 在解决诸如整个版本更新中的类似问题方面取得了持续的改进。

然而,找到并妥善解决所有此类情况是不现实的,因此这些问题很突出,通常通过手动或半手动方式解决。我敢打赌,有很多类似于Extrapass的插件和脚本,但也许维护得更好。我们还鼓励您自己创建一个来解决您遇到的问题。

我也遇到过类似的问题。我可以提供一个简单的修复方法来完成部分工作(当时它足以满足我的需求)。

使用 IDAPython 实现的一个相当简单的修复是应用以下逻辑:

  1. 遍历所有地址
  2. 如果地址包含数据并且有代码外部参照指向它 -> 转换为代码
  3. 重试定义与您刚刚进行的更正相邻的函数
  4. 如果地址包含代码并且有指向它的数据外部参照 -> 转换为数据

请记住,这是您需要实施的一般指南。实际的实现需要一些摆弄。这并不能解决所有问题,但可以解决许多问题。它帮助我整理了一个非常麻烦的 IDB。

希望这就是你要找的。