在接触64位程序之前,先简单的来了解一下32寄存器和64的区别:
64位有16个寄存器,32位只有8个。但是32位前8个都有不同的命名,分别是e_,而64位前8个使用了r代替e,也就是r_。e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8-r15,其低位分别用d,w,b指定长度。
32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值
64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用
64位支持一些形式的以PC相关的寻址,而32位只有在jmp的时候才会用到这种寻址方式。
其实在有厚实32逆向基础的情况下,64整体上和32区别不大。
以某64游戏为例子(主流游戏,避免不必要的麻烦,文中不会出现任何游戏画面的截图):
无论开发什么游戏,对象坐标都是无法略过的关键,那么以对象坐标为例子。打开CE,注意:64位程序,需要对应的64位CE。扫描类型选择浮点或者双浮点。
首先尝试搜索未知的float,在这里,建议以Z坐标为突破口。人物站在高处,搜索增加的数值,人物在低处,搜索减少的数值,重复赛选。(注意:64程序相比32,会大很多,从而赛难度也增加,需要一定耐心)。
在经过重复赛选后,得到了以下