64位软件逆向技术
寄存器
本节讨论的x64是AMD和INTEL64的合成,是指与现有x86兼容的64位CPU。在64位系统中,内存地址为64位。
x64系统通用寄存器的名称,第一个字母从E改为R“RAX”,大小扩展到64位,数量增加8个,扩充了8个128位XMM寄存器。
函数
1.栈平衡
RSP用来保存当前的栈顶指针,每8个字节的栈空间来保存一个数据。
如果不进行栈平衡,栈内存很快就会被消耗光。
2.启动函数
前面有讲,不再重复。详细见文章:x64逆向——MT、MT在release和debug下的四种模式寻找main入口 细节很多,容易被坑!
3.调用约定
与之前不同,x64程序只有一种寄存器快速调用约定。前四个参数使用寄存器传递,如果参数超过四个,多于的参数放在栈里,入栈顺序从右到左,由函数调用方平衡栈空间。
4.参数传递
参数小于四个时,通过寄存器传递。
thiscall传递,是C++类的成员函数调用约定。
5.函数返回值
在64位环境中,使用RAX寄存器来保存函数返回值。返回值类型由浮点类型使用MMX0寄存器返回。RAX寄存器可以保存8字节数据。当返回值大于8字节,可以将栈空间的地址作为参数间接访问达到目的。