当前位置: 首页 > 图文教程 > 开发语言 > 汇编语言 > 汇编语言概述

汇编语言
汇编语言的"多"层结构与理解

汇编语言概述


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 436 ::
收藏到网摘: n/a

[ 概述
    Note:本文的汇编格式采用MASM汇编格式,某些函数也出自MASM,希望大家不要与
    Linux格式汇编所混淆.
    今天我们来简单的概述下传说中的汇编语言,本文档的内容仅仅存在于对汇编语言
的简单概述,当然也会针对一些初学者遇到的问题进行简单的讨论,如果您对于本文
档的内容有任何的疑问或者建议,可以在bbs.cciss.cn该文档的发布板块进行提问,
也可以发送mail给我,mail:7all7_at_163.com.
  对于汇编语言的学习,我建议大家可以阅读以下的基本汇编语言资料,这些资料也是
这几年以来自己感觉比较好的汇编语言的手册类资料.资料列表如下:
  《Intel汇编语言程序设计》
  《IBM PC汇编语言程序设计》
  《Windows环境下32位汇编语言程序设计》

  在开始我们正式文档的书写前,希望初学者不要对汇编语言所"吓倒",其实汇编与C
C++ C#等编程语言的学习过程是类似的,只是汇编更接近于底层,可以直接操作CPU
寄存器,可以更方便的操作OS内核层的东西而已:)下面开始我们的简单汇编之旅.

