X64程序逆向分析

x64指令集

x64位程序使用的是x64指令集,64指令集有AMD64,EM64T,IA-64三种。

AMD64是最早推出,intel和惠普联合推出了IA-64但是没有用户起来

Intel直接拷贝AMD的指令集推出了IA-32E后改名为EM64T,也就是intel6。统称为x64指令集

x64和x86的区别

x86中原有的寄存器在64中拓展为64位,且名称的第一个字母E改为R,但是依然可以用低位寄存器,如RAX,EAX,AX,AL

EIP变成了RIP EFLAG变成RFLAG

x64多了8个64位通用寄存器R8-R15。每个寄存器都可以拆分为32,16,8位

x64程序变化

32位位程序中的函数调用约定被废除了

x64应用程序只有一种调用约定,类似于fastcall。

前四个参数使用寄存器传递,如果超过四个多余的参数就放在栈里,入栈顺序是从右到左,由函数调用方来平衡堆栈,前四个参数存放的寄存器是固定的,分别是从左到右的参数分别是RCX,RDX,R8,R9,其他参数从右往左依次入栈

64位程序中当在开辟栈空间的时候,直接调用rsp来处理,而没有调用esp,然后再返回栈空间的时候,直接调用的是对栈顶进行偏移

分析x64程序

首先找到main函数

对于x64程序找main函数和x86程序是一样的流程

然后画堆栈图慢慢分析