如何通过静态分析区分ARM代码和Thumb代码

时间:2018-08-27 08:30:29

标签: arm static-analysis disassembly thumb

我知道Thumb代码包含16位,而ARM代码包含32位。但是,是否可以查看文件中的特定偏移量并判断指令是ARM代码还是Thumb代码?在实施反汇编程序时,我想知道如何区分ARM代码和Thumb代码。

1 个答案:

答案 0 :(得分:0)

大多数任意单词序列都可以表示有效的ARM指令和有效的Thumb指令对。因此,在大多数情况下,除非能识别出已知要执行的代码,并且该代码将以已知的分支目标执行BX或BLX,否则就没有100%可靠的方式来区分两者。目标可以区分ARM或Thumb代码。

但是,从启发式角度来看,典型代码中发现的位模式分布在ARM和Thumb代码中将有很大不同。例如,即使一个人对任何特定指令一无所知,只要简单地将每个32位字的内容列出为8位十六进制数字(每行一个),并观察每一行中数字值的分布列,使用ARM代码,所有八列可能会产生不同的分布,但是在给定Thumb代码的情况下,前四列的分布类似于后四列。如果人们要查看“条件代码”列,则这种效果通常会特别明显,因为大多数指令都没有指定条件代码。

检查与特定指令相关的位模式可能会允许扫描程序识别在ARM上没有多大意义但在Thumb上则无意义的构造,反之亦然,但即使简单的数值分布也可能足够很多情况。