我首先看一下vs2013,简单写的C代码:
int cainiao2022(int a,int b)
{
int c=a+b;
for(int i=0;i<10;i++)
{
c=c+i;
}
return c;
}
void main()
{
cainiao2022(1,2);
}
变动的只是cainiao2022()里面加了一个for循环,我们就从for循环那里看就行了
------------------------------------------------------------------------------
4: for(int i=0;i<10;i++)
00401041 mov dword ptr [ebp-8], 0
;上一个动画我们提到[ebp-4]处为第一个局部变量(这里是c)
;那么这里的[ebp-8]就是第二个局部变量i
;对i赋值i=0
00401048 jmp cainiao2022+33h (00401053) ;赋值后跳到00401053
;上面2句的模板是这样的:
;
;mov <循环变量>,<初值>
;jmp 检查循环条件
0040104A mov ecx,dword ptr [ebp-8]
;把i的值给ecx
0040104D add ecx,1
;ecx加1
00401050 mov dword ptr [ebp-8],ecx
;加1后的ecx给i,这样通过ecx互换实现i++
;上面3句只是简单的实现i++,然后让下面的比较语句去比较
00401053 cmp dword ptr [ebp-8],0Ah
;来到这里,i的值与0Ah比较,也就是10比较
00401057 jge cainiao2022+44h (00401064)
;i大于或等于0Ah就跳转,就是说小于10时执行循环
;上面2句的模板是这样的:
;cmp <循环变量>,<限制条件>
;jge 跳出循环
;(循环体)
5: {
6: c=c+i;
00401059 mov edx,dword ptr [ebp-4] ;把第一个局部变量c给edx
0040105C add edx,dword ptr [ebp-8] ;把第二个局部变量i加edx
0040105F mov dword ptr [ebp-4],edx ;把相加的结果给c,就是c=c+i
;上面3句是循环体了,非常的简单,只要弄懂[ebp-N]就行了
7: }
00401062 jmp cainiao2022+2Ah (0040104a)
;跳会修改循环变量继续循环,这里是跳回i++那里
;这句也是模板
;jmp 修改循环变量
8: return c;
00401064 mov eax,dword ptr [ebp-4] ;把c的值给eax作为函数返回的结果
;所有的函数默认都是用eax作返回值。这个定理在爆破的时候非常的有用。
------------------------------------------------------------------------------
总结一个for循环的反汇编结构如下:
mov <循环变量>,<初值>
jmp 检查循环条件B
A: (修改循环变量)
...
...
B: cmp <循环变量>,<限制条件>
jge 跳出循环
(循环体)
...
...
jmp 修改循环变量A