【逆向】x86 vs x64 汇编核心差异
调用约定、栈布局、寄存器、逆向快速区分。一、调用约定差异最核心x8632位参数全部入栈从右往左压栈返回值存在EAX无统一调用约定__cdecl/__stdcall/__fastcall混乱x6464位微软统一前4个参数用寄存器RCX→ 第1参RDX→ 第2参R8→ 第3参R9→ 第4参第5个及以后参数才入栈返回值存RAX统一叫Microsoft x64 fastcall二、栈布局差异x86栈直接压参无“影子栈/预留空间”EBP常用来做栈帧基址EBP8第一个参数栈是4字节对齐x64哪怕用寄存器传参栈上仍必须预留32字节影子空间4个参数位置通常不使用 EBP/RBP 做栈帧直接用RSP寻址栈必须16字节对齐调用指令前保证对齐三、寄存器使用差异x86通用寄存器EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP只有 8 个数量少函数调用只需保护EBX、ESI、EDI、EBPx64扩展RAX、RBX、RCX、RDX、R8~R15共16 个通用寄存器调用者保存RAX、RCX、RDX、R8、R9、R10、R11被调用者保存RBX、RDI、RSI、RBP、RSP、R12~R15四、逆向时1秒快速区分x86 / x64看寄存器名字最快出现EAX/EBX/ECX/EDX→x86出现RAX/RBX/RCX/RDX/R8/R9/R10~R15→x64看参数传递全是push传参 →x86前几个参数用RCX、RDX、R8、R9→x64看指令长度与寻址64位常见mov qword ptr []、ret 0无平栈32位常见ret 8/12等平栈指令看栈操作32位esp频繁操作ebp寻址多64位rsp对齐严格几乎不使用rbp五、总结x86 靠栈传参、寄存器少、用EBP栈帧x64 前4参用寄存器、有32字节影子栈、16字节对齐、寄存器更多。逆向看 R 前缀寄存器与 RCX/RDX 传参即可秒区分。