从C语言到汇编,从汇编到C语言

来源:互联网 发布:fc2最新域名fc2cn.com 编辑:程序博客网 时间:2024/04/29 10:42
【分享】从C语言到汇编,从汇编到C语言

 

标 题: 【分享】从C语言到汇编,从汇编到C语言
作 者: wzjok
时 间: 2009-05-20,17:03
链 接: http://bbs.pediy.com/showthread.php?t=89379

要从事“逆向工程”工作,或对其感兴趣,请必然要接触到汇编语言。然而我们在对计算机语言的了解大都是从高级语言(如C、VB、Dephi)开始的。那当我们阅读由高级语言翻译成的机器语言时肯定会遇到很多障碍。下面是我在看了相关书籍后,做的一些笔记,希望有点参考价值!

一、循环语句与发汇编后的机器语言
1、for循环
   下面是一段C语言的代码,我们的目的是来看其反汇编的结果:
   int myfunction(int a,int b) 
    { 
         int c = a+b; 
         int i; 
         for(i=0;i<50;i++) 
         { 
             c = c+i; 
         } 
         return c; 
    } 
    前面的反汇编暂时不理它,这里从for的地方开始反汇编,结果如下: 
      for(i=0;i<50;i++) 
      00412BC7  mov        dword ptr [i],0   // i=0; 给循环变量赋初值 
      00412BCE  jmp         myfunction+39h (412BD9h)// 跳到第一次循环处   
  >  00412BD0  mov        eax,dword ptr [i]  
  |   00412BD3  add         eax,1  // i++;修改循环变量
  |   00412BD6  mov        dword ptr [i],eax  
  |   00412BD9  cmp        dword ptr [i],32h //  比较 i 与50的关系, 检查循环条件
  |   00412BDD  jge          myfunction+4Ah (412BEAh)  // 当 i>=50 [即 !(i<50) ] 时则跳出循环
  |   { 
  |      c = c+i; 
  |   00412BDF  mov         eax,dword ptr [c]  // 变量 c
  |   00412BE2  add         eax,dword ptr [i]   // 变量 i
  |   00412BE5  mov         dword ptr [c],eax  // c=c+i;
  |   } 
  <  00412BE8  jmp         myfunction+30h (412BD0h)  // 跳回去修改循环变量
      00412BEA  mov         eax,dword ptr [c]  
     }
      可以看到for循环主要用这么几条指令来实现:mov进行初始化。jmp跳过循环变量改变代码。cmp实现条件判断,jge根据条件跳转。
用jmp回到循环改变代码进行下一次循环。所以for结构有以下的显著特征: 

           mov <循环变量>,<初始值>   ; 给循环变量赋初值 
       jmp B       ;跳到第一次循环处 
    A: (改动循环变量)       ;修改循环变量。 
        … 
    B: cmp <循环变量>,<限制变量>  ;检查循环条件 
       jgp  跳出循环 
       (循环体) 
          …                
        jmp A       ;跳回去修改循环变量 

2、do循环  
  再看一下do循环,因为 do循环没有修改循环变量的部分,所以比for循环要简单一些。 
        do 
           { 
                  c = c+i; 
            00411A55  mov        eax,dword ptr [c]  
            00411A58  add         eax,dword ptr [i]  
            00411A5B  mov         dword ptr [c],eax  
            } while(c< 100); 
            00411A5E  cmp        dword ptr [c],64h   
            00411A62  jl           myfunction+35h (411A55h)  

            return c;

   do循环就是一个简单的条件跳转回去。只有两条指令: 
   cmp <循环变量>,<限制变量> 
    jl <循环开始点> 

3、while循环
        while(c<100){ 
            00411A55  cmp         dword ptr [c],64h 
            00411A59  jge         myfunction+46h (411A66h)  

               c = c+i; 
            00411A5B  mov         eax,dword ptr [c]  
            00411A5E  add         eax,dword ptr [i]  
            00411A61  mov         dword ptr [c],eax  
              } 
            00411A64  jmp         myfunction+35h (411A55h)  
            return c; 
    很明显,我们会发现while要更复杂一点。因为while除了开始的时候判断循环条件之外,后面还必须有一条无条件跳转回到循环开始的地方,共用三条指令实现: 
             A: cmp <循环变量>,<限制变量> 
                 jge  B 
                ( 循环体) 
                … 
           jmp A 
             B: (循环结束了) 

这样,我们对C语言中的循环结构的分析,就基本弄完了!当然,我们用同样的方法也可以分析出C语言在“分支语句”、以及其它的数据结构中的C代码与机器反汇编代码的关系了!
原创粉丝点击