freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

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

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

FreeBuf+小程序

FreeBuf+小程序

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

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处理器》这本书,一定会让你晕头转向的!


# 逆向工程 # 逆向分析 # 逆向基础 # 逆向调试 # 逆向工程核心原理
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录