|
|
http://yunpan.cn/QXPbC9RiHk8ee
------------------------------------------------------------------------------
爱国者黑客
www.3800hk.com
专业的黑客安全技术培训基地
多抽出一分钟时间学习.让你的生命更加精彩.
动画教程只是起到技术交流作用.请大家不用利用此方法对国内的网络做破坏.
国人应该团结起来一致对外才是我们的责任.由此动画造成的任何后果和本站无关.
------------------------------------------------------------------------------
大家好,我是 BoXer ,今天为大家做的动画是《简单反汇编阅读(二)》
上一个动画我们已经知道了函数反汇编后最基本的调用过程,今天我们来看看复杂一点的函数
由于水平有限,而且动画定位于初学者,所以动画会显得有点唠叨,请各位多多包涵
------------------------------------------------------------------------------
看下面程序:
int boxer(int a,int b)
{
int c=a+b;
for(int i=0;i<10;i++)
{
c=c+i;
}
return c;
}
void main()
{
boxer(1,2);
}
变动的只是boxer()里面加了一个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 boxer+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 boxer+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 boxer+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
------------------------------------------------------------------------------
接下来我们用OD看看没有调试信息的release版的情况,这样比较接近实践呢!
00401000 /$ 8B4424 08 mov eax, dword ptr [esp+8] ; 第一个局部参数c
00401004 |. 8B4C24 04 mov ecx, dword ptr [esp+4] ; 第二个局部参数i
00401008 |. 03C1 add eax, ecx ; c=c+i
0040100A |. 33C9 xor ecx, ecx ; ecx清零,就是i为0开始循环
0040100C |> 03C1 /add eax, ecx ; c=c+i
0040100E |. 41 |inc ecx ; i++
0040100F |. 83F9 0A |cmp ecx, 0A
00401012 |.^ 7C F8 \jl short 0040100C
00401014 \. C3 retn
可以看到Release后的代码跟OD的引擎优化后出来的代码简单明了!
但是在很多情况下,发行版的代码都比debug版的难读,这个就要靠我们多练习了!
------------------------------------------------------------------------------
今天提到了for循环,其他的循环体比如do,while循环也是差不多的,看完动画后不妨自己试试
如果看动画的时候有什么疑问,可以通过我的blog留言或者直接发E-mail给我,期待你的交流
http://boxer.yo2.cn
scship@163.com
http://yunpan.cn/QbsDB3qevH5iE |
|