首先,从程序开始就定义了一些变量r2,r6,r5,r4等,但是r6实际值为20,r5值为300。我们可能会考虑,如果不进行变量的定义而是直接使用数值,汇编是不是也是一样的?现在我们简单的修改一下程序的代码如下:
#include <stdio.h>
int main(int argc, char** argv)
{
int r2;
//int r5 = 300;
//int r6 = 20;
int r4 = 0;
loc_10:
r2 = (r4*5 - 160)/9;
printf("%d\t%d\n", r4, r2);
r4 += 20;
if(r4<=300)
goto loc_10;
return 0;
}
执行armcc new1b.c -o new1b.axf,然后使用IDA打开所生成的.o文件,如下图:
虽然最后生成可执行文件的执行结果没有发生变化,但是从汇编上分析的话会发现,程序开始时的寄存器入栈和赋值已经发生了变化,使用汇编代码比较的话也有了较大的不同。可能很多人认为如果不影响结果干嘛纠结在这些小的细节上呢?原因不难理解,非常简单的程序是无所谓了,但是如果涉及到反编译,则往往是代码量比较大的程序,不注意这些小的问题可能引起其他代码反编译的困难,使用beyond compare比较也不至于一片红。
因此,我们在反编译时需要注意,看使用的是数值还是寄存器,如果使用的数值则可能是程序语句所使用的数值常量,如果使用的是寄存器则有可能使用的是已定义的变量。