现在的 KernelSU 已经加入了 lkm 模式,这个模式下 ksu 会以内核模块的形式进行加载。
patch 过程
patch 是由 ksud 负责的,不过在安装之前是伪装的 native lib
源代码在这里 https://github.com/tiann/KernelSU/blob/main/userspace/ksud/src/boot_patch.rs
具体的作者也是非常贴心地写在了注释里面
magiskboot unpack boot.img
magiskboot cpio ramdisk.cpio 'cp init init.real'
magiskboot cpio ramdisk.cpio 'add 0755 ksuinit init'
magiskboot cpio ramdisk.cpio 'add 0755 <kmod> kernelsu.ko'
这个 ksuinit 就是负责进行加载模块的了,会先加载 ksu 的模块,然后加载原本的 init
ksuinit
这个东西没有开源,但是看 dmesg 以及一些实现能发现它做了什么
它会先尝试加载模块,然后,当然是签名验证失败没法加载的
这之后,它就会对内核进行 patch,绕过签名验证
具体的原理可以看这个网页 https://web.archive.org/web/20230518044737/https://bbs.kanxue.com/thread-271179.htm
这之后我们其实也可以加载任意没有签名的模块了
正文完