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

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

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

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

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

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

t0132de5d91cb5b3ad9.png

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

t019f4eb6ac4d7ae833.png

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

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

t018a385329aeb8c77e.png

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

t019ac6e896fd403534.png

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

绕过root检测——demo

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

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

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

http://p4.qhimg.com/t01565c9ae5b142d975.png

下面我们开始。

理解程序的原理

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

t016c865e78c01b2c4b.png

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

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

http://p3.qhimg.com/t01f2575fda38b8fed3.png

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

http://p9.qhimg.com/t01ec3daa82c3cfb471.png

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

http://p2.qhimg.com/t0179f023d89ec32b31.png

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

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

http://p0.qhimg.com/t0113136165fb56e1bc.png

5. 改下名字

http://p7.qhimg.com/t019a15b45a73437931.png

6. 下面再检查一下:

http://p5.qhimg.com/t019fd68e6b8c53a3a7.png

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

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

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

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

总结

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



本文转载自 360安全播报

原文链接: 翻译自http://resources.infosecinstitute.com/android-hacking-security-part-8-root-detection-evasion/