Android 操作系统获取Root权限 原理详细解析

前端技术 2023/09/08 Android

android root权限破解分析

许多机友新购来的Android机器没有破解过Root权限,无法使用一些需要高权限的软件,以及进行一些高权限的操作,其实破解手机Root权限是比较简单及安全的,破解Root权限的原理就是在手机的/system/bin/或/system/xbin/目录下放置一个可执行文件“su”,这是一个二进制文件,相当于电脑上的exe文件,仅仅在系统中置入这个“su”文件是不会给手机的软件或硬件造成任何故障。

下面的代码是android系统原版的su中的部分代码,可以看出只允许getuid()为AID_ROOT和AID_SHELL的进程可以使用su进行登陆。

复制代码 代码如下:

<SPAN style=\"FONT-SIZE: 18px\"><STRONG>/* Until we have something better, only root and the shell can use su. */
myuid = getuid();
if (myuid != AID_ROOT && myuid != AID_SHELL) {
fprintf(stderr,\"su: uid %d not allowed to su\\n\", myuid);
return 1;
}</STRONG></SPAN>

面在Superuser这个android程序中的su不再有上面的一部分,这样任何进程都可以使用su进行登陆了,有一部分android程序要使用root权限可能的用法类似于(这个也是Superuser中的一部分代码):
复制代码 代码如下:

Process process = Runtime.getRuntime().exec(\"su\");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes(\"mount -oremount,rw /dev/block/mtdblock3 /system\\n\");
os.writeBytes(\"busybox cp /data/data/com.koushikdutta.superuser/su /system/bin/su\\n\");
os.writeBytes(\"busybox chown 0:0 /system/bin/su\\n\");
os.writeBytes(\"chmod 4755 /system/bin/su\\n\");
os.writeBytes(\"exit\\n\");
os.flush();

而在上面提到的Superuser和android程序中的su源码中都有这部分代码:
复制代码 代码如下:

if(setgid(gid) || setuid(uid)) {
fprintf(stderr,\"su: permission denied\\n\");
return 1;
}

看上去这里就是进行权限切换的地方了。面普通用户要能使用su,su的权限要是这样:

-rwsr-xr-x. 1 root root 34904 11月 3 2010 /bin/su

这个和电脑版的su上是一样的。

从出上面的分析可以认为破解android的root权限的实质是:在系统中加入一个任何用户都可能用于登陆的su命令。当然这首先要取得root权限才能做

到。在z4root这个android下的破解android的root权限的程序中有一个rageagainstthecage,可能就是设法得到root权限的程序。


第二篇文章:

如果你进行过程序开发,在root过的手机上面获得root权限的代码如下:

复制代码 代码如下:

Process process = Runtime.getRuntime().exec(\"su\");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
......
os.writeBytes(\"exit\\n\");
os.flush();

从上面代码我们可以看到首先要运行su程序,其实root的秘密都在su程序中,《android root权限破解分析》中讲到Android系统默认的su程序只能root和shell可以用运行su,这个是安全的。如果把这个限制拿掉,就是root破解了!

下面我们仔细分析一下程序是怎样获得root权限的,如果对Linux的su命令熟悉的朋友可能知道su程序都设置SUID位,我们查看一下我的手机(已经root破解)上的su权限设置,



我们发现su的所有者和所有组都是root,是其实是busybox的软链接,我们查看busybox的属性发现,其设置了SUID和SGID,并且所有者和所有组都是root。SUID和SGID的作用是什么呢?如果你不太清楚,请参考《Linux进程的实际用户ID和有效用户ID》,这样运行busybox的普通用户,busybox运行过程中获得的是root的有效用户。su程序则是把自己启动一个新的程序,并把自己权限提升至root(我们前面提到su其实就是busybox,运行期它的权限是root,当然也有权限来提升自己的权限)。

再强调一下不光root手机上su需要设置SUID,所有的Linux系统上的su程序都需要设置SUID位。请参考一下UC服务器的su的权限情况:

我们发现su也设置了SUID位,这样普通用户也可以运行su程序,su程序会验证root密码,如果正确su程序可以把用户权限提高的root(因为其设置SUID位,运行期是root权限,这样其有权限提升自己的权限)。

这样我们就可以看出其实Android系统的破解的根本原理就是替换掉系统中的su程序,因为系统中的默认su程序需要验证实际用户权限(只有root和 shell用户才有权运行系统默认的su程序,其他用户运行都会返回错误)。而破解后的su将不检查实际用户权限,这样普通的用户也将可以运行su程序, 也可以通过su程序将自己的权限提升。

到这里大家对root破解不感到神秘了吧。root破解没有利用什么Linux内核漏洞(Linux内核不可能有这么大的漏洞存在),可以理解成root 破解就是在你系统中植入“木马su”,说它是“木马”一点儿都不为过,假如恶意程序在系统中运行也可以通过su来提升自己的权限的这样的结果将会是灾难性 的。所以一般情况下root过手机都会有一个SuperUser应用程序来让用户管理允许谁获得root权限,也算是给系统加了一层保险吧!

通过上文《Android系统root破解原理分析》 的介绍大家应该明白了root破解过程的终极目标是替换掉系统中的su程序。但是要想替换掉系统中su程序本身就是需要root权限的,怎样在root破 解过程中获得root权限,成为我们研究的重点了。下面我们先清点一下我们需要破解系统情况,假设需要破解的Android系统具备如下条件:

复制代码 代码如下:

1、可以通过adb连接到设备,一般意味着驱动程序已经安装。
2、但是adb获得用户权限是shell用户,而不是root。

要想理解root破解过程我们首先需要了解一下adb工具,SDK中包含adb工具,设备端有adbd服务程序后台 运行,为开发机的adb程序提供服务,adbd的权限,决定了adb的权限。具体用户可查看/system/core/adb下的源码,查看 Android.mk你将会发现adb和adbd其实是一份代码,然后通过宏来编译。

查看adb.c的adb_main函数你将会发现adbd中有如下代码:

复制代码 代码如下:

int adb_main(int is_daemon)
{
    ......
    property_get(\"ro.secure\", value, \"\");
    if (strcmp(value, \"1\") == 0) {
        // don\'t run as root if ro.secure is set...
        secure = 1;
        ......
    }

    if (secure) {
        ......

本文地址:https://www.stayed.cn/item/21856

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。