linux 内核对于安全可能是比较重要的一环。
关于syscall table 表替换的问题
这里以linux 4.15和4.19为代表的说明我遇到的问题。
syscall hook | 4.15 | 4.19 |
---|---|---|
拥有可读写状态 | hook成功 | hook失败 |
这里似乎到4.19添加了对systable的保护。
如果非要对systable进行hook,可能替换这页表,改变物理地址指向是一种解决办法。
还有就是直接inline hook对内核进行更改。
inline hook的实现
一、寄存器的保存和恢复
STP X1, X0, [SP, #-0x10]
LDR X0, 8
BR X0
[TARGET_
ADDRESS] (64bit)
LDR X0, [SP, -0x8]
这里简化了,实际上我们需要将所有的寄存器进行保存和恢复。
Android-Native-Hook-Practice-Arm64
BR指令是对绝对跳转
B 指令是相对于pc寄存器的跳转
LR是用于保存函数调用的返回地址的link register。
二、指令的修复和执行
我们需要对备份的指令进行修复。在实际修复过程中,有些指令也受影响,有如下几种:
- 取PC的值进行计算的指令
- 跳转到备份区域的指令
第一种我们已经解释过了,而第二种则是由于我们备份区域中的代码已经被替换了,如果有跳转到这个区域的指令,那接下来执行的就不试原来这个位置的指令了。我们可以再把第二类细分成两类:
- 从备份区域跳转到备份区域的指令
- 从备份区域外跳转到备份区域的指令
前者通过计算目标代码在备份区域中的绝对地址来代替原来的目标地址从而修复,而后者由于不知道整个程序中到底有多少条指令会跳转过来,所以无法修复。