-
通用返回_寄存器——通用寄存器
2021-01-13 09:12:56寄存器是什么?就像人的正常生活需要吃喝拉撒,一个程序的运行也需要各方面的东西,如堆、栈和寄存器,今天首先谈一下寄存器。...汇编代码操作寄存器逆向与寄存器的py关系?在平常的逆向分析当中,读懂汇编代...寄存器是什么?
就像人的正常生活需要吃喝拉撒,一个程序的运行也需要各方面的东西,如堆、栈和寄存器,今天首先谈一下寄存器。如果使用过OD、x64dbg之类的调试器,可以发现汇编代码中大多是对寄存器进行操作。为什么要使用它?这是由于寄存器属于CPU中的一块存储区域,拥有着非常高的读写速度,而程序运行最重要的就是快(和男人不一样)。
汇编代码操作寄存器 逆向与寄存器的py关系?
在平常的逆向分析当中,读懂汇编代码是非常重要的,而汇编代码中的寄存器又扮演着非常重要的角色,每个寄存器中的值又代表了不同的含义。所以对寄存器有了基本的理解后,对逆向分析是有很大帮助的。
寄存器结构
前面瞎掰了那么多,这里首先看一下寄存器的结构。下图一以64位寄存器rax为例,其中0到31就是平常分析32位程序是常见的eax,0到15则是ax,而ah和al则分别是8到15和0到7。看到这里可能有点晕,这个的东西重点在那里?其实只要知道汇编指令中取ax、ah这些值时,获取的是那一部分数据就行,如下图二。
RAX寄存器结构 rax寄存器各部分的值 通用寄存器
逆向分析中常见的寄存器有4种:通用寄存器、段寄存器、标志位寄存器和指令指针寄存器。今天主要讲的是32位下的通用寄存器,下面列出了各个寄存器的名称。
- EAX:(针对操作数和结果数据的)累加器 ,返回函数结果
- EBX:(DS段中的数据指针)基址寄存器
- ECX:(字符串和循环操作数)计数器
- EDX:(I/O指针)数据寄存器
- EBP:(SS段中栈内数据指针)扩展基址指针寄存器
- ESI:(字符串操作源指针)源变址寄存器
- EDI:(字符串操作目标指针)目的变址寄存器
- ESP:(SS段中栈指针)栈指针寄存器
上面对寄存器进行了简单的解释,不过对这种抽象的东西,还是用一个实例来梳理一下。下面编译环境为VS2015-x86-debug
#include<stdio.h> #include<Windows.h> int main() { LPVOID lpAddress; char *string = "GeekFZ_QKSword"; lpAddress = VirtualAlloc(NULL, 0x100, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE); if (lpAddress == NULL) { printf_s("VirtualAlloc failed!"); return 0; } memcpy(lpAddress, string, 0x15); return 0; }
对于eax寄存器,最主要的就是知道它保存的是函数的返回值。如图下所示,调用了函数VirtualAlloc并返回值lpAddress,最后判断lpAddress这个值是否成功获取。对应的汇编代码注释处可以看到相同的逻辑,而汇编中用来保存返回值的就是eax寄存器。
源码和反编译代码1 对于ecx,edx,esi和edi则可以在我们memcpy函数实现中找到,memcpy函数就是把第二个参数地址的值复制到第一个参数的地址处,看一下核心实现处。其中esi是源地址寄存器,指向了string;edi是目的地址寄存器,指向了lpAddress;edx是数据寄存器,用于保存要复制的数据;ecx作为计数器,保存了要复制数据的大小。
源码和反编译代码2 细心的你可能发现,我们这里主要讲了寄存器eax,ecx,edx,esi和edi。对于ebx,ebp和esp却没有提到,其中ebx找了半天也没找到对应的实例,大家就靠名字“数据指针基址寄存器”去天人感应一下,而ebp和esp则在栈那部分讲会比较清晰。
参考
《逆向工程核心原理》
-
寄存器
2017-06-29 10:07:47寄存器属于CPU的一个组成部分而缓存只是集成到CPU封装内完全...寄存器分通用寄存器 标志寄存器 堆栈寄存器等完成CPU的加法运算,缓存是缓冲存储器,属于静态电路存储器。 对于寄存器的容量: 16位寄存器组 16位CPU所含寄存器属于CPU的一个组成部分而缓存只是集成到CPU封装内完全是和CPU独立的器件。另外二者速度相差很大,寄存器存取速度最快 其次缓存最后是内存。三张容量上的关系就像饭碗、饭锅和米缸的关系,容量越大级别越低,速度越慢与CPU的联系越不密切。寄存器分通用寄存器 标志寄存器 堆栈寄存器等完成CPU的加法运算,缓存是缓冲存储器,属于静态电路存储器。
对于寄存器的容量:
16位寄存器组
16位CPU所含有的寄存器有
4个数据寄存器(AX、BX、CX和DX)
2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP)
4个段寄存器(ES、CS、SS和DS)
1个指令指针寄存器(IP) 1个标志寄存器(Flags)
32位寄存器组
32位CPU除了包含了先前CPU的所有寄存器,并把通用寄存器、指令指针和标志寄存器从16位扩充成32位之外,还增加了2个16位的段寄存器:FS和GS。
32位CPU所含有的寄存器有
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志(
OF: 溢出标志位OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0.
DF: 方向标志DF位用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
IF: 中断允许标志IF位用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
TF: 状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变
SF: 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
ZF: 零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
AF: 下列情况下,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
PF: 奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
CF: 进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。) -
特殊寄存器ABC(C是位寄存器)
2019-07-17 14:44:38 -
IA32过程调用寄存器的保护规则
2017-03-14 10:56:09看CSAPP p151-152产生的疑问 ... (节选) 偷偷懒我就不写寄存器前面的百分号了O(∩_∩)O) ...edx ecx这两个也是属于调用者保存寄存器,并且 属于通用寄存器,可以随意保存数据,没有 什么特定的 限制。 ...看CSAPP p151-152产生的疑问
转自:http://www.2cto.com/os/201408/323797.html
(节选)
偷偷懒我就不写寄存器前面的百分号了O(∩_∩)O)
eax 这个寄存器属于调用者保存寄存器,通常用来存储一些函数的返回值
edx ecx这两个也是属于调用者保存寄存器,并且 属于通用寄存器,可以随意保存数据,没有 什么特定的 限制。
ebx edi esi这三个寄存器属于被调用者保存寄存器。通常来说edi 和 esi可能会保存一些被调用函数的参数。
这里要说明一下一个概念,就是我很疑惑的,什么叫做调用者保存寄存器,什么叫做被调用者保存寄存器。
寄存器按照规则被分类了,左面的三个寄存器是调用者负责保存,右边三个寄存器是被调用者负责保存。也就是说,在过程调用的时候,如果被调用者程序会覆盖左边三个寄存器的内容,那么,如果这三个寄存器内容在过程调用结束之后还要用到没调用过程之前的那个数值的话,就要有人在过程调用发生之前保存这个寄存器里面的数值,但是由谁来保存呢?只能由调用者去保存,也就是说,被调用者是不会管你这里面有什么重要的数据的,他拿过来就用,但是调用者如果需要这里面的数据,就要自己提前保存。说的再直白一点,就是寄存器是任何程序都可以随便用的,但是里面数据的保存工作就是有责任人的。左边三个寄存器的责任人是调用者,右边三个寄存器的责任人是被调用者。
(.....)
1 #include 2 #include 3 #define TYPE_MIN INT_MIN 4 typedef int type_i; 5 typedef struct return_t 6 { 7 int left; 8 int right; 9 type_i sum; 10 } return_type; 11 return_type find_max_crossing_subarray(type_i *A,int low,int mid,int high) 12 { 13 type_i left_sum=TYPE_MIN; 14 type_i sum=0; 15 int i; 16 int max_left; 17 for(i=mid;i>=low;i--) 18 { 19 sum+=A[i]; 20 if(sum>left_sum) 21 { 22 left_sum=sum; 23 max_left=i; 24 } 25 } 26 type_i right_sum=TYPE_MIN; 27 sum=0; 28 int max_right; 29 for(i=mid+1;i<=high;i++) 30 {
-
8086变址寄存器
2016-10-06 22:19:17或者是用于某组存储单元开始地址的偏移,即作为存储器指针使用,当然,由于变址寄存器和指针寄存器都是属于通用寄存器, 所以它们也可以保存算术结果或者说是具有暂存数据的功能,但是因为它们不是数据寄存器,... -
寄存器、CPU缓存内存的关系
2013-06-17 14:08:53寄存器属于CPU的一个组成部分而缓存只是集成到CPU封装内完全...寄存器分通用寄存器 标志寄存器 堆栈寄存器等完成CPU的加法运算,缓存是缓冲存储器,属于静态电路存储器。 对于寄存器的容量: 16位寄存器组 16位CP -
SPARC V8 体系结构之寄存器介绍
2013-03-15 23:39:46SPARC V8 体系结构之寄存器介绍 SPARC介绍 SPARC 指令集是属于精简指令集(RISC)家族的一员。...IU中的通用寄存器被称为r register,FPU中的通用寄存器被称为f register。 IU的控制寄存器包括 ü Pr -
iOS arm64汇编中寄存器和基本指令
2018-05-03 16:46:58iOS汇编(汇编语言依赖于机器) ...通用寄存器 64bit的:x0~x28,29个寄存器每个寄存器都是64位的,64位就是8 个字节,一个寄存器最多能放8个字节的数据 32bit的:w0~w28(属于x0~x28的低32bit) 4个字节 x0~x7... -
第五章:下列各部件中不属于控制器的部件是( )。
2020-12-16 18:35:19下列各部件中不属于控制器的部件是( )。 A.指令寄存器IR B....C.时序电路D....状态字寄存器PSW属于运算器部分,参考CPU模型图 ...运算器由算术逻辑单元、通用寄存器、数据缓冲寄存器DR,和状态字寄存器PSW组成。 ... -
一步步点亮LED2_数据手册查阅及相关寄存器浏览
2016-03-26 21:59:26《朱老师物联网大讲堂》学习笔记 上一节,老师带我们分析了LED的硬件特性,硬件的分析就到这里了, ...它属于一种芯片的引脚,可以编程控制它的工作模式和电压等, 慢着,在这里可不能忘记 -
部件的透明性
2015-12-04 23:56:123、通用寄存器 4、中断字寄存器 5、乘法器 6、先行进位链 所谓透明实际上指那些不属于自己管的部分,在计算机系统中,下层机器级的概念性结构功能特性,对上层机器语言的程序员是透明的。汇编程序员在编程的... -
QT开发(十)—— C++/Qt 开发过程中的一些技巧性总结
2018-05-08 19:03:52我会不定期的把我发现的一些小...register:存放在通用寄存器中 extern:在所有函数和程序段中都可以引用 static:在内存中时以固定地址存放的,在整个程序运行期间都有效 2.显示转换操作符 static_case dynameic_ca -
计算机组织结构 随笔 【2】
2020-06-12 21:39:02我们的指令无非就是围绕着操作数转的,所以分为堆栈指令系统,累加器指令系统,通用寄存器指令系统,但目前堆栈和累加器这两种指令系统已经被淘汰了,当前都是通用寄存器指令系统。 那么在通用寄存器指令系统中,也... -
arm64入栈出栈_栈_ARM64_003
2020-12-29 02:23:58栈栈:是一种具有特殊的访问方式的存储空间(后进先出, Last In Out Firt,LIFO)SP和FP寄存器sp寄存器在任意时刻会保存我们栈顶的地址.fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈底的... -
初识汇编(三)
2018-05-16 10:49:39fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈底的地址!() 注意:ARM64开始,取消32位的 LDM,STM,PUSH,POP指令! 取而代之的是ldr\ldp str\stp ARM64里面 对栈的操作是16字节对齐的!! ... -
函数本质
2018-04-20 14:30:58栈是一种具有特殊的访问方式的存储空间(后进先出, Last In Out Firt,LIFO)SP(stack pointer)和FP寄存器sp寄存器在任意时刻会保存我们栈底的地址.fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用... -
栈
2018-04-25 22:38:58栈 栈:是一种具有特殊的访问方式的存储...fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈底的地址!() 注意:ARM64开始,取消32位的 LDM,STM,PUSH,POP指令! 取而代之的是ldr\ldp str\st... -
2019年上半年 数据库系统工程师 上午试卷 综合知识 软考真题【含答案和答案解析】
2021-02-25 05:45:22通用寄存器 2. DMA控制方式是在( )之间直接建立数据通路进行数据的交换处理。 A. CPU与主存 B. CPU与外设 C. 主存与外设 D. 外设与外设 3. 在计算机的存储系统中,( )属于外存储器。 A. 硬盘 B. 寄存器... -
5.1 习题(20)
2020-06-05 07:57:43通用寄存器不是一开始就有功能的,需要编写技术逻辑与移位逻辑 本身不一定具备 通用寄存器是可编程的多功能寄存器 6, 标志寄存器PWR,FR是运算器的一部分,有当前指令执行结果的状态信息 控制信息:允许中断,有中断... -
066.矩阵行求和
2020-06-04 12:53:49值得注意的是,带参宏中使用了通用寄存器,为了不导致因为宏内部的逻辑使得外部的寄存器发生变化,这里将其保存在栈中。宏中所涉及到的参数最终都保存在通用寄存器中以供调用。在宏里面,属于局部的变量,标号需要... -
汇编学习6
2020-05-14 12:18:13寄存器的扩展 原有的AX,BX,CX,DX,SI,DI,BP,SP 通用寄存器,扩展成32位,在汇编语言中,用EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP来表示。 扩展后的通用寄存器具有一定的兼容性,可以在32位处理器上运行16位的软件。 每个... -
NiosII CPU的结构与编程模型
2009-12-04 14:28:00NiosII CPU的结构与编程模型NiosII CPU属于典型的RISC CPU,其特点是:结构简洁、指令集简练、指令等长、具有大量的通用寄存器。下图为NiosII的结构框图。 NiosII CPU由若干基本模块和一系列可选模块构成。基本模块... -
MIPS汇编指令集
2016-03-30 16:55:37MIPS汇编MIPS指令集 MIPS指令集属于精简指令集 MIPS的所有指令都是32位,指令格式简单,而X86的指令...MIPS有32个通用寄存器REG,为什么是32个而不是更多呢? 因为更多的寄存器需要更多的指令空间对寄存器编 -
i386体系结构
2012-05-15 20:54:20所谓的32位、64位CPU指的是CPU的算术逻辑单元通用寄存器的位数。 Intel公司的80386是一个里程碑式的产品,之后的486、Pentium、Pentium II虽然在性能上有不小的改进,但都属于同一种体系结构,统称为i386结构。 ... -
【学习记录】汇编基础知识的学习
2016-08-09 21:25:18x86,51,arm7以及以前的版本都属于冯·诺依曼体系结构,arm9以后的版本都属于哈佛体系结构,运行效率更高,汇编语言的原理和编程思想都是一样的,首先要掌握处理器的体系结构,了解其工作过程,然后就可以编写汇编... -
C++变量的存储类型
2013-04-15 17:04:58上海应用技术学院计算机科学与信息工程系 ...——存放在通用寄存器中。 •extern存储类 ——在所有函数和程序段中都可引用。 •static存储类 ——在内存中是以固定地址存放的,在整个程序运行期间都有效。 -
这24个C++的基础概念知识,你都学完了吗?
2020-11-28 21:48:522.register存储类型:存放在通用寄存器中 3.externa存储类型:所用函数和程序段中都可以引用 4.static存储类型:在内存中是以固定地址存放的,在整个程序运行期间都有效。 2、什么是内联函数,它有那些特点? 定义时...
-
视频转换器WonderFox便携注册版 UI界面好看.rar
-
Docker从入门到精通
-
银行上班时间
-
交换排序算法-----快速排序
-
华为机试题之字符串分隔
-
网上行销原则.txt
-
Samba 服务配置与管理
-
光伏并网matlab仿真模型.zip
-
【RabbitMQ】消息可靠性投递(三)Queue存储消息
-
Unity RUST 逆向安全开发
-
STL 容器的常用操作(未完成)
-
认识registerActivityLifecycleCallbacks
-
apache-jmeter-2.9.7z
-
MySQL用LIKE特殊字符搜索
-
【RabbitMQ】消息可靠性投递(二)Exchange->Queue
-
FFmpeg4.3系列之16:WebRTC之小白入门与视频聊天的实战
-
Leetcode刷题笔记
-
jupyter的使用.txt
-
C/C++反汇编解密
-
零基础一小时极简以太坊智能合约开发环境搭建并开发部署