用户
搜索
  • TA的每日心情

    半小时前
  • 签到天数: 100 天

    连续签到: 1 天

    [LV.6]常住居民II

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    11

    主题

    38

    帖子

    685

    魔法币
    收听
    0
    粉丝
    21
    注册时间
    2017-12-31

    i春秋签约作者

    发表于 2018-8-9 16:41:39 739612
    本帖最后由 Crazyman_Army 于 2018-8-10 20:58 编辑

    本文属于原创文章,未经允许禁止转载

    0x00 前言

    1.本篇文章属于从零开始的程序逆向之路系列的附录部分 附录1 会对32位逆向中所离不开的32位汇编进行快速的入门,另外文章中有何错误可以在评论区积极的向笔者提出

    2.学习汇编语言有什么作用
    a.汇编语言是除了机器语言,能操作的最底层语言,而机器语言自然非常麻烦,所以笔者认为汇编语言是除了机器语言以外效率最快的语言
    b. 学习汇编语言会大致了解计算机底层的知识,了解CPU和内存,以及各种硬件如何配合,如何读取信息的,
    这样对于学习高级语言以及改程序bug的时候会有很好的效果
    c.汇编语言会适用于底层驱动开发以及嵌入式开发,工业控制,实时系统等等。
    d.学习逆向反编译的同学一定要去学会汇编语言,否则学起逆向会十分吃力,因为你根本看不懂程序的逻辑,更不要去想如何反编译了。

    3.知识会随着课程的推进而加入


    0x01 汇编语言的由来以及特点

    .什么是机器语言?


    机器语言是机器指令的集合,而机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码。机器指令通常由操作码和操作数两部分组成,操作码指出该指令所要完成的操作,即指令的功能,操作数指出参与运算的对象,以及运算结果所存放的位置等。


    所以机器语言的构成自然也就是01
    举个例子:

    [AppleScript] 纯文本查看 复制代码
    汇编语言:           push ax        ;把ax压入栈中
    机器语言(指令)   01010000
    

    那可以通俗来说就是人说CPU的语言,那对于我们来说就太残忍了,那自然我们学习的就不是机器语言了.
    用机器语言编写程序是早期经过严格训练的专业技术人员的工作,普通的程序员一般难以胜任,而且用机器语言编写的程序不易读、出错率高、难以维护,也不能直观地反映用计算机解决问题的基本思路。
    由于用机器语言编写程序有以上诸多的不便,现在几乎没有程序员这样编写程序了。
    自此汇编语言就慢慢进入了历史的舞台

    .什么是汇编语言?


    为了改善机器指令的可读性,选用了一些能反映机器指令功能的单词或词组来代表该机器指令,而不再关心机器指令的具体二进制编码。与此同时,也把CPU内部的各种资源符号化,使用该符号名也等于引用了该具体的物理资源。

    如此一来,令人难懂的二进制机器指令就可以用通俗易懂的、具有一定含义的符号指令来表示了,于是,汇编语言就有了雏型。

    我们称这些具有一定含义的符号为助忆符,用指令助忆符、符号地址等组成的符号指令称为汇编格式指令(或汇编指令)。
    汇编语言是汇编指令集(机器码的助记符,有相对应的机器码)、伪指令集(没有对应的机器码,由编译器执行,机器不执行)和使用它们规则
    (例如:+,-,*,/等运算符号由编译器执行,没有对应的机器码)的统称。



    举个例子:

    [AppleScript] 纯文本查看 复制代码
    机器指令:             1000100111011000
    汇编指令:             mov ax,bx
    

    这样程序员一看就知道是将寄存器bx的内容送到寄存器ax,这样既增强了程序的可读性又利于记忆和对汇编语言编写的程序进行维护

    .汇编语言的翻译过程

    image001.png

    如图,笔者自己画的,无奈笔者的画画不如大表姐的好,所以大家将就看吧,图中的流程也就是程序的汇编指令通过编译器翻译为CPU可以读取的机器码,但是汇编指令不可以直接被CPU读取。

    0x02 汇编语言的基本数据类型以及数据的表示方式

    说到语言就必须要考虑其数据类型与数据的表示方式,同样汇编也不例外,那我们先从汇编语言的基本数据类型开始介绍

    .基本数据类型

    汇编语言所用到的基本数据类型为:字节、字、双字等,这些数据类型在以后的章节中都有相应的类型说明符。下面对它们进行最基本的描述。

    注意: 1.字长是根据处理器单次处理数据的能力决定的
            2.本篇里面的情况适合于16位系统

    1.字节(Byte)

    一个字节有8位二进制组成,其最高位是第7位,最低位是第0位,如下图所示。在表示有符号数时,最高位就是符号位。

    通常情况下,存储器按字节编址,读写存储器的最小信息单位就是一个字节

    image003.png

    2、字(word)


      
    2个字节组成一个字(在16位系统下),其最高位是第15位,最低位是第0位。高8位称为高字节,低8位称为低字节,如下图所示。

      
    注意:字节和字是汇编语言程序中最常用的两种数据类型,也是最容易出错的数据类型。

    image005.png

    3、双字(dword)


      
    2个字(4个字节)来组成一个双字,其高16位称为高字,低16位称为低字,如下图所示。
      
    双字有较大的数据表示范围,它通常是为了满足数据的表示范围而选用的数据类型,也可用于存储远指针。

    image007.png

      
      
    4、四字(qword)
      
    4个字(8个字节)组成一个四字类型,它总共有64个二进制位,当然,也就有更大的数据表示范围,但在汇编语言中很少使用该数据类型。
      
    5、十字节
      
    10个字节组成一个十字节类型,它总共有80个二进制位。在汇编语言中很少使用该数据类型。
      
    6、字符串
      
    字符串是由若干个字节组成的,字节数不定,通常每个字节存储一个字符。该数据形式是汇编语言程序中经常使用的另一种数据形式。

      
    1qword=2dword=4word=8Byte=64bit  (比特)

      
    .数据的表示方式(由于笔者的编译器的MASM32,所以有些进制的特殊标志与同学的情况可能会有偏差.具体的情况还请各位同学去自己查询)

      
    1.二进制
      
    在计算机内,数值是用二进制来表示的,每个二进制数按权相加就可得到其十进制数值。在书写二进制时,为了区别,在数据后面紧跟一个字母B。
      
    二进制的一般表现形式为:bn-1…b1b0B,其代表数值:bn-12n-1+…+b121+b020。
      
    数据的二进制表示形式简单、明了,但它书写起来比较长,所以,通常情况下,我们在程序中不直接用二进制来书写具体的数值,而改用八进制、十进制或十六进制。

      
    2.八进制
      
    八进制是一种二进制的变形,三位二进制可变为一位八进制,反之也然。八进制的表示元素是:017。在书写时,为了区别,在数据后面紧跟一个字母Q。如:1234Q7654Q54Q等都是八进制。
      
    八进制数在程序中的使用频率不高。

      
    3.十进制
      
    十进制是我们最熟悉的一种数据表示形式,它的基本元素是:019。在书写时,为了区别,在数据后面紧跟一个字母D。在程序中经常用十进制来表示数据。

      
    4.十六进制
      
    十六进制是另一种二进制的变形,四位二进制可变为一位十六进制,反之也然。十六进制的基本元素是:019ABF(字母小写也可以),其中:字母ABF依次代表101115

      
    在书写时,为了区别,在数据后面紧跟一个字母H。当十六进制数的第一个字符是字母时,在第一个字符之前添加一个‘0’。如:100H56EFH0FFH0ABCDH等都是十六进制数。
      
    十六进制在程序中的使用频率很高。

      
    5.进制转化

      
    (1).十进制转二进制
      
    方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。
      
    然后将其余数倒序输出
      
    用图举个例子:

      
    image009.png


    (2). 八进制转成二进制
    方法为:八进制数先进行拆分,通过除2取余法,得到二进制数,对每个八进制为3个二进制,不足时在最左边补零。

    (具体用法如下图)

    image011.png

    当然也有例外比如八进制为226,其的二进制为多少呢?

    看下图:

      
    image013.png

      
    (3).十六进制转二进制

    方法为:十六进制数先进行拆分,然后通过对每个拆分烦人数进行除2取余法,得到二进制数,对每个十六进制为4个二进制,不足时在最左边补零。

    image015.png

    (具体用法如下图)

    image017.png

    (4).二进制转十进制
    方法为:把二进制数按权展开、相加即得十进制数。

    (具体用法如下图)

    image019.png

    (5).二进制转八进制
    方法为:3位二进制数按权展开再拼接得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)。

    (具体用法如下图)

    image021.png

    (6).二进制转十六进制
    方法:与二进制转八进制方法近似,八进制是取三合一,十六进制是取四合一。(注意事项:4位二进制转成十六进制是从右到左开始转换,不足时补0)。

    (具体用法如下图)

    image023.png

    (7). 十进制转八进制或者十六进制按照除8或者16取余,直到商为0为止。

    (具体用法如下图)

    image025.png

    (8).八进制或者十六进制转成十进制
    方法为:把八进制、十六进制数按权展开、相加即得十进制数。

    (具体用法如下图)


    image027.png

    其余的进制转化就通过先转为2进制再进行转化就OK了


    0x03 总结


    本篇文章讲述了汇编语言的由来,及其优点,讲述了关于汇编语言的数据类型和部分数据的表达方式,下篇文章继续讲解预备知识




    评分

    参与人数 2魔法币 +8 收起 理由
    jasonsid + 3 感谢你的分享,i春秋论坛有你更精彩!.
    cl058015 + 5 感谢你的分享,i春秋论坛有你更精彩!.

    查看全部评分

    学习一下~
    使用道具 举报 回复
    发表于 2018-8-10 00:23:33
    加油哦
    使用道具 举报 回复
    学习一下
    使用道具 举报 回复
    发表于 2018-8-14 08:47:23
    直接一本PDF会不会好点QAQ
    使用道具 举报 回复
    太基础了
    使用道具 举报 回复
    发表于 2018-8-22 10:45:38
    666666666666666666
    路漫漫,
    使用道具 举报 回复
    汇编里的基础精华
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册