反编译实例2补充1

首先,从程序开始就定义了一些变量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比较也不至于一片红。

因此,我们在反编译时需要注意,看使用的是数值还是寄存器,如果使用的数值则可能是程序语句所使用的数值常量,如果使用的是寄存器则有可能使用的是已定义的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值