吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6837|回复: 13
收起左侧

[原创] 菜鸟学逆向——简单的反汇编阅读与逆向(2)

  [复制链接]
cu629944 发表于 2012-4-9 14:31
【文章标题】: 菜鸟学逆向——简单的反汇编阅读与逆向(2)
【文章作者】: Silence(cu629944,等试用期通过,我会修改ID为Silecne)
【作者邮箱】: mohen_ng@sina.cn
【下载地址】: 自己搜索下载
【使用工具】: IDA VC++6.0
【操作平台】: WIN7
【作者声明】: 本系列文定位为和我一样菜鸟的人们看的,老鸟和高手飞过。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
   请将菜鸟学逆向——简单的反汇编阅读与逆向(1)看完,再来看第二篇,地址是:http://www.52pojie.cn/thread-141165-1-1.html
   讲解几个常见的函数调用约定;
      VC6中的函数调用约定;
      调用约定        堆栈清除    参数传递
      __cdecl         调用者      从右到左,通过堆栈传递
      __stdcall       函数体      从右到左,通过堆栈传递
      __fastcall      函数体      从右到左,优先使用寄存器(ECX,EDX),然后使用堆栈

  看下面程序:
 int        Silence(int a,int b)
  {
          int c=a+b;
          for(int i=0;i<10;i++)
                  {
                  c=c+i;
                  }
          return c;
  }
  
  void        main()
  {
          Silence(1,2);
  }
  变动的只是Silence()里面加了一个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         Silence + 33h (00401053)        ;赋值后跳到00401053
;上面2句的模板是这样的:
  ;
  ;mov        <循环变量>,<初值>
  ;jmp        检查循环条件

  ;上面3句只是简单的实现i++,然后让下面的比较语句去比较
00401053   cmp         dword ptr [ebp-8],0Ah     ;来到这里,i的值与0Ah比较,也就是10比较
  00401057   jge         Silence + 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         Silence + 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

  以后看到这样的模板的时候,我们就可以知道这是一个FOR语句的循环体。

  --------------------------------------------------------------------------------
  这个是Realse版本的For语句循环:

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                         ;  ecx作为计数器,比较是否小于10,如果小于10,就继续跳回去执行
  00401012  |.^ 7C F8         \jl      short 0040100C
  00401014  \.  C3            retn


  好了,FOR语句循环就写到这里,给大家留一个作业,就是今天其他的循环体比如do,while循环,大家根据这个写出反汇编代码,然后跟帖回复!

--------------------------------------------------------------------------------
【版权声明】: 本文原创于吾爱破解技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2012年04月09日 14:20:11


免费评分

参与人数 1热心值 +1 收起 理由
willJ + 1 感谢发布原创作品,[吾爱破解论坛]因你更精.

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wgz001 发表于 2012-4-9 14:42
沙发学习   
期待后续
blood537 发表于 2012-4-9 14:43
willJ 发表于 2012-4-9 14:51
     __cdecl         调用者      从右到左,通过堆栈传递
      __stdcall       函数体      从右到左,通过堆栈传递
      __fastcall      函数体      从右到左,优先使用寄存器(ECX,EDX),然后使用堆栈


弱弱的问问,这个应该只有栈吧,会通过堆?

谢谢楼主的原创作品,不错。

点评

咱们中国的文字博大精深,说堆栈,其实只是栈,而不是堆……  发表于 2012-4-9 14:56
Chief 发表于 2012-4-9 15:10
前排占个位置,学习。


爱的单纯 发表于 2012-4-9 15:29
感谢楼主分享,学习了
hhyy540 发表于 2012-4-9 15:30
不错 期待后续
雪丽美 发表于 2012-4-9 16:03
期待后续
76840041 发表于 2012-4-9 16:45
马克,回家研究,谢谢
125096 发表于 2012-4-9 19:15
收藏起来啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-11 18:07

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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