--[ 汇编语言能够干什么?
  逆向工程的必备知识就是需要熟悉汇编语言,没有汇编语言的功底或基础知识,你不
可以做以下的几件事情:
  A: 破解软件,逆向工程的范畴
  B: 漏洞挖掘技术,如果针对OS/非WEB应用程序进行漏洞的挖掘测试工作,则汇编语言
  是一个必不可少的工具
  C: 针对OS的底层开发,有很多底层开发都会涉及到汇编语言的使用
  D: 书写exploit或书写shellcode,这些都需要一定的汇编基础
  E: 嵌入式系统,当然嵌入式系统你也可以拿C来写,但某些特定程序段是否会要求你使
  用汇编语言?
  F: 恶意代码,如病毒 木马程序 rootkit级别的后门程序,当然按照目前的技术而言,
  纯粹的SDK编程在Win下是可以实现rootkit级别隐藏后门,但据我曾经分析的一朋友
  的rootkit级别的后门有一部分代码则是拿汇编与OS内核进行了某些操作,所以至尽
  我始终觉得把rootkit级别backdoor的关键部分代码拿汇编来写是有好处的,个人观点.
 
  知道了汇编语言的优势,下面的内容我们会概述下汇编语言的语法 编译等问题.
  汇编语言是面向过程的语言,其语法主要依靠一些简单的指令来操作程序的运行流程,
  如:mov 数据移动指令,jmp 无条件跳转指令等等,通过对寄存器与自定义数据(变量/
  常理)的操作来搭建整个程序结构.下面的内容我们来简单的描述下汇编语言的语法.
 
--[ 汇编语言语法
    汇编的编译 连接 运行 调试等环节我们暂时跳过,相信大家都可以通过google搜索到
相关信息.我们先以一个WIN MASM环境下汇编的代码框架开始我们的旅程.
FrameASM.asm
-----------code frame-------------
INCLUDE Irvine32.inc ;包含进所需头文件

.data
  ;变量声明区域

.code ;代码区域
main PROC
    ;代码区域

main ENDP

    ;子程序区域
END main
-----------code frame-------------

  以上为一个汇编程序的简单框架,下面的内容我们按照自上而下的顺序,从变量声明开始
讲起.
A: 声明变量
  MASM中的内部数据类型,主要有BYTE(8位无符号整数) SBYTE(8位有符号整数) WORD(16位
无符号整数) SWORD(16位有符号整数) DWORD(32位无符号整数) SDWORD(32位有符号整数)...等
简单的变量声明格式就是: 名称 数据类型 初始化的值.
如:myvalue BYTE 'a' ;myvalue为字符常量a
myvalue1 BYTE 10h ;16进制格式
mystring "my first asm app", 0  ;这里的0代表NULL,即表示结束字符串.

B: 代码区域
  该区域就是存放汇编指令的地方了,一般汇编程序的书写都有一个main主函数,main主函数
外边的区域则为各个子函数.

C: 一个简单的示例
  /*
     编译环境:Masm615
     编译选项:Make32 $YourPath/AddSub.asm
  */

    INCLUDE Irvine32.inc
    .data                            ;数据区域,定义变量 常理
    v1  DWORD 10000h
    v2  DWORD 50000h
    v3  DWORD 30000h
    .code
    main PROC                    ;代码区域
        mov eax,v1        ; EAX = 10000h //立即操作数
        add eax,v2        ; EAX = 50000h
        sub eax,v3        ; EAX = 30000h
        call DumpRegs //打印寄存器值的函数,该函数查看<<Intel 汇编语言程序设计>>的Irvine32.asm
        exit
    main ENDP
        ;这里可以写子函数模块,因为例子较简单,未书写子函数
    END main
    ------------打印结果--------------
    C:\Masm615\exp>AddSub
  EAX=00030000  EBX=7FFDF000  ECX=00000101  EDX=FFFFFFFF
  ESI=00000008  EDI=00000001  EBP=0012FFF0  ESP=0012FFC4
  EIP=00401024  EFL=00000206  CF=0  SF=0  ZF=0  OF=0
  ----------------------------------

--[ 汇编语言的一些小经验
    这个部分写给想学习汇编语言而没有开始学习的朋友,当然本段落的很多内容都是个人观点,
不当之处请大家指正.汇编语言的入门的确有些苦涩,因为汇编语言与C等高级语言的学习过程
有了很大的差别,记得刚开始学习汇编语言时自己也很苦闷,因为始终不能理解象mov jmp这些
指令到底应该怎么用?于是花了1个月每天记一个指令的用法,然后反复的记忆,慢慢的才逐渐
形成了写汇编代码的概念,的确时间可以证明一切,希望想学习汇编语言的朋友不妨从不断的
写code来提升对汇编语言的熟悉,每天写一段汇编代码,记几个汇编指令,一般情况下一个月时
间应该会对汇编有所认知.
  但是仅仅的记住汇编指令,即时你可以书写简单的汇编代码,但始终不能提升对汇编应用上的
认识,建议大家在学会汇编的简单语法及熟悉基本指令后,自己写C代码然后对C代码进行逆向,
在这个过程中,一是可以提高自己的程序逆向能力,同时也可以提高对汇编的认识.因为技术发展
到今天,如果我们不搞纯粹的硬件底层开发,那么汇编语言的用途就体现在了逆向工程领域,通过
熟悉C到汇编的逆向技术,可以在以后搞软件破解技术 漏洞挖掘技术有很大的帮助,在没有源代码
可读的情况下,通过逆向程序来进行漏洞挖掘或破解软件就成了必要的环节,而能否能够熟练的读
懂逆向后的汇编代码也成了关键问题.所以多做逆向程序的做法会帮助大家积累很多的逆向经验,
从而使以后的工作更顺畅.
  个人建议的一些学习方法:
  A: 花一段时间熟悉汇编语言及写法,时间按照自己能力而定.
  B: 多进行程序逆向,开始可以是C到汇编的逆向,慢慢过渡到windows程序的逆向.
  C: 试着对以公布的漏洞进行逆向分析,并逐渐形成自己的思路.
  D: 破解软件也可以大幅度提升自己对汇编的认识.
 
--[ 总结
  汇编语言的知识不是本文能够解决的问题,本文只是一个概述性的文档,当然本文档也有很多不足
之处,希望得到大家的指正.
    由于最近看英文文档过多,导致自己写文字的表述能力大降.如果那里不了解,大家可以到
    bbs.cciss.cn的文档专区一起讨论该文档的缺点.