x64寄存器

64位地址

x64中,地址采用64位长度来表示,其中高16位是符号位.取值要么是0000,要么是FFFF.其它情况无效
剩下的48位来表示地址.

通用寄存器

在这里插入图片描述

bpl->bp->ebp->rbp (从8位到64位)
r8b->r8w->r8d->r8 (从8位到64位)

32位和64位寄存器操作

如果对32位寄存器进行了写操作,同时影响的是64位。例如:
mov rax,-1
sub eax,1
这个指令的结果是高32位会被清0,低32位正常-1

xor eax,eax
这个指令再64位下的结果是RAX会被清0

如果写的反汇编是mov rax,1
编译器会优化位 mov eax,1 原理和上面一样 这样指令可以短一点

HOOK指令的选择

第一种:如果有一个寄存器不需要保存的情况下,通过寄存器跳转
mov rax,0x123456789
jmp rax
此指令长度是12字节。 为何不直接使用jmp xxx 呢,因为在64位下 jmp指令只能跳转4字节,很多时候是无法跳转到有用的地方的。

第二种:在没有寄存器可以用的情况下,自己保存
push rax
mov rax,0x123456789
jmp rax

此种方法的返回:

push,1234
mov dword ptr:ss:[rsp+4],0x56789123
ret
自己构造返回地址,分两次写入栈 。不支持一次操作4字节以上
ret指令就会读取构造的8字节返回。

猜你喜欢

转载自blog.csdn.net/qq_41490873/article/details/108723016