芯片IC单片机解密百科

十年专注单片机解密

芯片破解指令识别和避免反汇编中遇到的花指令

工作中需要花费大量时间和精力去分析花指令,成为困扰逆向工程师以及安全响应人员的一件事。花指令就是一串没有任何实际意义的指令。除了浪费时间之外,我发现有的人也会对他们发现的花指令感到震惊、兴奋。这是因为他们在一个本来不能执行代码的内存中发现了可执行代码,也就相当于发现了一个漏洞利用程序或高级恶意软件样本。

 

在这篇文章中,我将通过介绍花指令产生的原因以及其我将讨论如何识别花指令。 我们将重点关注x86反汇编,在其他的平台上也是类似的情况。


问题的产生


人们在分析汇编代码的过程中,由于芯片破解反汇编器将花指令反汇编成有效的指令,所以很多人就默认假设所有汇编代码都是实际的代码指令,这就是很多人所犯的第一个错误。由于X86平台的指令是密集编码的,所以很多指令都是一个字节编码的。乍一看,几乎所有数据的反汇编代码都可能产生有效的x86代码。

 

例如,我生成了一个16kb的随机数据文件,并对其进行了反汇编。 这产生了6,455个有效的32位x86指令,只有239个字节无法识别的数据。这意味着反汇编程序无法解析成有效指令的数据。可以看到超过98%的随机数据可以被反汇编成有效的指令。


让我们看看这个随机数据的第一部分反汇编,我们可以看到许多指令和一个字节无法识别的数据。

 

 

这个片段中的第一列数据是数据偏移量。第二列显示组成指令的字节,第三列显示这些字节的反汇编表示。对于除高亮行(偏移量0x16)之外的所有行,反汇编显示一个有效的指令。


偏移量0x16表示可能看起来像一条指令的内容,但符号“db”只是汇编表示法来声明一个字节。反汇编器表示在这个位置是字节0xF6,它不能将其识别为指令的一部分。x86指令集是编码密集,以至于每个字节值都可能是下一个指令的潜在开始。


在这种情况下,0xF6可能是一个指令的有效开始,取决于它后面的字节,但这种情况下的其与后面的字节0x4E并不构成有效的操作数。在随机数据的16kb中,274个无法识别的字节只有27个不同的值。在这27个值中,唯一一个与常用英文字符范围重叠的是字母“b”(0x62)。

 

在这篇文章中,我们将坚持使用32位反汇编,因为它的流畅度更高,但在16位和64位英特尔汇编中也会出现同样的问题。 当先前提供的随机数据被拆分为16位代码时,它产生了96%的有效指令,而拆分为64位则产生了95%的有效指令。

 

宝赢彩票平台你可能会想如何用大面积的零来表示着这段内存空间中没有代码存在,这该多么美妙。高级反汇编可能会智能地识别大量的零代码,并跳过反汇编,但它们还是将大量的零反汇编为有效的x86指令。 这里有几个反汇编零字节来说明这一点:


 

英文文本的问题更为严重。我生成了一个包含随机文本(lorem ipsum)的60kb文件,并对其进行了反汇编,生成了23,170条指令,并且没有无法识别的数据。所以,100%的随机文本被反汇编成有效的指令。 下面的片段显示了标准Lorem ipsum反汇编的前三个单词(“Lorem ipsum dolor”):


所以,我们在看反汇编代码时,不仅要看对应序列能否被反汇编成功,还是要看其是否是有效的指令。


解决方法


尽管编写更好的启发式的脚本用来过滤掉花指令是可行的,但是目前我们最好的武器依旧是是人类的大脑。对于一个经验丰富的逆向工程师来说,在本文中到目前为止所看到的代码片段有很多东西,他们是学习判断你所看到的代码是否是花指令的关键。


博亿彩票开奖 八马彩票 内蒙古快3 258彩票 内蒙古快3 爱购彩票官网 170彩票官网 爱拼彩票平台 内蒙古快3走势图 内蒙古快3走势图