x64(学习笔记) - 1(函数逆向)
要点
在x64默认下不使用rbp寻址,使用rsp寻址
在x64下栈是静态的栈,函数开头会默认开辟好所有的栈
栈帧 - 栈顶 到 栈底的高度
x64中栈帧是静态的,默认就开辟好了
在x64中 修改rsp 可能是 sub 也可能是 lea
在x64中 堆栈回溯 需要计算rsp 来回溯堆栈
在x64中 ret 一般都没有参数 因为栈是静态默认开辟好的
48位有效地址有多少有效内存呢?2^48=40000G
物理地址有效内存 2^40=1024G 物理机的物理线有多少跟
64位下 E9 call 是模块 call 上下2G范围
64位下 跨大地址调用
1
2
3
4push rax; 1个字节
mov rax,0x123456789; 10个字节
push rax; 1个字节
ret; 1个字节1
2
3push rax; 1个字节
mov rax,0x123456789; 10个字节
jmp rax; 2个字节因为会破坏寄存器所以到目标地址后需要pop rax;
FF 25(FF 15) 绝对调 jmp + 绝对地址 FF 25 00 00 00 00 XX XX XX XX XX XX XX XX (14个字节) 在头部(尾部)挂hook需要6个字节就够了
注意
- 在写代码的时候,尽量少直接传递结构体(浪费性能,会多次复制结构)
反调试
- 回溯堆栈 看看来源 是不是自己模块的函数
- 伪造调用 调用完挂hook / veh 在修复
# 推荐文章
1.minifilter-学习笔记1
2.Android Killer 不反编译资源
3.xposed 原理初探
4.AndroidStudio调试smali代码
5.jeb调试smali代码
6.xposed 小实战
1.minifilter-学习笔记1
2.Android Killer 不反编译资源
3.xposed 原理初探
4.AndroidStudio调试smali代码
5.jeb调试smali代码
6.xposed 小实战