最近在研究Android逆向,其中就涉及到对Android进行Root的操作,Root方式有多种,本篇文章就来简单总结一下。
这是一篇科普向文章,没有代码层的分析。
Android Root核心原理
Android内核其实就是Linux,所以Android要获得Root权限,其实等同于内核的Linux系统要获得Root权限。
使用过Linux的人都比较清楚,我们可以通过sudo或su获得Root权限,不同之处在于sudo是暂时获得Root权限,而su是一直获得Root权限。
因为Root权限具有危险性,比如用户可以删除任意文件,如果不小心将Android核心代码文件删除,那么手机就无法正常使用了,为了避免这种情况,Android手机默认是不会提供进入Root权限的功能的,即缺少su程序。
如果你想让Android获得Root权限,那么你首先需要编译好su程序文件,然后拷贝到PATH(环境变量)中,并给予su文件执行权限。
Android手机的PATH有:
/sbin
/vendor/bin
/system/sbin
/system/bin
/system/xbin
进行Root时,通常将su程序文件放在/system/xbin
目录中,这样你在通过adb shell连接Android手机后,就可以通过su命令进入Root权限了。
原理是这个原理,但实际操作起来,会出现一个逻辑死结。我们将su文件拷贝到Android PATH中需要Root权限,而我们当前没有Root权限,拷贝su文件到PATH的目的便是获得Root权限,所以陷入两难的逻辑死结中。
一键Root
要获得Root权限,就需要突破这个逻辑死结。
在几年前,市面上有很多一键Root的软件,当时,让Android手机获得Root最简单的方式便是从应用商城下载好这些一键Root软件,然后通过该软件可以轻松让Android获得Root权限。
这类一键Root软件会利用Android系统的漏洞,从而获得某个具有Root权限的进程,然后利用该进程实现将su文件拷贝到/system/xbin
目录并给予su文件执行权限的过程,但随着Android的发展,很多漏洞已经被堵上,这类一键Root软件就没有用武之地了。
此外很多一键Root软件与流氓软件无异,因为有了最高权限,可以对你的Android手机做各种流氓操作,你却无可奈何。
刷Recovery
现在要获取Android的Root,更常用的方式是刷入第三方的Recovery,然后再借助Recovery刷入获取Root的程序。
什么是Recovery?
一部Android手机,通常会有2个系统,一个是Android系统本身,这也是用户开机默认会使用的系统,另一个便是Recovery系统,该系统的主要功能便是操作Android系统,比如Android系统出现无法开启的故障,此时就需要Recovery系统,大多数手机厂商都会让用户通过长按开机键+音量键的方式进入Recovery系统,如下图:
进入Recovery后,你便可以对Android系统本身进行自由管理了,此时我们会通过Recovery来将su文件刷入,从而获得Root后的Android系统。
如果你使用的不是Google亲儿子(如:Nexus),而是使用国内厂商的手机,如小米、华为之类的,你还需要突破BootLoader锁带来的限制。
BootLoader是你按下手机开机时,最先启动的程序,它的主要作用便是拉起整个Android系统和Recovery系统,但国内厂商会对BootLoader上锁,从而让手机只能运行该厂商验证过的Android系统和Recovery,而厂商自己的Recovery通常进行过阉割,无法让Android获得Root权限。
对于国内厂商的玩家,获得Root的第一步是解锁BootLoader,解锁分官方解锁和强制解锁,比如你使用小米手机,你想刷机,可以去小米论坛申请官方解锁,但有些手机不支持官方解锁,此时只能自己搜索解决方案,进行强制解锁了。
目前最常用的第三方Recovery叫做 TWRP (TeamWin Recovery Project ), 它是由国外 android 爱好者开发的一款工具,你需要根据自己的Android型号去找对应版本的TWRP。
注意,我们刷入了第三方Recovery后并不表示已经完成Root了,我们只是需要一个功能更加强大的Recovery来帮助我们刷入可以获取Root的程序。
SuperSU与Magisk
SuperSU与Magisk都是知名的Root管理程序,两者都可以通过TWRP将其刷入,然后让Android获得Root权限,但两者有较大的不同。
SuperSU
SuperSU由Chainfire开发,在几年前是当之无愧的Android获取Root的最佳方式,但互联网中对SuperSU的讨论止步于2017年末,其原因是SuperSU被国内公司收购,SuperSU从此由开源模式转为闭源模式,开源版本的SuperSU依旧留在Github,其支持的最新Android版本为7.0,即Android8.0以后,你要使用,就需要使用闭源版本,但没人愿意使用陌生公司的闭源版本。
SuperSU实现Root的方式也是将SuperSU自己准备好的su程序文件放到Android中,只是其借助Recovery来刷入su,此外,也会将SuperSU应用也刷入到系统中。
如果Android中的任何应用都可以不加限制的使用Root权限,那么手机将没有安全性可言,所以SuperSU应用的目的就是对需要使用Root的应用进入管理,如果一个应用需要使用Root,会调用su程序,而该su程序是SuperSU应用处理好的su程序,在下放权限前,会通知SuperSU应用,从而实现对应用获取Root的管理。
在Android 6.0时,Google在Android系统中新增了SafetyNet程序,该程序的主要功能便是监测系统API,如果发现系统API遭到修改或系统完备性检测失败,则会告知使用了该功能的应用,而SuperSU这种更改系统文件并新增文件到Android系统分区的做法会被SafetyNet程序检测出来,从而导致很多通过SuperSU实现Root的用户无法使用Google Play、Netflix等使用了SafetyNet功能的应用,也无法获得任何OTA更新(Over The Air Updates,无线下载更新)。
关于SuperSU获取Root的更多细节可以看一下Chainfire写的How-To SU(http://su.chainfire.eu/)。
Magisk
SuperSU被收购且开源版只能支持到Android 7.0,Magisk扛起大旗。
Magisk实现Root的方式也是将自己的su程序利用Recovery刷入Android中实现Root。
Magisk的特点在于它会挂载一个与系统文件相互隔离的文件系统来加载自己的内容,Magisk的改动都发生在这个独立的文件系统中,不会影响到Android系统本身的文件,从而避免被检测。
与SuperSU类似,Magisk不止提供Root的功能,还提供管理应用获取Root的功能,从而避免任意应用乱用Root。
我们可以将Magisk看成一个文件系统,该文件系统通过巧妙的设计实现了各种功能且不对系统文件进行直接修改。
因为Magisk也有自己的模块系统,所以很多人会拿Xposed与Magisk做对比(Xposed与获取Root没有啥关系)。
Xposed的原理是通过劫持Android系统的Zygote进程来加载自己的功能(Zygote进程是App启动时要fork的进程),显然,Xposed需要对文件系统进行相应的修改,容易被检测出来,其与Magisk的直观差别如下图:
关于Magisk获取Root的更多细节可以看Magisk官方文档:Magisk Internal Details(https://topjohnwu.github.io/Magisk/details.html)
参考
Android adb setuid提权漏洞的分析
Android Root原理分析及防Root新思路
Magisk Manager 详解
什么是SafetyNet?如何通过SafetyNet验证?