freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

逆向分析教程(六)——CPU寄存器
dopromax 2022-03-02 15:28:56 221313
所属地 上海

CPU寄存器

寄存器(Register)是CPU内部用来存放数据的一些小型存储区域,它与我们常说的RAM(Random Access Memory,随机存储器、内存)略有不同。CPU访问(Access)RAM中的数据时要经过较长的物理路径,所以花费的时间要长一些;而寄存器集成在CPU内部,拥有非常高的读写速度。

IA-32寄存器

IA-32是英特尔推出的32位元架构,属于复杂的指令集架构,它提供了非常丰富的功能,并且支持多种寄存器。下面列出了IA-32支持的寄存器类型。

IA32寄存器类型

Basic program execution registers

×87 FPU registers

MMX registers

XMM registers

Control registers

Memory management registers

Debug registers

Memory type range registers

Machine specific registers

Machine check register

.....

以上寄存器列表中,我们先要学习基本程序运行寄存器(Basic program execution registers)的相关内容,这是程序调试中最常见的寄存器,是学习程序调试初级技术必须掌握的内容。对于其他的相信等大家过了新手期,也会慢慢遇到的。

基本程序运行寄存器

基本程序运行寄存器的组织结构由4类寄存器组成。

  • 通用寄存器(General Purpose Registers,32位,8个)

  • 段寄存器(Segment Registers,16位,6个)Q

  • 程序状态与控制寄存器(Program Status and Control Registers,32位,1个)

  • 指令指针寄存器(32位,1个)

1646202014_621f0c9ece73f1bcd8fe5.png!small?1646202014572

如上图所示,在寄存器名称缩写前添加字母E(Extend),表示该寄存器在16位CPU(IA-16)时就已经存在,并且其大小在IA-32下由原来的16位扩展为32位。

各类寄存器

顾名思义,通用寄存器是一种通用型的寄存器,用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。IA-32中每个通用寄存器的大小都是32位,即4个字节,主要用来保存常量与地址等,由特定汇编指令来操作特定寄存器。

1646202027_621f0caba6fba17ac1663.png!small?1646202027357

为了实现对低16位的兼容,各寄存器又可以分为高(H:high)、低(L:Low)几个独立寄存器。下面我们以EAX为例讲解。

  • EAX:(0-~31)32位

  • AX:(0~15)EAX的低16位

  • AH:(8~15)AX的高8位

  • AL:(0-~7)AX的低8位

若想全部使用4个字节(32位),则使用EAX;若只想使用2个字节(16位),只要使用EAX的低16位部分AX就可以了。AX又分为高8位的AH与低8位的AL两个独立寄存器。借助这种方式,可以根据不同情况把一个32位的寄存器分别用作8位、16位、32位寄存器。后面的程序调试中,我们分析汇编代码就能很容易地理解它们。

各寄存器的名称如下所示。

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

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

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

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

以上4个寄存器主要用在算术运算(ADD、SUB、XOR、OR等)指令中,常常用来保存常量与变量的值。某些汇编指令(MUL、DIV、LODS等)直接用来操作特定寄存器,执行这些命令后,仅改变特定寄存器中的值。此外,ECX与EAX也可以用于特殊用途。循环命令(LOOP)中,ECX用来循环计数(loop count),每执行一次循环,ECX都会减1。EAX一般用在函数返回值中,所有Win32API函数都会先把返回值保存到EAX再返回。

通用寄存器中其他几个寄存器的名称如下所示。

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

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

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

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

以上4个寄存器主要用作保存内存地址的指针。

ESP指示栈区域的栈顶地址,某些指令(PUSH、POP、CALL、RET)可以直接用来操作ESP(栈区域管理是程序中相当重要的部分,请不要把ESP用作其他用途)。EBP表示栈区域的基地址,函数被调用时保存ESP的值,函数返回时再把值返回ESP,保证栈不会崩溃(这称为栈帧(Stack Frame)技术,它是代码逆向分析技术中的一个重要概念,后面会详细讲解)。ESI和EDI与特定指令(LODS、STOS、REP、MOVS等)一起使用,主要用于内存复制。

到这里本来还需要介绍一下段寄存器,但是由于对于初学者学习这块内容较为困难,且暂时我们也用不到,等我们水平慢慢提升遇到这块内容之后,再补也不迟,所以这块内容我们在这里直接删减。对于寄存器,我们只需先了解上述8个通用寄存器的用途即可。如果想更多了解寄存器的相关知识点,建议回到开头,去看《汇编语言基于x86处理器》这本书,一定会让你晕头转向的!


# 逆向工程 # 逆向分析 # 逆向基础 # 逆向调试 # 逆向工程核心原理
本文为 dopromax 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
逆向分析系列教程
dopromax LV.5
  • 32 文章数
  • 344 关注者
JWT身份验证相关安全问题
2022-08-07
HTTPS单双向认证流程详解与联想
2022-03-08
逆向分析教程(七)——栈
2022-03-02
文章目录