【reverse】逆向2 寄存器与内存
【reverse】逆向2 寄存器与内存
1、通用寄存器

主要用途其实没必要记下来,因为只是CPU建议你这么做。
寄存器需要按照顺序被下来
32位就是可以存32个0或1
所以存储范围就是0~0xFFFFFFFF

16位通用寄存器,名称就是32位通用寄存器少了一个E
8位寄存器AL CL DL BL AH CH DH BH 其中的L表示LOW,低位,H表示HIGH,高位

寄存器的样子长这样,AX本身就在EAX里面,CX本身就在ECX里面.....
AH是AX中的高位部分,AL是AX中低位部分.....
2、使用OD
认识界面
使用F3选择exe文件打开

可以看到四个窗口,左上方是反汇编窗口、右上方是寄存器窗口、左下方是数据窗口、右下方是堆栈窗口
mov指令
mov指令

我们选择当前指向的地址,也就是EIP指向的地址
双击,设计汇编指令
mov eax,0x1
这条指令就是让eax寄存器的值变为0x1
汇编完之后使用F8步入执行
这句指令的意思就是让0x1这个移动到eax中
未执行前

执行后

可以看到eax的值改变了
我们还可以是用
mov ecx,eax
这句话的意思就是将eax的值复制到ecx中
使用mov指令的前提是,后面两个容器(数据宽度)的大小需要一样

mov指令形式

注意:源操作数和目标操作数不能同时为内存单元
add指令
add就是加法


sub指令
sub就是减法


and指令
and指令就是 与 的运算
or指令
or指令就是 或 的运算
xor指令
xor指令就是 异或 的运算
not指令
not指令就是 非 的运算

3、认识内存
寄存器和内存的区别
寄存器位于CPU内部,执行速度快,但很贵
内存速度相对慢,但成本比较低,所以可以做的很大
寄存器和内存没有本质区,都是用于存储数据的容器,都是定宽的
寄存器常用的有8个
计算机中常用的计量单位:byte word dword
BYTE 字节 = 8bit
WORD 字 = 16bit
DWORD 双字 = 32bit
内存的数量特别庞大,无法每个内存单元都起名字,所以用编号来代替
计算机内存的每一个字节都会有一个编号(内存编号的单位是字节)
0x00000000
0x00000001
0x00000002
32位计算机的最大寻址编号是第32位,也就是32个1,换成16进制就是FFFFFFFF,也就是说,32位计算机内存寻址的最大范围是00000000~FFFFFFFF。内存的单位是字节,那么内存中存储的信息最多为FFFFFFFF+1字节,换算过来就是4G,这也是为什么我们在一个xp系统上面
32位的计算机寻址最大是4G吗?
不是,我们可以通过加内存条等方式

win2003是32位操作系统,但是看到这个内存通过扩展的方式到达了8G
内存格式

由图我们可以看到,内存单位为8位,就是1字节,所以我们操作内存的时候,最少就是操作8位。不管是读8位还是写8位,最少最少操作8位。这也是为什么最小的寄存器AH、AL之类的,最少操作8位。
从指定内存中写入/读取数据
为了区分立即数和内存编号,汇编通过打中括号的方式来区分
mov dword pte ds:[0x12345678],0x12345678

prt:表示后面是一个指针
ds:段寄存器
内存编号必须是32位的
注意:地址编号不要随便写,因为内存是有保护的,并不是所有的内存都可以之间诶读写(需要特别处理)
建议:地址编号写成esp的值
任何程序打开都有一个4G的空间(虚拟内存),即使有4G空间,但是有很多空间是不可以访问的
写内存


我们使用mov dword prt ds:[0x19FF74],0x12345678
将内存地址为0x19FF74写入了0x12345678这个数据,我们发现内存是4字节一起显示的,所以可以存储dword(4字节)的数据在里面。但是我们需要知道,内存的单位是1字节(8bit)
读内存
内存读取一定需要容器,我们用eax寄存器做容器
使用汇编指令
mov eax,dword ptr ds:[0x19FF78]

这样就可以将0x19FF78内存地址的值读到eax寄存器中

4、复习总结

32位 16位 8位通用寄存器
32 16 8 EAX AX AL ECX CX CL EDX DX DL EBX BX BL ESP SP AH EBP BP CH ESI SI DH EDI DI BH 寄存器的结构:EAX-AX-AH-AL的关系
EAX(共32位)是AX(后16位)的拓展,AH是AX的高位(前8位),AL是AX的低位(后8位)

为什么8位寄存器只能放2个16进制数
因为16进制转成二进制就是4位 1111 = F
所以8位寄存器只能放2个16进制数 AH可以存放00~FF
内存单元:字节
每个字节都有编号,称为内存地址
内存地址在堆栈窗口是4字节一组
00000000
00000004
在反汇编和寄存器窗口,从左向右降位,但是在数据窗口是反过来的

