逆向分析从x86到x64Tips

Tips1
在之前写的一篇文章 3环下的进程隐藏—-64位windows 10 中的提出的一个疑问:

本来以为x64下的地址为8字节,所以jmp 的address需要 -9 的,结果调试发现还是和x86一样 -5 就行了…..

这里就是 x86—->x64 逆向分析过程中需要特别注意的一点,jmp指令和call指令的变化
虽然在OD下有很多跳转指令jmp xxxxx,但是去仔细看他的二进制编码会发现有很大的区别
有几种二进制码都会被解释为jmp,但他们的含义不一样
1>
x86下:
EB 是短跳的意思,他会把EB后面出现的1个字节解释为跳转的相对地址。
这个相对跳转地址的计算公式是: EB XX=要跳转的地址-EB指令所在的位置-2
x64下:
相同,也是解析后面1个字节为相对地址,计算公式也相同

2>
x86下:
E9 是相对跳转的意思,他会把E9后面出现的4个字节解释为跳转的相对地址。
这个相对跳转地址的计算公式是: E9 XXXXXXXX=要跳转的地址-E9指令所在的位置-5
x64下:
相同,也是解析后面4个字节为相对地址,计算公式也相同

3>
x86下:
FF25 xxxxxxxx其中xxxxxxxx是绝对地址(FF25会对当前的这个绝对地址解*号,也就是绝对地址[目标地址])
x64下:
FF25 xxxxxxxx其中xxxxxxxx是相对地址(FF25会对当前的这个相对地址解*号,也就是相对地址[目标地址])

所以说x64最大的不同就是他的FF25也不是绝对地址解析了,也变成了相对地址,x64的跳转没有绝对地址。
因为x64的地址指针应该是比x86扩大了一倍,但是为了防止跳转指令长度增加,所以就全部做成绝对地址跳转了

Tips2
函数调用约定在32为系统中海油cdecl,stdcall,fastcall几种,到64为系统中被统一为fastcall,参数传递方式为
参数—————整数型—————实数型
1st——————RCX—————–XMM0
2nd—————–RDX—————–XMM1
3rd——————R8——————-XMM2
4th——————R9——————-XMM3
从第5各参数开始使用栈传递,传参过后的栈清理工作由调用者清理。但是虽然函数的前4个参数由寄存器保存但是栈空间中依然保留了空间,也就是说第5个参数的保存位置不是在rsp,而是rsp+sizeof(1+2+3+4)

Tips3
x64几乎不怎么使用RBP寄存器,即使他依然有栈幁,所以栈幁是靠RSP寄存器实现的

你可能感兴趣的:(二进制安全)