找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 293|回复: 0

视频:简单反汇编阅读

[复制链接]

1793

主题

457

回帖

0

积分

管理员

积分
0
发表于 2013-8-24 10:20:57 | 显示全部楼层 |阅读模式
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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 16:38 , Processed in 0.125587 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表