反汇编——逆向初步(3)

      现在来继续我们的破解之旅。前面两个逆向的博文向大家展示了反汇编中的分支语句,现在我们来看看循环语句在反汇编中的原型是啥样。在C语言中,循环语句有while,do……while和for循环,我们先来看while循环。同样的,我们先来看一个简单的例子,代码如下:
#include
void main()
{
        int i = 0;
        while (i < 10)
        {
                printf("%d    ", i);
                i ;
        }
        printf("\n");
}
      这是一个很简单的while循环的例子,相信有一点C基础的都能看懂,下面我们来看看它的反汇编代码,如下所示:
4:            int i = 0;
00401028    mov            dword ptr [ebp-4],0
5:            while (i < 10)
0040102F    cmp            dword ptr [ebp-4],0Ah
00401033    jge            main 41h (00401051)
6:            {
7:                printf("%d    ", i);
00401035    mov            eax,dword ptr [ebp-4]
00401038    push            eax
00401039    push            offset string "%d    " (0042201c)
0040103E    call            printf (004010b0)
00401043    add            esp,8
8:                i ;
00401046    mov            ecx,dword ptr [ebp-4]
00401049    add            ecx,1
0040104C    mov            dword ptr [ebp-4],ecx
9:            }
0040104F    jmp            main 1Fh (0040102f)
    现在我们来具体分析这段代码。
      第一行依然对变量i的初始化(变量i是存放在堆栈中),然后进入while循环。
      在while循环中,先是判断i的大小,看其是否超出来循环的界限,即i是否大于或等于10,若是大于或等于10,则跳出循环,否则就既相互执行循环体中的代码。执行完循环体中的代码后,有个无条件跳转指令,将程序跳转到0040102f处,也就是跳去执行0040102F    cmp            dword ptr [ebp-4],0Ah这行代码,即重新判断i的大小。
      由此我们可以知道,反汇编中的while循环有一个特征,就是会有
cmp    xx,xx
jge/jle/jg/jl ...    xxxx    (这里可以是除了jmp外的任何跳转指令)
……
jmp    xxxx        (这里跳回前面的cmp处)
    以后大家要是在反汇编中看到类似的配对指令,就可以联想到while循环,从而将其逆出来。
    下面我们来看看do……while的反汇编代码,看其和while有何不同。先来看C代码,如下所示:
#include
void main()
{
        int i = 0;
        do
        {
                printf("%d    ", i);
                i ;
        }while(i < 10);
        printf("\n");
}
这段代码和上面的类似,只是将while换成了do……while,我们来看看它的反汇编代码长啥样。
4:            int i = 0;
00401028    mov            dword ptr [ebp-4],0
5:            do
6:            {
7:                printf("%d    ", i);
0040102F    mov            eax,dword ptr [ebp-4]
00401032    push            eax
00401033    push            offset string "%d    " (0042201c)
00401038    call            printf (004010b0)
0040103D    add            esp,8
8:                i ;
00401040    mov            ecx,dword ptr [ebp-4]
00401043    add            ecx,1
00401046    mov            dword ptr [ebp-4],ecx
9:            }while(i < 10);
00401049    cmp            dword ptr [ebp-4],0Ah
0040104D    jl            main 1Fh (0040102f)
    由上面do……while的反汇编我们可以看出,它和while还是有一些区别的。在while循环中,一开始先是对控制变量i进行判断,如果i不超出循环的界限,则执行while中的循环体,而在do……while中,则是先执行循环体,然后再判断i的大小,若是不超出循环界限,则跳到上面去继续执行循环体,否则结束循环。do……while的特征可以总结如下:
……
cmp    xx,xx
jl/jg/jle/jge...    xxxx
      以上是do……while的反汇编介绍,由此我们可以看出,while和do……while还是存在着一些区别,while是先判断控制变量,然后再执行循环体,而do……while则是先执行循环体,再判断控制变量。这一细微的差距,可能会导致两种不同的结果,所以新手们在使用while和do……while时要注意些,先理清逻辑,然后再决定使用哪个循环,这样可以避免一些BUG的出现。
        关于while和do……while的反汇编就介绍到这,近期会更新for循环和数组的反汇编,介绍完这些之后,会有一个实例,我们可以通过前面介绍的这些逆向知识来分析一个简单的CrackMe,找出其中的注册码,以提升我们的实战能力,希望大家能坚持学下去。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值