一.寻址公式 [立即数]
1.读取内存的值
MOV EAX,DWORD PTR DS:[0x13FFC4]
读DWORD 即读取内存地址为 0x13DDC4 0x13FFC5 0x13FFC6 0x13FFC7 的内存下存的值
2.向内存中写入值
MOV DWORD PTR DS:[0x13FFC4],EAX
即将EAX中的值 写入地址为0x13DDC4 0x13FFC5 0x13FFC6 0x13FFC7 的内存下
3.获取内存编号
LEA EAX,DWORD PTR DS:[0x12FFC4]
作用:将一地址下的内存编号在EAX中展示出来
二.寻址公式2
1.读取内存的值
MOV EAX,0x123456
MOV ECX,DWORD PTR DS:[EAX]
含义:将EAX下存的内存编号下的内容展示在ECX中
2.获取内存编号
MOV ECX,DWORD PTR DS:[EAX]
LEA ECX,DWORD PTR DS:[EAX]
含义:将EAX下存的内存编号展示在ECX中
三.寻址公式3
1.读取内存的值
MOV EAX,DWORD PTR DS:[ECX+4]
即读取的是ECX 下地址往后移4的地址下所存的值展示在EAX中
2.获取内存编号
LEA EAX,DWORD PTR DS:[ECX+8]
即将ECX下地址往后移8的地址下的内存编号在EAX中展示
若ECX 中展示的地址为12FFC4 则编号为12FFCC
四.寻址公式4
1.读取内存的值
MOV EAX,0x13FFC4
MOV ECX,0x2
MOV EDX,DWORD PTR DS:[EAX+ECX*4]
EAX+ECX*4就是16进制加法 执行后EDX下存的就是运算完后得到的内存编号下存的内容
2.获取内存编号
LEA EDX,DWORD PTR DS:[EAX+ECX*4]
这个跟上一个一样只不过是读取这个地址下的内存编号
注:
1.如果运算的结果超过的FFFFFFFF那么结果只会取FFFFFFFF而且在实际情况下是不会超过FFFFFFFF
2.乘的数只能是1 2 4 8
五.堆栈
堆栈中数据的存入
MOV EBP,0x12345678(栈底)
MOV ESP,0x12345678(栈顶)
方法一:
MOV DWORD PTR DS:[ESP-4],AAAAAAAA
SUB ESP,4
方法二:
LEA ESP,DWORD PTR DS:[ESP-4]
MOV DWORD PTR DS:[ESP],AAAAAAAA
堆栈中数据的查找
栈顶查找法
MOV EAX,DWORD PTR DS:[ESP+8]
栈底查找法
MOV EAX,DWORD PTR DS:[EBP-8]
堆栈中数据的弹出
方法一:
MOV EAX,DWORD PTR DS:[ESP+4]
ADD ESP,4
方法二
LEA ESP,DWORD PTR DS:[ESP+4]
MOV EAX,DWORD PTR DS:[ESP-4]
另一种数据的压入弹出的方法
CPU默认的将EBP 和ESP作为栈底和栈顶
则压入可执行为
PUSH 12345678
也可为
PUSH EAX
弹出
POP 12345678
POP EAX