您的位置:首页 > 移动开发 > Android开发

android root 分析

2014-11-03 22:03 99 查看
关于介绍android
root的文章网上已经有很多,@安卓安全小分队 主要对这些内容进行整理、分析,方便大家研究。对于手机为什么要进行root,主要是由于系统的很多操作必须有root权限才能执行。如:要删掉系统自带的一些应用、开启某些限制的功能、使用一些手机管理软件等。

对于root进行分析,首先需要了解Linux对权限的控制。在Linux系统中文件或目录的访问权限分为读,写和可执行三种,并且有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者,所有者能允许同组用户有权访问文件,还能将文件的访问权限赋予系统中的其他用户。

一般情况下,只有授予了读、写、执行权限的用户才能对其进行相应的操作,但系统中存在一个超级用户root,对应的uid和gid都是0,它具有系统的最高权限,可以不需要授权对任何文件、进程、资源等进行操作。对于android手机的实现root,实际上就是要获取到这个权限,这样我们就能够对手机进行随意的修改,当然这样也会带来很大的风险。

下面看一下如何获取到root权限。手机root一般是通过手机的一些漏洞,将su这个可执行程序放到/system/bin或/system/xbin下面。至于使用漏洞方法,例如不断fork进程使uid溢出,或者使用busybox权限设置不对等,当然这些方法现在都不能使用了,会有人不断的研究新方法进行root,关于这部分就不详细的分析了,需要针对具体手机去网上搜索相应的root方法。

如果想要自己编译su这个可执行程序,就要注意默认版本的su这个可执行程序并不能提供APP的root获取权限,主要是代码做了限制,如下:

int main(int argc, char **argv)

{

struct passwd *pw;

int uid, gid, myuid;

myuid = getuid();

if (myuid != AID_ROOT && myuid != AID_SHELL) {

fprintf(stderr,"su: uid %d not allowed to su\n", myuid);

return 1;

}

…………


其中针对用户ID的检查需要注释掉,否则只有shell用户可以获取root权限。

-rwsr-sr-x root     root       105764 2012-09-11 14:39 su


还有一个需要注意的地方就是su这个进程的权限应该使用chmod设置为6777,前面这个6代表了赋予setuid和setgid的权限,这样任何进程执行了su命令后,就会将该进程变为root用户和root组,这样就拥有了root权限。

execlp("/system/bin/sh", "sh", NULL);
这句代码是在su进程main函数最后执行的,对于shell用户来说比较好理解,运行su后又回到了一个shell的环境。如果对于一个进程来说,我们需要将命令写进该进程的标准输入stdin中,即可使用root权限进行执行。

现在已经有了获取到root权限的方法,对于adb登陆的shell用户来说,只要执行su命令就可以切换到root用户,使用起来比较方便。下面看一下应用程序是如何使用root权限的,APP首先会使用runtime环境执行su这个命令,而对于APP启动到这一步之后,进程就在等待命令执行,这就需要将命令发送到这个有root权限的进程中进行执行。下面是在网上摘抄的一段实现代码:

try {
// Preform su to get root privledges
p = Runtime.getRuntime().exec("su");

// Attempt to write a file to a root-only
DataOutputStream os = new DataOutputStream(p.getOutputStream());
os.writeBytes("echo \"Do I have root?\" >/system/sd/temporary.txt\n");

// Close the terminal
os.writeBytes("exit\n");
os.flush();
}


该段代码即实现了执行su进程,获取root权限,然后获取DataOutputStream,最后将命令写入,即可以root权限执行,值得注意的是,在执行这些命令的同时,app所在进程的权限未发生变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: