寄存器是什么?

就像人的正常生活需要吃喝拉撒,一个程序的运行也需要各方面的东西,如堆、栈和寄存器,今天首先谈一下寄存器。如果使用过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则在栈那部分讲会比较清晰。

寄存器之通用寄存器(一)相关推荐

  1. 详细解读ARM寄存器之CPSR

    详细解读ARM寄存器之CPSR 一.CPSR概述 ARM处理器共有37个寄存器.这37个寄存器按其在用户编程中的功能划分,可分为2类寄存器,即31个通用寄存器和6个状态寄存器.这6个状态寄存器在ARM ...

  2. 永宏PLC 寄存器之Modbus地址映射

    永宏PLC 寄存器之Modbus地址映射 遵循modbus标准,格式依据www.modbus.org 映射分5码.6码. 使用FBs-CM5EH组modbus服务. 1.代码转换规则 2.转换范围(5 ...

  3. 汇编寄存器之内存访问

    1.内存中字的存储:   在CPU中用一个16位寄存器来存储一个字, 高8位存高字节,低8位存低字节 如AX寄存器存在一个字,那么AH存高字节,AL存低字节 在内存中存储字时是用两个连续的字节来存储字 ...

  4. arm寄存器之r14,r15

    (1)PC是程序计数器,存储将要执行的指令地址 (2)LR是链接寄存器,是ARM处理器中一个有特殊用途的寄存器,当调用函数时,返回地址即PC的值被保存到LR中(mov lr,pc). (3)IR是指令 ...

  5. STM32基础学习笔记寄存器之GPIO(1)

    文章目录 关于GPIO寄存器配置心得 1.寄存器知识 1.1 寄存器主要类型 1.2 寄存器功能详解析 1.2.1 GPIO 端口模式寄存器* 1.2.2 GPIO 端口输出类型寄存器* 1.2.3 ...

  6. 计算机组成原理寄存推实验报告,计算机组成原理移位寄存实验报告.doc

    计算机组成原理移位寄存实验报告 计算机组成原理实验二 移位寄存实验 一.实验目的: 1.了解移位寄存器的硬件电路,验证移位控制与寄存的组合功能. 2.利用寄存器进行数据传输. 二.实验要求: 实现寄存 ...

  7. ARM指令寻址方式之: 内存访问指令寻址

    4.2  内存访问指令寻址 根据内存访问指令的分类,内存访问指令的寻址方式可以分为以下几种. ① 字及无符号字节的Load/Store指令的寻址方式. ② 杂类Load/Store指令的寻址方式. ③ ...

  8. Golang 汇编入门知识总结

    作者:ivansli,腾讯 IEG 运营开发工程师 在深入学习 Golang 的 runtime 和标准库实现的时候发现,如果对 Golang 汇编没有一定了解的话,很难深入了解其底层实现机制.在这里 ...

  9. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(1) - 概述 传输指令

    MMX™ Instructions IA-32架构引入了4个指令集扩展,使得IA-32处理器可以执行单指令多数据SIMD操作.这些扩展包括MMX技术,SSE扩展,SSE2扩展,SSE3扩展. MMX指 ...

最新文章

  1. UNITY_MATRIX_IT_MV[Matrix]
  2. file.getinputstream(); 要关闭吗_iOS 13.5.1 和 12.4.7 已关闭,目前不能升级或降级
  3. 无法打开此修补程序包”或“这个产品的安装来源无法使用”解决(转)
  4. C++中的空类,默认产生哪些类成员函数?
  5. Taro+react开发(89):封装为一个函数渲染
  6. 实例25:python
  7. poj-2528线段树练习
  8. oracle更换rac节点,Oracle-rac 更改VIP地址—2节点的
  9. mysql计划任务书_求做一个基于java的mysql课程设计任务书 要求如下
  10. java tdd测试驱动开发_测试驱动开发TDD(test drive development)
  11. 常见List面试问题
  12. 程序猿,这里有你想学的10门机器学习课程 | 资源
  13. 相同的树 深度优先搜索
  14. [原创]编程实现UCDOS字库的显示和打印
  15. 端口映射抖音去水印源码
  16. 替换word模板内容 Java实现
  17. 免费QQ币:永不过期的刷QQ币技巧共享
  18. android 平板原笔迹,iPad劲敌八:原笔迹输入你行吗?
  19. ACE+TAO 通信中间件
  20. MFC软件欢迎界面(基于对话框,VS2013)

热门文章

  1. 使用SVN管理unityproject
  2. ectouch手机商城首页调用指定分类下的商品
  3. 转错误 x error LNK1104: 无法打开文件“E:\xxxx\Debug\xxxx.exe”
  4. 支付宝钱包流量电量优化实践
  5. 使用bat运行jar文件
  6. 《转》SAP RM07扩展
  7. linux下自动补全问题: autocomplete sh: ( compgen -d — ” ): No such file or directory
  8. 分布式流控介绍和实现原理
  9. 以太网的分层架构_以太网矩阵(Ethernet Fabric)简介
  10. Javascript第三章创建数组的两种方式第一课