吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 5573|回复: 76

[汇编] 第2章 汇编语言入门

  [复制链接]
大飞哥自习室 发表于 2022-3-22 12:18 | 显示全部楼层 |阅读模式


第一章介绍了基础的数据存储及表示形式,并且在OllyDbg中具体地查看了数据在内存中的形式。关于逆向,掌握逆向工具与掌握逆向知识是同等的重要,在学习逆向知识的时候配合工具一起去分析、去查看、去调试,这样的效果是最好的。当然,能更高效率、效果地进行逆向是开发自己个性化的逆向工具、插件等。
本章主要介绍关于汇编语言的知识,同样在介绍这些知识时是结合OllyDbg一起进行学习的。在OllyDbg中可以直观地观察寄存器、内存以及堆栈的变化。读过计算机专业的读者可能都清楚,当时在学校上汇编课程时,对于代码、寄存器、数据和堆栈的概念等都是在大脑中进行想象,即使是使用debug进行调试,也并不能很直观地将这些概念具体地展现出来。
通过本章的学习,笔者会将常用的汇编指令、关于堆栈的操作都介绍给读者,使读者可以快速地对汇编相关的知识有一个快速的了解,具体到以后的实际情况中,读者可以通过查询指令手册或帮助文档来进一步地深入学习。
本章关键字:汇编指令
2.1  x86汇编语言介绍
读者希望在逆向方面有一定发展的话,最好买一本关于汇编语言的书籍来进行学习。现在计算机专业毕业的学生都学过汇编语言,但是大部分人认为学的只是Intel 8086下的汇编指令,枯燥、乏味、不具备实用性。其实,作为汇编语言的入门,学习8086的汇编指令已经基本足够了。目前的硬件都是x86兼容架构的,无论多复杂的程序,最终都将成为x86指令。作为逆向的入门,只要掌握80x86的常用指令、寄存器的用法、堆栈的概念和数据在内存中的存储,基本就够用了。
对于入门,有以上要求就足够了。如果希望有深入的发展,对于汇编语言的学习还是要深入进行研究。本章站在逆向工程入门的起点,抛开各种复杂的原理及理论知识,只简单讲述x86常用的汇编指令的用法。当然,笔者依然是结合OllyDbg这款调试器来直观地介绍汇编语言,以让读者在学习的过程中能够清楚地了解汇编指令每一步都在做什么。
2.1.1寄存器
任何程序的执行,归根结底,都是存放在存储器里的指令序列执行的结果。寄存器用来存放程序运行中的各种信息,包括操作数地址、操作数、运算的中间结果等。下面就来熟悉各种寄存器。
1.CPU工作模式
x86体系的CPU有两种基本的工作模式,分别是实模式和保护模式。
实模式也称为实地址模式,实现了Intel 8086处理器的程序设计环境。该模式被早期的Windows 9x和DOS所支持,实模式下可以访问的内存为1MB,实模式可以直接访问硬件,比如直接对端口进行操作、对中断进行操作。现在的CPU仍然支持实模式,一是为了与早期的CPU架构保持兼容,二是因为所有的x86架构处理器都是从实模式引导起来的。
保护模式是处理器主要的工作模式,Linux和Windows NT内核的系统都工作在x86的保护模式下。保护模式下,每个进程可以访问的内存地址为4GB,且进程间是隔离的。
2.寄存器介绍
寄存器(Register)是CPU内部用于高速存储数据的小型存储单元,访问速度比内存快很多,而且价格也高很多(在单位价格内,寄存器的价格要比内存贵,内存要比硬盘贵),但是寄存器和内存都是用来存储数据的。CPU访问内存中的数据时有一个寻址的过程,因此访问内存花费的时间会长,寄存器是集成在CPU内部的,由于寄存器的数量少,因此每个寄存器有独立的名字,从而在访问时速度非常的快。
在x86寄存器中,与逆向相关的寄存器有基本寄存器、调试寄存器和控制寄存器。在本章要讲解的寄存器是基本寄存器。基本寄存器分为4类,分别是8个通用寄存器、6个段寄存器、1个指令指针寄存器和1个标志寄存器,如图2-1所示。
3.通用寄存器
通用寄存器主要用于各种运算和数据的传输。由图2-1可以看出,通用寄存器一共有8个,分为两组,分别是数据寄存器和指针变址寄存器。数据寄存器一共有4个,每个寄存器都可以作为一个32位、16位或8位的存储单元来使用,如图2-2所示。
fakename.png
对于图2-2来讲,可以将一个寄存器分别当8位、16位或32位来使用。EAX寄存器可以存储一个32位的数据。EAX的低16位有另外一个名字叫作AX,可以存储一个16位的数据。AX寄存器又可以分为AH和AL两个8位的寄存器,AH对应AX寄存器的高8位,AL对应AX寄存器的低8位。
只有数据存储寄存器可以按照这样的方式进行使用。由图2-1可知,数据存储寄存器有EAX、EBX、ECX和EDX共4个寄存器。
指针变址寄存器可以按照32位或16位进行使用,如图2-3所示。

33.jpg
对于图2-3来讲,只可以将一个寄存器分为32位或16位进行使用。ESI寄存器可以存储32位的指针,其中低16位可以表示为SI来存储16位的指针。但是无法像AX那样能拆分成高8位和低8位的8位寄存器。
各通用寄存器可以使用的方式如表2-1所列。

4444.jpg
关于8个通用寄存器的解释如下。
①EAX:累加器,在乘法和除法指令中被自动使用;在Win32中,一般用在函数的返回值中。
②EBX:基址寄存器,DS段中的数据指针。
③ECX:计数器,CPU自动使用ECX作为循环计数器,在字符串和循环操作中常用,在循环指令(LOOP)或串操作中,ECX用来进行循环计数,每执行一次循环,ECX都会被CPU自动减一。
④EDX:数据寄存器。
以上4个寄存器主要用在算数运算与逻辑运算指令中,常用来保存各种需要计算的值。⑤EBP:扩展基址指针寄存器,SS段中堆栈内数据指针。EBP由高级语言用来引用参数和局部变量,通常称为堆栈基址指针寄存器。
⑥ESP:堆栈指针寄存器,SS段中堆栈指针。ESP用来寻址堆栈上的数据,ESP寄存器一般不参与算数运算,通常称为堆栈指针寄存器。
⑦ESI:源变址寄存器,字符串操作源指针。
⑧EDI:目的变址寄存器,字符串操作目标指针。
以上4个寄存器主要用作保存内存地址的指针。
ESI和EDI通常用于内存数据的传递,因此才被称为源指针寄存器和目的指针寄存器。ESI和EDI与特定的指令LODS、STOS、REP、MOVS等一起使用,主要用于内存中数据的复制。
ESP指示堆栈区域的栈顶地址,PUSH、POP、CALL、RET等指令可以直接用来操作ESP指针。EBP指示堆栈区域的基地址。
4.指令指针寄存器
指令指针寄存器EIP是一个32位的寄存器,在16位的环境中,它的名称是IP。EIP寄存器保存着下一条要执行的指令的地址。程序运行时,CPU会读取EIP中的一条指令的地址,传送指令到指令缓冲区后,EIP寄存器的值自动增加,增加的大小即是读取指令的字节大小,即下一条指令的地址为当前指令的地址加上当前指令的长度。这样,CPU每次执行完一条指令后,就会通过EIP寄存器读取下一条指令给CPU,从而让CPU继续执行。
特殊情况(其实也算不上通常与特殊,因为存在向上或向下的跳转,所以程序的执行并非是顺序依次往下执行)是当前指令为一条转移指令,比如JMP、JE、LOOP等指令,会改变EIP的值,导致CPU执行指令产生跳跃性执行,从而构成分支与循环的程序结构。
EIP寄存器的值在程序中是无法直接修改的,只能通过影响EIP的指令间接地进行修改,比如上面提到的JMP、CALL、RET等指令。此外,通过中断或异常也可以影响EIP的值。
EIP中的值始终在引导CPU的执行。
5.段寄存器
段寄存器用于存放段的基地址,段是一块预分配的内存区域。有些段存放有程序的指令,有些则存放有程序的变量,另外还有其他的段,如堆栈段存放着函数变量和函数参数等。在16位CPU中,段寄存器只有4个,分别是CS(代码段)、DS(数据段)、SS(堆栈段)和ES(附加数据段)。
在32位的CPU中,段寄存器从4个扩展为6个,分别是CS、DS、SS、ES、FS和GS。FS和GS段寄存器也属于附加的段寄存器。
666.jpg
6.标志寄存器
在16位CPU中,标志寄存器称为FLAGS(有的书上是PSW,即程序状态字寄存器)。在32位CPU中,标志寄存器也扩展为32位,被称为EFLAGS。关于标志寄存器,16位CPU中的标志寄存器已经基本满足于日常的程序设计及逆向所用,这里主要介绍16位CPU中的标志位。标志寄存器如图2-4所示。

