逆向工程核心原理笔记(三)——IA-32寄存器

逆向工程核心原理笔记(三)——IA-32寄存器

英特尔 32 位架构:IA-32(Intel Architecture, 32-bit缩写为 IA-32),通常被称为 i386,或 x86,是由英特尔公司于 1985 年推出的指令集架构,它是 8086 架构的延伸版本,可以支持 32 位运算,被首次运用在 Intel 80386 芯片中。

CPU寄存器

首先我们来了解什么是 CPU 寄存器:寄存器是 CPU 内部用来存放数得一些小型存储区域,和常说的 RAM(内存)略有不同,CPU 访问 RAM 中的数据的时候需要经过较长的物理路径,所以在访问的时候需要的时间会较长,而寄存器集成在 CPU 内部,读写速度很高。

IA-32寄存器

IA-32寄存器属于复杂的指令集架构,它提供了非常丰富的功能,并且支持多种寄存器。

基本程序运行寄存器的组织结构,主要有四类寄存器组成:

​ 通用寄存器(Ceneral Purpose Registers,32位,8个)

​ 段寄存器(Segment Register,16位,6个)

​ 程序状态于控制寄存器(Program Status and Control Register,32位,1个)

​ 指令指针寄存器(Instruction Pointer,32位,1个)

接下来介绍各种寄存器:

1.通用寄存器

通用寄存器是一种通用型的寄存器,用于传送和暂存数据,也可以参与学术逻辑运算,并保存运算结果。IA-32 中每个用用寄存器的大小都是 32 位,即四个字节,主要用来保存常量和地址等等,通常由特定的汇编指令类操作特定的寄存器,除了常规用途,某些寄存器还具有一些特殊功能,各个寄存器的名称如下所示:

​ EAX:(针对操作数和结果数据的)累加器

​ EBX:(DS段中的数据指针)基址寄存器

​ ECX:(字符串和循环操作的)计数器

​ EDX:(I/O指针)数据寄存器

通常上面的几个寄存器主要被用于算术运算(ADD , SUB , XOR , OR等)指令中,通常用来保存常量和变量的值,某些汇编指令(MUL , DIV , LODS)直接用来操作特定的寄存器,执行这些命令后,仅仅高边特定寄存器中的值。

此外,ECX 和 EAX 也可以被用于特殊用途,在循环命令(LOOP)中,ECX 被用于循环计数,每执行一次循环 ECX 减一,EAX 通常用于函数返回值中,所有 Win32 API 函数都会先把返回值保存在 EAX 在进行返回。

通用寄存器中其他几个寄存器的名称如下:

​ EBP:(SS段中栈内数据指针)扩展基址指针寄存器

​ ESI:(字符串操作源指针)源变址寄存器

​ EDI:(字符串操作目标指针)目的变址寄存器

​ ESP:(SS段中栈指针)栈指针寄存器

上面四个寄存器主要被用作保存内存地址的指针。

ESP 指示栈区域的栈顶地址,某些指令(PUSH , POP , CALL , RET)可以直接被用来操作 ESP (栈区域管理是程序中相当重要的部分)

EBP 表示栈区域中的基地址,函数被调用的时候保存 ESP 的值,函数返回时再把值返回 ESP,保证栈不会崩溃,这被称为栈帧技术。ESI 和 EDI 与特定指令(LODS , STOS , REP , MOVS)一起使用,主要用于内存的复制

2.段寄存器

段:在 IA-32 的保护模式中,段是一种内存保护技术,它把内存划分为多个区段,并为每个区段赋予了初始地址,范围,访问权限等等,用来保护内存,此外它还同分页技术一起用于将虚拟内存变更为实际的物理内存,段内存记录在 SDT(Segment Descriptor Table,段描述符表) 中,而段寄存器就持有这些 SDT 的索引。

各段寄存器的名称如下:

​ CS:Code Segment ,代码段寄存器

​ SS:Stack Segment ,栈段寄存器

​ DS:Data Segment ,数据段寄存器

​ ES:Extra(Data) Segment,附加(数据)段寄存器

​ FS:Data Segment,数据段寄存器

​ GS:Data Segment,数据段寄存器

3.程序状态与控制寄存器

EFLAGS:Flag Register,标志寄存器

IA-32 中标志寄存器的名称为 EFLAGS,其大小为 4 个字节(32位),由原来的16位 FLAGS 寄存器扩展而来,EFALGS 寄存器的每一位都有意义,每位的值或为1或为0,代表 True/False ,其中有一些位由系统直接进行设定, 有一些位这是通多程序命令的执行结果进行设置, 通常需要掌握三个与程序调试相关的标志,ZF(Zero Flag,零标志),OF(Over Flag,溢出标志),CF(Carry Flag,进位标志)

​ ZF:如果运算结果位0,则其值位1,否则其值位0

​ OF:有符号整数溢出时,OF值被置为1,此外 MSB 被改变时,其值也被设为1

​ CF:无符号整数溢出时,其值也被置为1

4.指令指针寄存器

EIP:Instruction Pointer,指令指针寄存器

指令指针寄存器保护着 CPU 要执行的指令地址,其大小为 32 位(4个字节),由原16位IP寄存器扩展而来,程序运行的时候,CPU 会读取 EIP 中一条指令的地址,传送指令到指令缓冲区后,EIP 寄存器的值会自动增加,增加的大小即是读取指令的字节大小,这样,CPU 每次执行完一条指令,就会通过 EIP 寄存器读取并执行下一条指令。

与通用寄存器不同,我们不能直接修改 EIP的值,只能通过其他指令间接修改,这些特定的指令包括 JMP,JCC,CALL,RET。此外,我们还可以通过终端或一场来修改 EIP 的值。

猜你喜欢

转载自blog.csdn.net/a1351937368/article/details/106007279