Android10以后,Android系统限制了System分区的修改,结果就是,即使你i是自己编译的Android系统,即使是有做高的root权限,你依然无法挂载System分区并对其内容进行修改,尽管网上有各种帖子说可以使用mount -o rw,remount /
,但这并没有解决开发者的实际问题。这意味着传统的万能root出现局限性,为了解决这个问题Magisk的作者Top John Wu
在推文中确认了这一问题,并确认了导致该问题的原因是谷歌在Android10以后引入了EXT4 共享块
,而这个共享块和其他分区的区别在于根本没有可用空间的概念,所以也就没办法挂在为可读写。为了解决这个问题,Magisk团队发现可以重定向文件读取时的文件路径来实现修改的目的,这似乎和我们Hook有相似之处,而这个,被Top John Wu
称为Systemless(无System分区)而由此概念引申出来的Root方案,也叫做systemless root。。
Magisk文件结构
Magisk系统包含上层的控制App以及下层的可执二进制文件以及一些相关配置或者数据文件。我们从底层往上层看会更容易明白Magisk的功能构成和架构思维。
首先,Magisk 会挂载一个tmpfs目录来存放一些临时数据。在Android11以下,这个目录时sbin,从 Android 11 开始,/sbin文件夹可能不存在,那么 Magisk 会在/dev下随机创建一个文件夹并将其作为Magisk的Root文件夹。
放在sbin或者dev下的原因是:/sbin或/dev目录非su权限不可读,因此第三方APP无法检测。
我们可以通过在adb shell下使用magisk --path
打印当前Magisk使用的目录:
找到magisk目录
blueline:/ # magisk --path
/dev/bNpnxq
文件列表
接下来我们看下这个目录下都有什么文件,以及如何解读这些文件;
blueline:/dev/bNpnxq # ls -al
total 720
drwx------ 3 root root 200 2022-12-24 21:41 .
drwxr-xr-x 24 root root 6200 2022-12-25 01:40 ..
drwxr-xr-x 8 root root 180 2022-12-24 21:41 .magisk
lrwxrwxrwx 1 root root 10 1970-02-17 10:04 magisk -> ./magisk64
-rwxr-xr-x 1 root root 154452 1970-02-17 10:04 magisk32
-rwxr-xr-x 1 root root 247168 1970-02-17 10:04 magisk64
-rwxr-xr-x 1 u0_a206 u0_a206 328240 2022-12-24 21:41 magiskpolicy
lrwxrwxrwx 1 root root 8 1970-02-17 10:04 resetprop -> ./magisk
lrwxrwxrwx 1 root root 8 1970-02-17 10:04 su -> ./magisk
lrwxrwxrwx 1 root root 14