777888.jpg 图2-4说明,标志寄存器中的每一个标志位只占1位,且16位的标志寄存器并没有全部使用。16位的标志寄存器可以分为两部分,分别是条件标志和控制标志。
条件标志寄存器说明如下:
①OF(OverFlow Flag):溢出标志位,用来反映有符号数加减法运算所得结果是否溢出。如果运算超过当前运算位数所能表示的范围,则称为溢出,该标志位被置为1,否则为0。
②SF(Sign Flag):符号标志位,用来反映运算结果的符号位。运算结果为负时为1,否则为0。
③ZF(Zero Flag):零标志位,用来反映运算结果是否为0。运算结果为0时该标志位被置为1,否则为0。
④AF(Auxiliary carry Flag):FZ进位标志位。在字操作时,发生低字节向高字节进位或借位时该标志位被置为1,否则为0(注意:在字节操作时,发生低4位向高4为进位或借位时该标志位被置为1,否则为0)。
⑤PF(Parity Flag):奇偶标志位,用于反映结果中“1”的个数的奇偶性。如果“1”的个数为偶数,该标志位被置为1,否则为0。
⑥CF(Carry Flag):进位标志位。运算结果的最高位产生了一个进位或借位,则该标志位被置为1,否则为0。
控制标志寄存器说明如下:
①DF(Direction Flag):方向标志位,用于串操作指令中,控制地址的变化方向。当DF为0时,存储器地址自动增加;当DF为1时,存储器地址自动减少。操作DF标志寄存器可以使用指令CLD和STD进行复位和置位。
②IF(Interrupt Flag):中断标志位,用于控制外部可屏蔽中断是否可以被处理器响应。当IF为1时,允许中断;当IF为0时,则不允许中断。操作IF标志寄存器可以使用CLI和STI进行复位和置位。
③TF(Trap Flag):陷阱标志位,用于控制处理器是否进入单步操作方式。当TF为0时,处理器在正常模式下运行;当TF为1时,处理器单步执行指令,调试器可以逐条指令进行执行就是使用了该标志位。
在日常使用的过程中,以上的标志位都是常用的标志位,在学习标志位时要掌握标志位每一位的作用以及该标志位在第几位。
注意:16位CPU中的标志位在32位CPU中依然继续使用,32位CPU扩展了4个新的标志位。


222.png
222.png

评分

参与人数 23HB +23 THX +7 收起 理由
黑暗是小白 + 2
花盗睡鼠 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
消逝的过去 + 1
后学真 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
taobao199010 + 2
风里去 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
taykey + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
凌夏随缘 + 1
louhaihua + 2 + 1
情绪马 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
agan8888 + 1
丑丑 + 1
武清一点点 + 1
wq180029819 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
轻歌 + 1
罗密欧 + 1
temp + 1
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
空白001 + 1
ldljlzw + 1
wbxs2077 + 2 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
一蓑烟雨 + 1 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
成丰羽 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
YME8 发表于 2022-3-22 12:18 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
JeBvf102 发表于 2022-3-22 12:19 | 显示全部楼层

前来向大佬学习
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
YVQOH0948 发表于 2022-3-22 12:29 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
oreSazOjKWX 发表于 2022-3-22 13:40 | 显示全部楼层

感谢楼主
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
pHDonSI 发表于 2022-3-22 13:57 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
aVksWF94 发表于 2022-3-22 13:59 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
FDQLVPn 发表于 2022-3-22 14:07 | 显示全部楼层

威武霸气!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
vDyxMg0629 发表于 2022-3-22 14:28 | 显示全部楼层

谢谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
XxrIL25901 发表于 2022-3-22 14:45 | 显示全部楼层

刚好需要 谢谢大佬
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

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