首页 > 代码库 > Android提权原理
Android提权原理
Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿。 你想在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示你输入root用户的密码,密码正确就获得root权限了。
Android本身就不想让你获得Root权限,大部分手机出厂的时候根本就没有su这个程序。所以你想获得Android的root权限,第一步就是要把编译好的su文件拷贝到Android手机的/system/bin或者/system/xbin/目录下。我们先假设你可以把su放在xbin下,接下来你可以在Android手机的adb shell或者串口下输入su了。 Linux下su以后输入密码就可以root了,但Android里的su和Linux里的su是不一样的,Android里的su不是靠验证密码的,而是看你原来的权限是什么。意思就是如果你是root,那你可以通过su切换到别的用户,比如说shell,wifi,audio什么的。但如果你是root之外的其他用户,就不能切换回root了,会提示你permission denied。也就说用root运行su才有用,但我这个时候还没有root怎么办呢?这就涉及到另外个问题。
一般我们在Linux的console下输入 ls -l 会列出所有文件的权限。 比如:-rwxr-xr-x,用过Linux的人都知道r代表该文件可读,w代表可写,x代表可执行,-就代表没有该权限。第一个rwx代表文件所有者的权限,第二个rwx代表和所有者同组人的权限,第三个rwx代表其他用户对该文件的权限。但下面这个文件就比较特殊:
rws,它的执行权限标志位是一个s,s代表当任何一个用户执行该文件的时候都拥有文件所有者的权限,linux系统中,当前用户执行的程序,该程序进程的有效用户ID(Effective UID)就是当前用户,但拥有s(set uid)权限的程序,其进程的有效用户ID是这个程序的所有者。换句话说,有set uid权限的程序,运行之后,就相当于所有者运行了这个程序,如果所有者是root,那这个进程也拥有root权限。简单点说就是不管谁执行这个文件,他执行的时候都是以root身份执行的。也就说即使我不是root也有可能以root身份来执行程序。
同理,我们可以把一个所有者是root的su程序权限标志位置成-rwsr-xr-x,那么不管谁执行它,都是以root身份执行,su就可以顺利执行,获取root权限了。所以说能够正常授权的su,其所有者必须是root,否则不能正常授权。
问题都清楚了,就是你需要把一个所有者是root的su拷贝到Android手机上,并且把su的权限标志位置成-rwsr-xr-x。能把这个事情搞定你就成功root了一个手机。
看以下代码:
mount -o remount,rw /system #重挂载system使system可写入 cat /sdcard/su > /system/xbin/su #拷贝su到/system/xbin/ chown root.root /system/xbin/su #su的所有者置成root chmod 6755 /system/xbin/su #把su置成-rwsr-xr-x mount -o remount,ro /system #出于安全考虑,完事后remount回只读
在没有root权限的情况下,我们可以通过chmod来设置s权限,但是不能使用chown来修改su的所有者为root(提示Unable to chown su: Operation not permitted)。也就是说你只有在有root权限的情况下才能执行中间两行代码,所以只有破解到了root权限,才能设置su的所有者是root,才能有可正常使用的su。但是这两行代码就是为了让你获得root权限的,这是一个逻辑闭环,那么如何打破这个逻辑闭环呢?
一个办法就是找一个本身已经有root权限的进程来启动我上面的两行代码,那我这两行代码一启动就是root权限,就可以顺利执行了。但是已经有root权限的进程都是出厂时候就装到手机上的,代码写死了,你没法控制它执行你自己的代码啊。
我们可以用zergRush破解root权限(具体代码见https://github.com/revolutionary/zergRush/blob/master/zergRush.c),然后用root权限启动adbd,电脑端用adb登陆之后直接就拥有了root权限,然后设置su权限和所有者,重挂载system使system可写入,然后拷贝su到/system/xbin/并安装SuperSu,重启手机。
我们还可以通过安装SuperSu,破解root权限,设置su的权限和所有者,重启手机,执行su,重挂载system,拷贝su自身到/system/xbin。重挂载system并拷贝su到xbin只是为了让应用程序更容易调用su罢了。
参考资料:http://www.zhihu.com/question/21074979
Android提权原理