软件逆向基础——寄存器
最近沉迷手游,感觉抽卡出货率太坑,含泪弃之;转战单机游戏,通关一遍后想体验开金手指的快感。别人做的修改器没意思,于是想自己试试。做这个笔记的同时希望也能对对此感兴趣的朋友们有所帮助。
进入正题。
首先是寄存器的分类:
·通用寄存器
·变址寄存器
·指针寄存器
·段寄存器
·指令指针寄存器
·标志寄存器
(一些寄存器可以作为通用寄存器;还有一些不行,比如标志寄存器)
通用寄存器:EAX、EBX、ECX、EDX
·EAX累加器(Accumulator):累加器可用于乘、除、输入/输出等操作,它们的使用频率很高
·EBX基地址寄存器(Base Register):可用来存储指针等内容
·ECX计数寄存器(Count Register):在循环和批量字符串操作时,要用它来控制循环次数
·EDX数据寄存器(Data Register):在进行乘、除运算时,它作为默认的操作数参与运算,也用于存放I/O的端口地址
·补充说明:数据寄存器主要用来保存参与运算的数(操作数)和运算结果等信息
变址寄存器:ESI、EDI
·ESI——源变址寄存器,EDI——目的变址寄存器
·主要用于:存放数据在内存中的偏移量,用来访问存储在内存中的数据,一般与字符串批量操作有关,例如:将内存中的一个字符串复制到内存中的另外一个位置
·可以作为通用寄存器
·在字符串批量处理指令中,ESI用作源字节串地址;EDI用作目的字节串地址,这是有明确定义的,不能搞混
指针寄存器:ESP、EBP
·这两个寄存器与栈相关
·栈被划分为一个个大小不一的栈帧
·ESP栈指针寄存器(extended stack pointer):存放一个指针,该指针永远只想栈最上面一个栈帧的栈顶
·EBP基址指针寄存器(extended base pointer):其内存放一个指针,该指针永远指向栈最上面
一个栈帧的底部
段寄存器:CS、SS、DS、ES、FS、GS
·段寄存器的产生源于Intel 8086 CPU体系结构中数据总线与地址总线的宽度不一致(其原因受制于当时的工艺,数据总线的宽度小于地址总线的的宽度,即单个寄存器所能找到的内存地址范围小于实际的内存地址范围,为了解决这个问题,产生了段寄存器)
·类似固话需要添加区号:用一个寄存器表示访问的区域,另一个寄存器去找具体位置
指令指针寄存器:EIP
·用来存储CPU要读取指令的地址,CPU通过EIP寄存器所指示的位置读取即将要执行的指令。每次CPU执行完响应的汇编指令后,EIP寄存器的值就会自动增加
·EIP是一个很重要的寄存器,它控制了CPU下一步要执行哪一条命令,因此为了计算机的安全,EIP无法通过MOV等指令修改,只能通过JMP、CALL等指令进行修改
·在系统漏洞发掘过程中,要证明一个漏洞可用,基本的方法就是控制EIP使其能够只想自己提供的代码,劫持系统的正常执行流程
标志寄存器:EFLAGS
·主要用于反应处理器的状态和指令运算结果的某些特征
·进位标志(CF):用于反映运算是否产生进位或借位。如果运算结果的最高位产生一个仅为或借位,则CF置1,否则置0
·零标志(ZF):用于判断结果是否为0。运算结果0,ZF置1,否则置0
·溢出标志(OF):反映有符号数加减运算是否溢出。如果运算结果超过了有符号数的表示范围,则OF置1,否则置0