【reverse】逆向3 寻找地址
寻址公式一:[立即数]
读取内存的值:
mov eax,dword prt ds:[0x13FFC4]
将内存编号为0x13FFC4、0x13FFC5、0x13FFC6、0x13FFC7的数据写入eax中
向内存中写入数据
mov dword prt ds:[0x13FFC4],eax
将eax的数据写入内存编号为0x13FFC4、0x13FFC5、0x13FFC6、0x13FFC7中
获取内存编号
lea eax,dword ptr ds:[0x13FFC4]
lea eax,dword prt ds:[edx]
获取0x13FFC4地址的内存编号(就是0x13FFC4)
获取edx的内存编号
寻址公式二:[reg]
reg代表寄存器,可以是8个通用寄存器中的任意一个
读取内存的值:
# 基址
mov ecx,0x13FFD0
# 找基址的数据
mov eax,dword prt ds:[ecx]
其实这个寻找公式的本质和第一个一样,只不过第一个是直接读取内存编号的数据
而这个是先把要找的内存地址放入一个寄存器中,在根据寄存器中存储的内存编号去寻找这个内存编号的数据
举个例子
第一句汇编将内存编号0x19FF74存入ecx中
第二句汇编将存入ecx中的内存编号的数据读取出来
我们先在堆栈窗口观察0019FF74编号的数据为7725FA29
我们运行第一句汇编
可以看到我们把0019FF74编号存入了ecx中
再运行第二句汇编
可以看到我们把0019FF74编号中的数据读到了eax中
向内存中写入数据
mov edx,0x13FFD8
mov dowrd ptr ds:[edx],0x87654321
向0x13FFD8这个内存编号中写入0x87654321这个数据
获取内存编号
mov eax,0x19FF74
lea ecx,dword ptr ds:[eax]
读取eax的内存编号(这里eax的内存编号是0x19FF74)
运行第一句汇编前
运行第一句汇编后,将0x19FF74内存编号存入eax
运行第二句汇编后,ecx中获取了eax的内存编号0x19FF74
寻址公式三:[reg+立即数]
读取内存中的值
mov ecx,0x19FF74
mov eax,dword ptr ds:[ecx+0x4]
公式3和公式2其实一样,只不过多了一个立即数的偏移量
第一句汇编是将0x19FF74内存编号存入ecx
第二句汇编是将ecx+0x4(0x19FF78)的内存编号的数据放入eax中
运行前的数据状况
运行第一句
运行第二句
可以发现eax中存入了0x0019FF78这个内存编号
向内存中写入数据
mov ecx,0x19FF74
mov dword prt ds:[ecx+0xC],0x87654321
向内存编号为0x19FF74+0xC写入0x87654321的数据
获取内存编号
lea eax,dword ptr ds:[ecx+0x8]
我们看这张图
lea是读取ecx+0x8的内存编号
而ecx是0x19FF74
所以如果运行了这句汇编,那么eax的那里将会存入0x19FF7C的内存编号
寻址公式四:[reg+reg*{1,2,4,8}]
读取内存的值
mov eax,0x13FFC4
mov ecx,0x2
mov edx,dword ptr ds:[eax+ecx*4]
第一句汇编,将0x13FFC4内存编号写入eax
第二句汇编,将0x2立即数写入ecx
第三句汇编,将eax+ecx*4(0x13FFC4+0x8 = 0x13FFCC)内存编号的数据写入edx
题外话:eax+ecx*4不会超过FFFFFFFF
向内存中写入数据
mov eax,0x13FFC4
mov ecx,0x2
mov dword ptr ds:[eax+ecx*0x4],0x87654321
第一句汇编,将0x13FFC4内存编号写入eax
第二句汇编,将0x2立即数写入ecx
第三句汇编,将eax+ecx*4(0x13FFC4+0x8 = 0x13FFCC)内存编号的值改为0x87654321
获取内存编号
mov eax,0x13FFC4
mov ecx,0x2
lea eax,dword ptr ds:[eax+ecx*4]
第一句汇编,将0x13FFC4内存编号写入eax
第二句汇编,将0x2立即数写入ecx
第三句汇编,将eax+ecx*4(0x13FFC4+0x8 = 0x13FFCC)内存编号写入eax,此时eax就是0x13FFCC
寻址公式五:[reg+reg*{1,2,4,8}+立即数]
读取内存的值
mov eax,0x13FFC4
mov ecx,0x2
mov edx,dowrd ptr ds:[eax+ecx*4+0x4]
第一句汇编,将0x13FFC4内存编号写入eax
第二句汇编,将0x2立即数写入ecx
第三句汇编,将eax+ecx*4+0x4(0x13FFC4+0x8+0x4 = 0x13FFD0)内存编号的数据写入edx
向内存中写入数据
mov eax,0x13FFC4
mov ecx,0x2
mov dowrd ptr ds:[eax+ecx*4+0x4],0x87654321
第一句汇编,将0x13FFC4内存编号写入eax
第二句汇编,将0x2立即数写入ecx
第三句汇编,将eax+ecx*4+0x4(0x13FFC4+0x8+0x4 = 0x13FFD0)内存编号的数据改为0x87654321
获取内存编号
mov eax,0x13FFC4
mov ecx,0x2
lea eax,dword ptr ds:[eax+ecx*4+0x4]
读取eax+ecx*4+0x4这个内存编号,也就是0x13FFD0