反汇编——逆向初步(3)
来源:互联网 发布:中国移动有什么软件 编辑:程序博客网 时间:2024/05/19 08:22
现在来继续我们的破解之旅。前面两个逆向的博文向大家展示了反汇编中的分支语句,现在我们来看看循环语句在反汇编中的原型是啥样。在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,dwordptr [ebp-4]
00401038 push eax
00401039 push offset string"%d " (0042201c)
0040103E call printf(004010b0)
00401043 add esp,8
8: i ;
00401046 mov ecx,dwordptr [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 ;