arm64 内核 inline hook

linux 内核对于安全可能是比较重要的一环。

关于syscall table 表替换的问题

这里以linux 4.15和4.19为代表的说明我遇到的问题。

syscall hook4.154.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的值进行计算的指令
  • 跳转到备份区域的指令

第一种我们已经解释过了,而第二种则是由于我们备份区域中的代码已经被替换了,如果有跳转到这个区域的指令,那接下来执行的就不试原来这个位置的指令了。我们可以再把第二类细分成两类:

  • 从备份区域跳转到备份区域的指令
  • 从备份区域外跳转到备份区域的指令
    前者通过计算目标代码在备份区域中的绝对地址来代替原来的目标地址从而修复,而后者由于不知道整个程序中到底有多少条指令会跳转过来,所以无法修复。

Android-Native-Hook-Practice

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值