逆向——寄存器和常用汇编指令学习

发布时间 2023-03-23 09:42:30作者: bonelee

9.汇编学习环境塔建

这里直接是用OD就好,因为习惯用了。
首先这里用一张截图概括吧!
Z6BUVP.png

10.通用寄存器

寄存器

存储数据:
1.速度方面 cpu>内存>硬盘
2.存储格式

32位cpu: 8 16 32

64位cpu: 8 16 32 64

通用寄存器

EAX WCX WDX EBX

ESP WBP WSI EDI

==//不能多于32位 不然多来的会被丢弃==

11.通用寄存器

Z6BB8g.png

12.内存

每个进程都有其4G的内存
==进程 即运行的程序
4G是虚拟的,需要多少映射到物理==
Z6B0PS.png
这里我觉得需要写出来
1Byte=8Bit

1KB=1024Byte

1MB=1024KB

1GB=1024MB

内存地址

1.内存是一个线性地址,每个数据都占有一定的内存,而他们存的位置就是他们的地址.成为内存地址,我们可以往内里存储数据或读取数据都会用到它
2.32位的话可 存房00000000到 FFFFFFFF(16进制)
也是上面每个进程都是4G的虚拟空间

mov ax,1 //放入寄存器 ax即说明了放入ax中,16位的
mov eax,1 //eax 即说明放入到了 32位的

而放入内存里,就得先说明放入多大//宽度的内存里

==mov byte ptr ds:[0018FFF0],1== 这个是固定语法 ptr表示pointer,byte表示位宽,[]表示内存地址

//不是每个内存地址都能使用的,使用前得提前申请
但可以测试时使用堆栈区的地址,那的都可以使用
立即数 写入到寄存器

寄存器的值 写入到内存

内存的值 写到 寄存器

另外 寄存器可到寄存器
内存目前的指令不可以到内存(有指令是能实现的)

1
2
3
mov dword PTR ds:[18fffc],12345678
mov dword PTR ds:[18fffc],eax
mov eax,dword PTR ds:[18fff8]

注意宽度:
Byte:8字节
word:16字节
dword:32字节

13.内存地址的五种形式

1.形式一:[立即数]

略过
2.形式二:[reg], reg(寄存器)可以是8个通用寄存器中的任一个

读取内存的值

1
2
mov ecx,0x13FFD0
mov eax,dword PTR ds:[eax]

向内存中写入数据

1
2
mov EDx,0x13FFD8
mov dword PTR ds:[eax],0x87654321

3.形式3:[reg+立即数]

读取内存的值

1
2
mov ecx,0x13FFD0
mov eax,dword PTR ds:[ecx+4]

向内存中写入数据

1
2
mov EDx,0x13FFD8
mov dword PTR ds:[eax+0xC],0x87654321

4.形式4:[reg+reg*(1,2,4,8)]

读取内存的值

1
2
3
mov eax,0x13FFC4
mov ecx,2
mov edx,dword PTR ds:[ecx+ecx*4]

向内存中写入数据

1
2
3
mov Eax,0x13FFC4
mov eax,2
mov dword PTR ds:[eax+ecx*4],87654321

5.形式5:[reg+reg*(1,2,4,8)+立即数]

读取内存的值

1
2
3
mov eax,0x13FFC4
mov ecx,2
mov edx,dword PTR ds:[ecx+ecx*4+4]

向内存中写入数据

1
2
3
mov Eax,0x13FFC4
mov eax,2
mov dword PTR ds:[eax+ecx*4+4],87654321

//数据是如何存放的:小端存储(大小端百度)

15.汇编常用指令//参考资料Intel白皮书

mov指令

Z6BW5T.png

add指令

Z6B2V0.png

sub指令

Z6Bcbq.png

and指令

Z6BRaV.png

做个实验:

1
2
3
and dword PTR ds:[18FFA0],EAX
//内存 ds:[18FFA0] 为00000002 //2 二进制0010
寄存器 EAX 为 00000001 // 1 二进制0001

or指令

Z6B6rn.png

xor指令

Z6BhPU.png

not指令

Z6B4GF.png
试验下:

1
2
not Dword PTR ds:[18FFA0]   //本来里面全为0
执行后ds:[18FFA0]里面 为 FFFFFFFF

16.汇编常用指令(二)

前面提到:

寄存器可到寄存器,
内存当时说不可以直接到内存,而接下来这个指令可以实现

==movs==

Z6BP4U.png

小提示:

程序会在两个地方停下来:

1.刚加载时

2.程序入口点

1.movs指令:移动数据 内存–》内存

1
2
3
4
5
byte/word/dword

movs byte PTR ES:[EDI],byte PTR DS:[EsI]
movs word PTR ES:[EDI],word PTR DS:[EsI]
movs dword PTR ES:[EDI],dword PTR DS:[EsI]

了解下 标志寄存器 elf

elf :00000246

DF:方向标志位:从右向左 坐标为10 //注意 有0坐标哦

if DF为0

di   si  自动+1  4  8

if DF为1

di   si  自动-1  4  8

试验下:
开始 换成dword

Z6BzxH.png
Z6BxRe.png

ESi从 0018FF8C 到0018FF88 减了16
Edi从 0018FFA0 到0018FF9C 减了16 //原因是 elf中的D方向标志为1;

STOS指令:讲AL/AX/EAX的值存储到[EDI]指定的内存单元

1
2
3
4
5
STOS 

STOS byte PTR ES:[EDI];简写为STOSB
STOS word PTR ES:[EDI];简写为STOSW
STOS dword PTR ES:[EDI];简写为STOSD

REP指令:按计数寄存器(ECX)中的指定的次数重复执行字符串指令

1
2
3
4
mov eax,10;//这里的值是  16进制   10即代表 会执行16次
rep movs movsd

rep stosd;