Android的root学习

Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿。在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示输入root用户的密码,密码正确就获得root权限了。

Android系统中,要想办法把编译好的su文件拷贝到Android手机的/system/bin或者/system/xbin/目录下,并且设置好权限才可以。Linux下su以后输入密码就可以root了,但Android里的su和Linux里的su是不一样的,Android里的su不是靠验证密码的,而是看你原来的权限是什么。意思就是如果你是root,那你可以通过su切换到别的用户,比如说shell,wifi,audio什么的。但如果你是root之外的其他用户,就不能切换回root了,会提示你permission denied。也就说用root运行su才有用。

文件的权限:rws,它的执行权限标志位是一个s,s代表当任何一个用户执行该文件的时候都拥有文件所有者的权限,这文件的所有者是root,简单点说就是不管谁执行这个文件,他执行的时候都是以root身份执行的。
也就说即使我不是root也有可能以root身份来执行程序,那么我就把一个所有者是root的su程序权限标志位置成-rwsr-xr-x,那么不管谁执行它,都是root身份执行,su就可以顺利执行成功了,执行成功之后我就是root身份了。

问题都清楚了,就是你需要把一个所有者是root的su拷贝到Android手机上,并且把su的权限标志位置成-rwsr-xr-x。能把这个事情搞定你就成功root了一个手机。
大概意思就是两行代码:
cp /data/tmp/su /system/bin/ #copy su 到/system/分区
chown root:root su #su的所有者置成root
chmod 4775 /system/bin/su #把su置成-rwsr-xr-x

 
为什么su一定要放到/system/bin/or xbin等系统目录下?
su不能放在data分区,研究了一下发现,原因是因为data分区在mount时就指定了不能给可执行程序加s位。
在adb shell里执行mount,找到data分区的挂载,就可以看到是nosuid:
 
 
可以重新挂载data分区达到目的:
1、可以先把su文件放在data分区,设置好权限:
adb shell
cd data
chmod 4777 su
2、此时,不能自由的在root和shell之间切换(system/bin or xbin等系统目录可以)
3、需要重新挂载一次data分区:
命令模式,类似这样:mount -o rw,remount -t ext4 /system
根据实际情况改为:mount -o rw,seclabel,suid,nodev,noatime,background_gc=on,discard,user_xattr,inline_xattr,acl,inline_data,inline_dentry,extent_cache,inline_encrypt,active_logs=6,remount -t f2fs /data
此时执行相同的命令,不会再被拒绝,可以自由的在root和shell之间切换:
 
 
 
参考文章:https://www.zhihu.com/question/21074979
 
posted on 2017-04-22 10:56  BeyondFeng  阅读(515)  评论(0编辑  收藏  举报