反汇编——逆向初步(1)

来源:互联网 发布:中国移动有什么软件 编辑:程序博客网 时间:2024/06/08 06:38

   学破解,肯定要会逆向,要不然,堆着一大堆的反汇编代码,你只能摇头长叹。明知道里面有你需要的东西,却是不知该如何去挖掘,是一件很令人郁闷的事。好了,废话不多说了,下面我们开始学习逆向。
   不知道有多少同学学过C或者其他的编程语言,我们知道,学习一门语言,要掌握其语法,反汇编也是如此。其实所谓反汇编,就是将机器码翻译成汇编,所以我们看到的都是汇编指令。所有的编程语言,几乎都是分支加循环这么几个句式。拿C来说,在C中,分支就有if、if……else和switch,那么在反汇编中,这几个语句是以怎样的形式存在呢?接下来我们就来揭开其面纱。
    我们来看这样一个小程序:
#include
main()
{
       int c = 5;
       if (c >= 0&& c < 10)
       {
              printf("c >0");
       }
       else if (c >= 10&& c < 100)
       {
              printf("c > 10&& c < 100");
       }
       else
       {
              printf("c >100");
       }
}
   上面是一个很简单的if……else分支语句,学过C的都能看懂,那么在反汇编中,它是怎么的呢?我们来看下面的代码:
5:       if (c>= 0 && c< 10)
0040102F   cmp       dword ptr[ebp-4],0
00401033   jl        main 3Ah(0040104a)
00401035   cmp       dword ptr[ebp-4],0Ah
00401039   jge       main 3Ah(0040104a)
6:       {
7:          printf("c> 0");
0040103B   push      offset string"c > 0" (0042901c)
00401040   call      printf(004012a0)
00401045   add       esp,4
8:       }
9:       else if (c>= 10 && c< 100)
00401048   jmp       main 62h(00401072)
0040104A   cmp       dword ptr[ebp-4],0Ah
0040104E   jl        main 55h(00401065)
00401050   cmp       dword ptr[ebp-4],64h
00401054   jge       main 55h(00401065)
10:      {
11:         printf("c> 10 && c< 100");
00401056   push      offset string"c > 10 && c< 100" (0042a080)
0040105B   call      printf(004012a0)
00401060   add       esp,4
12:      }
13:      else
00401063   jmp       main 62h(00401072)
14:      {
15:         printf("c> 100");
00401065   push      offset string"c > 100" (00429038)
0040106A   call      printf(004012a0)
0040106F   add       esp,4
16:      }
   其实前面的分支语句在VC看到的反汇编就是上面的代码。从上面我们可以知道,c这个变量是存放在堆栈中的,程序一开始会拿c和0作比较,如果小于0就跳转到0040104a处,也就是跳转到0040104A  cmp       dword ptr[ebp-4],0Ah,而这就是if语句的第二个分支。先来看if语句的第一个分支,其代码是
0040102F   cmp       dword ptr[ebp-4],0
00401033   jl        main 3Ah(0040104a)
    其中 dword ptr[ebp-4]是c的值,它是存放在堆栈中的。这两行代码的意思就是拿c和0比较,如果c小于0,就跳转到下一个分支进行比较,如果c大于0,则继续往下执行。接下来就是
00401035   cmp       dword ptr[ebp-4],0Ah
00401039   jge       main 3Ah(0040104a)
这两句代码,这里是用c和10作比较,0Ah是10的十六进制。如果c大于10,也要跳转到下一个分支,因为这个分支的条件是c>0&&c<10,以上这四行代码实现的就是这个功能。
    接下来我们来看第二个分支。
    第二个分支的代码如下:
00401048   jmp       main 62h(00401072)
0040104A   cmp       dword ptr[ebp-4],0Ah
0040104E   jl        main 55h(00401065)
00401050   cmp       dword ptr[ebp-4],64h
00401054   jge       main 55h(00401065)
   有的同学可能会问,为什么在第二个分支的前面会有00401048  jmp       main 62h(00401072)这样一行代码,其实我们可以这样想一下,如果if语句的第一个分支执行完了,程序是应该跳出if语句,不再去执行下面的分支了吧?这句代码就是实现这个功能的,如果上一个分支执行完了,程序执行到这一句的时候就直接跳出if语句,而不再执行下面的分支,而上面的分支如果没有执行,就会跳转到这句代码的下一行,前面我们看到c如果小于0或大于等于10,都会跳转到0040104A  cmp       dword ptr[ebp-4],0Ah,继续进行下一个分支的比较。第二个分支的代码和前一个分支类似,先是用c和10作比较,如果小于10,则跳转到00401065处,也就是00401065  push      offset string"c > 100"(00429038),这里就是if语句的第三个分支的处理代码,也就是调用printf("c>100")的地方。如果c大于10,则用c和100做比较,如果c大于等于100,也直接跳转到if的第三个分支的处理代码。
   由于第三个分支是else,所以不需要做什么判断了,如果前两个分支都不执行,就会跳转到第三个分支来执行,所以在else处只有一行00401063  jmp       main 62h(00401072)这样的代码,就是为了防止上面的分支执行完后继续去执行else中的代码。
   这样,反汇编中的if……else分支我们就学得差不多了,以后大家要是在玩逆向的时候遇到一些类似于下面的代码:
cmp    xx,xx
jl        xxxx
   之类的,就可以想到这里是if语句,这样就有助于我们把反汇编逆成我们熟悉的高级语言,这对写注册机来说,是很有帮助的。

 

 

我的更多文章:
  • (2013-07-10 20:26:09)
  • (2013-07-10 19:50:00)
  • (2013-07-10 19:40:00)
  • (2013-07-10 19:30:00)
  • (2013-07-10 19:07:29)
0 0
原创粉丝点击