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

如何通过静态分析区分ARM代码和Thumb代码,arm,static-analysis,disassembly,thumb,Arm,Static Analysis,Disassembly,Thumb,我知道Thumb代码由16位组成,ARM代码由32位组成。但是有没有办法查看文件中的特定偏移量,并判断指令是ARM代码还是Thumb代码?在实现反汇编程序时,我想知道如何区分ARM代码和Thumb代码。大多数任意的单词序列都表示有效的ARM指令和有效的Thumb指令对。因此,在大多数情况下,没有100%可靠的方法来区分这两种代码,除非能够识别已知要执行的代码,以及使用已知分支目标执行BX或BLX的代码(在这种情况下,目标的LSB将区分ARM或Thumb代码) 然而,从启发式的角度来看,在典型代码

我知道Thumb代码由16位组成,ARM代码由32位组成。但是有没有办法查看文件中的特定偏移量,并判断指令是ARM代码还是Thumb代码?在实现反汇编程序时,我想知道如何区分ARM代码和Thumb代码。

大多数任意的单词序列都表示有效的ARM指令和有效的Thumb指令对。因此,在大多数情况下,没有100%可靠的方法来区分这两种代码,除非能够识别已知要执行的代码,以及使用已知分支目标执行BX或BLX的代码(在这种情况下,目标的LSB将区分ARM或Thumb代码)

然而,从启发式的角度来看,在典型代码中发现的位模式的分布在ARM和Thumb代码中会非常不同。例如,即使一个人对任何特定指令一无所知,如果一个人只是将每个32位字的内容列为8位十六进制数,每行一个,并观察每列中的数字值分布,那么所有8列可能会产生不同的ARM代码分布,但是在给定Thumb代码时,前四列的分布与后四列相似。如果查看“条件代码”列,这种效果通常会特别明显,因为大多数指令都没有指定条件代码


检查与特定指令相关的位模式可能会允许扫描仪识别在手臂上没有多大意义但在拇指上有意义的结构,反之亦然,但在许多情况下,即使是简单的数值分布也可能足够。

与任何其他反汇编程序一样,您必须按执行顺序反汇编。与大多数指令集一样,它是不完美的,即使您进行了仿真,但有时您必须进行仿真或进行更深入的分析才能正确地反汇编。如果您遵循代码路径,您可以从arm中确定某个百分比的代码,其余部分则必须作为数据保留,并通过手工或仿真来计算。编译代码当然要容易得多,但如果您遇到一些手工编写的程序集,更糟糕的是,有人试图击败反汇编程序,您的机会就会降低。这并不意味着你不应该尝试。在任何人跳到yes之前,thumb2也是16位的,在该模式下,这些是单独解码的16位块,thumb2扩展以前是未定义的16位指令,现在是可变长度的(在这种情况下,附加了16位)。这当然会使分解变得更加困难。如果是纯arm,或者纯pre-thumb2 thumb,并且没有任何东西混合,那么您可以线性地进行分解,因为指令必须对齐,您可以分解数据或将其称为未知数据,并继续进行,因为您最终将在正确的位置拾取数据。