【逆向】x64程序逆向基础

主要区别

// 1. 所有地址指针都是64位。
// 2. 增加和扩展新的寄存器,并兼容原32位版本的通用寄存器。
// 3. 原指令指针寄存器EIP扩展为RIP。

寄存器

// 1. 64位寄存器兼容原32位寄存器。
// 2. 新增加8个XMM寄存器(XMM8-XMM15)。
// 3. 扩展原32位寄存器的64位版本,并增加8个新的64位寄存器(R8-R15)。
// 通用寄存器:RAX(64位),EAX(32位),AX(16位),AL(0-7位),AH(8-15位)
// 新增寄存器:R8(64位),R8D(32位),R8W(16位),R8B(8位)

调用约定

x86: 
// 使用stdcall、cdecl、Fastcall等。

x64: 
// 使用类似“Fastcall”的调用约定。
// 使用RCX、RDX、R8、R9寄存器传递前4个参数,其余参数从右往左依次保存在栈上。
// 浮点参数使用XMM寄存器传递(XMM0-XMM3)。

栈使用

x86:
// 32位代码在函数中使用push和pop等指令改变栈的大小。

x64:
// 64位代码在函数中从不改变栈的大小,栈在函数的开始增长,期间一直保持不变,直到函数末尾。
// 当一个函数调用另一个函数时,会多申请32字节(0x20)的预留栈空间,当被调用函数寄存器不够用时,可以将4个参数寄存器(RCX、RDX、R8、R9)中的值保存在申请的预留栈空间中。
// 预留栈空间由函数调用者提前申请,也由函数调用者负责平衡回收。

猜你喜欢

转载自www.cnblogs.com/SunsetR/p/12011720.html