前言
多去试试,看是看不会的。
内存
寄存器和内存没有本质区别,都是用于存储数据的容器,都是定宽的(都有最大的存储范围)
注意区别我们所说的32位一般都是说的是内存地址寻址范围,而不是说寄存器的数据宽度,32位计算机的编号最大是32位,也就是32个1 换成16进制为FFFFFFFF,也就是说,32位计算机内存寻址的最大范围是FFFFFFFF+1
32位还是64位的计算机由什么决定?跟寄存器的宽度没有关系,而是跟寻址宽度有关系,即CPU能寻找的内存编号的范围,每一个内存编号对应1字节,所以32位计算机能查找的最大内存范围4GB
内存读写
只要是涉及到内存读写的,一定要指定内存的宽度!!!
例如:mov eax,dword ptr ds:[0x0012FF34]
dword :要读/写多少 此时是32bit (byte 字节 8bit word字 16bit dword双字 32bit)
ptr 即point 代表后面是一个指针(就是声明后面的值是地址不是值,学过编程的应该都知道)
ds:段寄存器 这里为数据段,先不管
0x0012FF34 内存编号,必须是32位的
大家可以试一下,例如
注意,找个能访问的地址实验,有的地址是不能访问的,笔者试了下左下框的可以运行,当然最好用右下角框的地址
下面我们试试另一种写法:
这次我们写入我们的像改的值
mov dword ptr ds:[0x006FF760],12345678
即修改地址0x006FF760指向的值12345678
注意其写入是高位在前
即0x006FF760对应78
0x006FF761对应56
0x006FF762-----34
0x006FF763-----12
当我们输入汇编指令:mov word ptr ds:[0x12ffd8],BBBB
那么不仅12ffd8值变成了bb
12ffd9也被覆盖成bb
发现:右下角框和ESP的地址很像,后续揭秘ESP
注意
数据窗口的数据显示与其他窗口的显示相反,(以字节为单位),如图:
立即寻址方式
立即数即在立即寻址方式指令中给出的数
详细见:https://baike.baidu.com/item/%E7%AB%8B%E5%8D%B3%E6%95%B0/3062020?fr=ge_ala
立即寻址方式只能用于源操作数字段,不能用于目的操作数字段,经常用于给寄存器赋初值。
例:MOV AX,251 ;将十进制数251送入寄存器AX,“251”是立即数
MOV AL,‘5’ ;将5的ASCII码送入寄存器AL,‘5’是立即数
MOV AL,E8H ;将8位立即数E8H送入寄存器AL
MOV AX,2346H ;将16位立即数2346H送入寄存器AX
方式一:立即数
读取内存的值
整条指令的作用就是用立即寻址的方式将内存中0x6FF748地址中存储的值读出来放到EAX里
mov eax,dword ptr ds:[0x6FF748]
向内存中写入数据
MOV DWORD PTR DS:[0x6FF764],ebx
将内存中ebx寄存器中的值读出来写入到0x6FF764中
获取内存编号
LEA EAX,DWORD PTR DS:[0x6FF764]
将内存中0x13FFC4这个地址编号放入到EAX寄存中
方式二:[reg]
通过[reg]来寻址,reg可以是8个通用寄存器中的任意一个。先通过读取寄存器中存放的内存地址编号,再通过内存地址编号找到内存中的值
读取内存的值
MOV ECX,0x6FF764
#将0x6FF764这个地址编号,放到到ECX寄存中
MOV EAX,DWORD PTR DS:[ECX]
#将ECX寄存中存储的0x6FF764这个地址中的值取出来放到EAX里
向内存中写入数据
MOV EDX,0x6FF764
#将0x6FF764存入EDX中
MOV DWORD PTR DS:[EDX],0x87654321
edx对应的地址对应的值改为87654321
获取内存编号
LEA EAX,DWORD PTR DS:[EDX]
方式三:[reg+立即数]
读取内存的值
MOV ECX,0x6FF764
MOV EAX,DWORD PTR DS:[ECX+4]
#将地址编号为0x6FF764+0x4中的值取出存到EAX中
向内存中写入数据
MOV EDX,0x6FF764
MOV DWORD PTR DS:[EDX+0xC],0x87654321
获取内存编号
LEA EAX,DWORD PTR DS:[EDX+4]
方式四:[reg+reg*{1,2,4,8}]
通过[reg+reg*1或者2或者4或者8]来寻址,只能是1,2,4,8,不用管为啥是1248后面会讲
读取内存的值
MOV EAX,0x6FF764
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4]
#将0x6FF764+0x8后的地址编号中的值取出来存到EDX
向内存中写入数据
MOV EAX,0x6FF764
MOV ECX,2MOV DWORD PTR DS:[EAX+ECX*4],87654321
#将87654321这个值写入到0x6FF764+0x8这个内存中
获取内存编号
LEA EAX,DWORD PTR DS:[EAX+ECX*4]
#只是将EAX,ECX4这个地址编号存入到EAX中
方式五:[reg+reg*{1,2,4,8}+立即数]
读取内存的值
MOV EAX,0x6FF764
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
向内存中写入数据
MOV EAX,0x6FF764
MOV ECX,2MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
获取内存编号
LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]
原文始发于微信公众号(Zacarx随笔):逆向基础(2):内存与寻址方式
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论