我们使用db指令,以字节的形式来显示内存地址0x0019ff88开始的数据
发现数据窗口和堆栈窗口的数据是反着的
堆栈窗口中的HEX数据就是16进制数据,两位16进制就是8位也就是一字节,并且一字节就是一个内存地址
堆栈窗口中内存地址0x0019FF88~内存地址0x0019FF8B的数据为003E0000(高位向低位)

数据窗口中内存地址0x0019FF88~内存地址0x0019FF8B的数据是从右向左读的(高位向低位)

那么我们根据数据窗口来看,内存地址0x0019FF88上的数据就是00(左边的00),内存地址0x0019FF89上的数据就是30
【reverse】逆向2 寄存器与内存的更多相关文章
- linux --> 为什么寄存器比内存快?
为什么寄存器比内存快 计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘. 原因一:距离不同 距离不是主要因素,但是最好懂,所以放在最前面 ...
- DMA内存申请--dma_alloc_coherent 及 寄存器与内存【转】
转自:https://blog.csdn.net/ic_soc_arm_robin/article/details/8203933 在项目驱动过程中会经常用到dma传输数据,而dma需要的内存有自己的 ...
- 计算机cpu、寄存器、内存区别
1.寄存器是中央处理器内的组成部份.它跟CPU有关.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC). ...
- 汇编,寄存器,内存,mov指令
一.代码 和 汇编 和 二进制之间的关系 二.复习一下计算机组成原理的知识 1.寄存器 计算机中有三个存储 32位cpu提供的寄存器有三种类型8位 16位 32位 64位的只是32位的扩展 并且程序大 ...
- 汇编寄存器(内存访问)基础知识之三---mov指令
1 内存中字的存储 一个字型数据占2个内存单元,内存里面一个内存单元一个字节(8位),高地址单位放高8位,低地址单元放低8位. 注意:0号是地址单元,1是高地址单元(上是低地址,下面是高地址) (1 ...
- CPU/寄存器/内存
因为要了解多线程,自然少不了一些硬件知识的科普,我没有系统学习过硬件知识,仅仅是从书上以及网络上看来的,如果有错误请指出来. CPU,全名Central Processing Unit(中央处理器). ...
- 转载-STM32片上FLASH内存映射、页面大小、寄存器映射
原文地址:http://blog.chinaunix.net/uid-20617446-id-3847242.html 本文以STM32F103RBT6为例介绍了片上Flash(Embedded Fl ...
- 内存,寄存器和cache的区别与联系
1. 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC).在中央处理器的 ...
- I/O 寄存器和常规内存
不管硬件寄存器和内存之间的强相似性, 存取 I/O 寄存器的程序员必须小心避免被 CPU(或者编译器)优化所戏弄, 它可能修改希望的 I/O 行为. I/O 寄存器和 RAM 的主要不同是 I/O 操 ...
随机推荐
- 解决Tomcat10.0.12源码编译问题进而剖析其优秀分层设计架构
概述 Tomcat.Jetty.Undertow这几个都是非常有名实现Servlet规范的应用服务器,Tomcat本身也是业界上非常优秀的中间件,简单可将Tomcat看成是一个Http服务器+Serv ...
- LuoguP7441 「EZEC-7」Erinnerung 题解
Content 给定 \(x,y,K\).定义两个数列 \(c,e\),其中 \(c_i=\begin{cases}x\cdot i&x\cdot i\leqslant K\\-K&\ ...
- java 输入输出IO 转换流-字符编码
编码和其产生的问题: 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字.英文.标点符号.汉字等字符是二进制数转换之后的结果. 按照某种规则,将字符存储到计算机中,称为编码 .反之,将存 ...
- TURN协议初识及turnserver实践
WebRTC协议栈 图一 WebRTC stack TURN的全称为Traversal Using Relays around NAT,是STUN/RFC5389的一个拓展,主要添加了Relay功能. ...
- ☕【Java实战系列】「技术盲区」Double与Float的坑与解决办法以及BigDecimal的取而代之!
探究背景 涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子: 条件判断超预期 System.out.println( 1f = ...
- .Net Core 文件打包压缩
最近项目需要实现多文件打包的功能,尝试了一些方法,最后发现使用 ICSharpCode.SharpZipLib 最符合项目的要求. 具体实现如下: 1.在 Nuget 中安装 ICSharpCod ...
- JAVA 通过url下载图片保存到本地
//java 通过url下载图片保存到本地 public static void download(String urlString, int i) throws Exception { // 构造U ...
- 创建Ubuntu server 服务器git项目
服务器端: mkdir project.git cd project.git git init --bare cd .. p.p1 { margin: 0; font: 11px Menlo; col ...
- 【LeetCode】716. Max Stack 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双栈 日期 题目地址:https://leetcode ...
- UVA11754 - Code Feat
Hooray! Agent Bauer has shot the terrorists, blown upthe bad guy base, saved the hostages, exposed ...