在本期的文章中,我们将讨论安卓开发者们使用的一项技术——检查当前app运行的安卓设备是否已经root。对于应用程序来说,检查当前设备是否已经root是有很多好处的。很多是否我们需要root权限来安装一些工具,但这样可能造成安全隐患。

出于安全原因,很多应用程序不允许在已经root的设备上运行,我曾经见过一些手机银行app会自动检查设备是否已经root,并会在已经root的设备上停止运行。本期文章我会给大家讲解开发者们检查设备是否已经root的几种常用方法和一些绕过技术。

常见检测设备是否已经root的技术

下面从几种被应用程序广泛使用的检测技术开始说起。

如果设备已经root,会增加一些新的文件,所以可以通过检测这些文件是否存在来判断,还有一些开发者通过检查能否执行只有root权限下才能运行的命令来判断,当然还有一些其他的手段,下面一一道来。

1. Superuser.apk是一个被广泛使用的用来root安卓设备的软件,所以可以检查这个app是否存在。

安卓-8-Root的检测和绕过-JE2Se ' Blog

2. 还可以搜索一些特殊的package,比如下图所展示的

安卓-8-Root的检测和绕过-JE2Se ' Blog

上面的图片展示了一个叫做“eu.chainfire.supersu”的package,我曾经见过一些应用程序检测它。

3. 有一些应用程序只能在root的设备上运行,所以检查他们是否存在也是一个不错的方法。比如众所周知的Busybox:

安卓-8-Root的检测和绕过-JE2Se ' Blog

4. 运行“su”和“id”,然后查看uid来检查。

安卓-8-Root的检测和绕过-JE2Se ' Blog

上面是一些开发者们常用的方法来判断设备是否已经root,当然还有一些别的方法没有提到,以后我们会讲。

绕过root检测——demo

在这一章节,我们来讲讲如何绕过root检查,下载下面的软件

http://yunpan.cn/cfrXty5f7DDYT (提取码:fd17)

然后点击Is my device rooted按钮会检测设备是否已经root,我的设备目前已经root了,如下图:

安卓-8-Root的检测和绕过-JE2Se ' Blog

下面我们开始。

理解程序的原理

我们首先要知道这个app是如何检测设备是否已经root的。先看下面的代码:

安卓-8-Root的检测和绕过-JE2Se ' Blog

可以看出他简单的检查了/system/app/目录下是否存在Superuser.apk,如果存在,显示“Device Rooted(设备已经越狱)”。我有n种姿势可以绕过:

1. 首先我们通过su和id来再次确认设备是否root

安卓-8-Root的检测和绕过-JE2Se ' Blog

2. 看看/system/app/目录下是否存在Superuser.apk

安卓-8-Root的检测和绕过-JE2Se ' Blog

3. 我们修改一下应用的名字试试,改成Superuser0.apk吧。

安卓-8-Root的检测和绕过-JE2Se ' Blog

啊哦,报错了,他是一个只读文件。

4. 那我们就把他改成可读写文件!

安卓-8-Root的检测和绕过-JE2Se ' Blog

5. 改下名字

安卓-8-Root的检测和绕过-JE2Se ' Blog

6. 下面再检查一下:

安卓-8-Root的检测和绕过-JE2Se ' Blog

显示“Device Not Rooted(设备没有root)”

当然上面只是一个很简单的例子,对于那些初级的开发者还是有一些效果的,当然对于一些比较牛x的开发者,可能就没那么简单了,他们会用各种复杂的方法来检查。比如他们会通过下面的方法检查

Runtime.getRuntime().exec(“su”);

这样子的话我们也要改变一下,比如修改su命令来绕过。

总结

开发者阻止程序在root的设备上运行从安全的角度来说是一个不错的主意。但是大多时候这一检测可以被轻易的绕过,这就要求开发者们去寻找更复杂更高级的方法来检测,只有这样才能更好地防御攻击。