本文转载自微信公众号《懒惰编程》作者ayuliao。转载本文请联系LazyProgramming公众号。最近在研究Android逆向工程,涉及到Android的root。root的方法有很多种。本文将对其进行简要总结。这是一篇没有代码层面分析的科普文章。AndroidRoot的核心原理Android内核其实就是Linux,所以Android需要获取Root权限,其实相当于内核的Linux系统获取Root权限。用过Linux的都知道,我们可以通过sudo或者su获取Root权限。不同的是,sudo是临时获取Root权限,而su是一直获取Root权限。因为root权限是危险的,例如,用户可以删除任意文件。如果不小心删除了Android核心代码文件,手机将无法正常使用。为了避免这种情况,安卓手机默认不会提供进入root权限的功能,也就是少了su程序。如果想让Android获得Root权限,那么首先需要编译su程序文件,然后复制到PATH(环境变量)中,并赋予su文件执行权限。安卓手机的PATH是:/sbin/vendor/bin/system/sbin/system/bin/system/xbin刷机时,一般把su程序文件放到/system/xbin目录下,这样就可以连上安卓了通过adbshell手机安装完成后,可以通过su命令进入Root权限。原理就是这个原理,但是在实际操作中,会出现逻辑上的死锁。我们需要Root权限才能将su文件复制到AndroidPATH中,但是我们目前没有Root权限。将su文件复制到PATH中的目的是为了获得Root权限,于是我们陷入了进退两难的境地。一键Root要想获得Root权限,就需要突破这个逻辑僵局。几年前,市场上有很多一键Root软件。在当时,安卓手机最简单的root方法就是从应用商店下载这些一键root软件,然后使用这些软件就可以轻松让android获得root权限。.这类一键root软件会利用Android系统的漏洞获取一个具有root权限的进程,然后利用这个进程将su文件复制到/system/xbin目录下,并赋予su文件执行权限。随着Android的发展,很多漏洞都被堵上了,这种一键Root的软件是没有用的。另外,很多一键Root的软件和流氓软件没什么区别,因为拥有最高权限,你可以在安卓手机上进行各种流氓操作,而你却无能为力。刷入Recovery现在获取AndroidRoot,比较常见的方式是刷入第三方Recovery,然后使用Recovery刷入程序获取Root。什么是恢复?一部Android手机通常有两个系统,一个是Android系统本身,也就是用户开机默认会使用的系统,一个是Recovery系统。本系统的主要功能是对Android系统进行操作。比如Android系统启动失败,这时候就需要Recovery系统。大多数手机厂商都会让用户通过长按电源键+音量键进入Recovery系统,如下图:进入Recovery后,就可以恢复安卓系统了。它可以自由管理自己。这个时候我们就通过Recovery刷写su文件,从而获得root的Android系统。如果你使用的不是谷歌自家儿子(如:Nexus),而是使用国产厂商的手机,如小米、华为等,同样需要突破BootLoader锁带来的限制。BootLoader是当您按下手机开机时第一个启动的程序。它的主要功能是拉起整个Android系统和Recovery系统。但是国内厂商会锁定BootLoader,让手机只能运行经过厂商验证的。Android系统和Recovery,而厂商自带的Recovery通常是阉割过的,无法让Android获得Root权限。对于国产厂商的玩家来说,获取Root的第一步就是解锁BootLoader。解锁分为官方解锁和强制解锁。比如你用的是小米手机,想刷机,可以去小米论坛申请官方解锁,但是有些手机不支持官方解锁。这个时候只能自己搜索解决方案,进行强制解锁。目前最常用的第三方Recovery叫TWRP(TeamWinRecoveryProject),是国外安卓爱好者开发的一款工具。你需要根据你的安卓机型找到对应版本的TWRP。注意,我们刷入第三方Recovery后,并不代表Root完成了。我们只是需要一个更强大的Recovery来帮助我们刷入可以获取Root的程序。SuperSU和MagiskSuperSU和Magisk都是知名的Root管理程序,都可以通过TWRP刷机,然后让Android获得Root权限,但两者有较大的区别。SuperSUSuperSU由Chainfire开发。几年前,它是当之无愧的安卓获取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的管理。在Android6.0中,Google在Android系统中加入了SafetyNet程序。这个程序的主要功能是监控系统API。如果发现系统API被修改或系统完整性测试失败,会通知使用该功能的应用程序,而SuperSU更改系统文件和添加文件到Android系统分区的方法会被SafetyNet程序检测到,这会导致很多通过SuperSU获得Root的用户无法使用GooglePlay、Netflix等使用该程序的应用安全网功能。获取任何OTA更新(OverTheAirUpdates、OverTheAirUpdates)。关于SuperSU获取Root的更多细节,可以阅读Chainfire写的How-ToSU(http://su.chainfire.eu/)。MagiskSuperSU被收购,开源版本只能支持Android7.0,Magisk抢先一步。Magisk实现Root的方式是通过Recovery将自己的su程序烧写到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官方文档:MagiskInternalDetails(https://topjohnwu.github.io/Magisk/details.html)参考Androidadbsetuid提权漏洞分析AndroidRoot原理分析及防root新思路MagiskManager详解什么是SafetyNet?如何通过SafetyNet验证?
