我必须编写一个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脚本应用的解决方案。

预先感谢。

#1 楼

拆卸可执行文件非常困难。对于机器来说,要检测边缘情况和关于一小部分代码的类似细微差别特别困难。以及在不同的反汇编程序中使用的启发式方法,结果会有所不同。 IDA在解决整个版本更新中的类似问题方面一直取得了持续的进步。

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

评论


在此之后,IDA很快就做好了很好的工作。如果时间不是最重要的,则可以按照所有可用路径(最有可能基于IR)使用反汇编技术。它离性能不远,但是代码和数据之间的区别以及间接分支的解析是一个加号。

–诺德瓦尔德
17年7月7日在6:46

@nordwald AFAIK,这往往过于激进,并且会将数据误认为是代码,反之亦然。不过,这是有道理的,所以+1

– NirIzr
17 Mar 7 '17 at 11:55

您好Nirlzr,对不起,您的回答毫无意义。我知道反汇编可执行文件很困难,否则我不会问这个问题。我的目的是编写一个提高识别度的脚本,我知道我将无法获得100%的成功。我的问题是询问周围的人,如果他们遇到过这些问题并为他们提供一些答案-这就是为什么我问“有人曾经经历过这些问题之一,并且知道其中一些问题的可能解决方法”的原因。

–阿维
17 Mar 8 '17在15:14



是的,我的回答恰好解决了您的问题,并澄清说是的,每个人都遇到此问题,可能的解决方法是针对特定问题编写脚本。我知道这不是您所希望的最佳答案,但事实就是如此。很显然,任何未来的参与者都欢迎分享细节,但是我怀疑这些细节是稀缺的。我在回答时的印象是,有些答案总比没有答案要好。

– NirIzr
17 Mar 8 '17在15:26



#2 楼

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

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


遍历所有地址
如果地址包含数据并且有指向其的代码外部参照->转换为代码
重试定义与您刚进行的校正相邻的功能
如果地址包含代码并具有指向它的数据外部参照->转换为数据

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

希望这是您正在寻找什么。