关于真机测试root权限问题

 普通用户好像也无伤大雅:

输入后看到这样的有个美元符号,说明你的虚拟机获取不了权限,有权限的应该是root和#都有,这个时候你输入su 如果还是没有变化,看看你的虚拟机是不是android7.0,Android 7.0的模拟器是没有root权限的,你再换个6.0的设备运行,输入adb shell后就显示正常。,因为真机是不给提供root权限的,如果只是测试不必,开发的话建议用模拟器比如Genymotion可以直接root权限。

关于安卓root原理实现,回到先有鸡还是先有蛋的问题

前言
一直很好奇Android Root的原理,恰好最近碰到了一个跟Android默认带Root权限的问题,这里顺便记录一下Android系统root的原理。

原理
Android是基于Llinux内核的开源操作系统,与Ubuntu系统类似,所以在Android里获取root权限其实和在Linux系统下获取root权限是一回事。在Linux系统下获取root权限的方法是在命令行执行sudo或者su,接下来输入提权密码就可以获取root权限了。Android系统其实也是这样,例如应用层程序开发,在root过的手机上运行root权限的代码如下所示:

?
1
2
3
4
5
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
......
os.writeBytes("HelloWorld!\n");
os.flush();

我们可以看到,Android应用程序获取root权限也是需要执行su命令,因此Android能够root的密码都在su程序上。但是,Android本身是不想让你获取root权限的,因此大部分手机出厂都是user版本,默认是不带su这个二进制程序的。所以你想获取Android的root权限,第一步就是要把编译好的su文件拷贝到Android手机的/system/bin或/system/xbin目录下(为什么要拷贝到/system目录下,是因为这个分区是没有nosuid限制的,同时/system/bin和/system/xbin又都是系统环境变量PATH里的路径,可以直接执行su)。我们先假设你可以把编译好的su程序放在xbin或者bin目录下,接下来你可以在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权限怎么办?这就是接下来要讨论的问题。
我们在Ubuntu下查看/usr/bin/passwd文件的权限,如下图所示:

201584121826750.jpg (611×46)

这个文件的权限比较特殊,Linux用户一般都知道文件分为r、w、x权限,那这个s是神马意思呢?这里回答一下,s代表当任何一个用户执行该文件的时候都拥有文件所有者的权限,这文件所有者是root。简单来说,就是不管谁执行这个文件,他执行的时候都是以root身份来执行的。
看到这里,大家是不是都有思路了,也就是说,即使我不是root用户也可能以root用户的身份来执行程序,那么我把一个所有者是root的su程序权限标志位设置为-rwsr-xr-x,那么不管是谁执行它,都是以root身份执行。这就牛逼了,su果断可以执行成功,那你也就可以顺利的获取root权限了。

破解
原理都清楚了,那root的过程其实就是分两步:
1. 把一个所有者是root的su拷贝到Android手机上。
2. 把su的权限标志位设置成-rwsr-xr-x。
写成代码大概如下所示:

?
1
2
3
cp /sdcard/su /system/xbin/
chown root:root /system/xbin/su
chmod 4755 /system/xbin/su

代码看起来很简单,但是想真正的运行成功,以上代码每一句都需要root权限执行。我擦,一下回到解放前,跟先有鸡还是先有蛋的问题类似,代码运行需要root权限,而代码本身的目的就是获取root权限,成了一个封闭的死循环了。但是所幸Android系统有Bug,因此就给了你打破这个死循环的机会。
打破的方法就是找一个本身已经有root权限的进程来运行这个3行的shell脚本,这样脚本就可以顺利执行了。但是已经有root权限的进程都是出厂时候就装到手机上的,代码写死了,你没法控制它执行自己的代码啊,这个时候就需要查找漏洞了。例如Android2.3 root权限的zergRush漏洞就是利用一个拥有root权限的进程栈溢出漏洞。具体利用漏洞的方法大家就可以自行google了。

防止root
通过上述分析,我们可以简单的理解,解决Android系统能够su提权的方法就是把su文件干掉就可以了

配上经典的一句话’With great power, comes great responsibility.”

root是很危险的。但不代表root之后你的手机就很危险,安全与危险全部取决在你自己的手里,一些恶意软件肆意要求各种权限,或许软件根本用不到,这时候你就要提防一下了,如果你给了它权限就是把你家钥匙交给他了。所以准备好去承担一个超级用户责任再去成为一个超级用户。

享受方便的同时,你的风险也越大。如果root带给你的便利远远大于root带来的风险,去吧!

1.如果处理不当,你的手机可能会变成一块砖,当然也有很多补救措施。也就是如果你搞乱了root的过程,代码的修改,你的手机软件你严重受损这时候你的手机就和砖没啥两样了。

2.没有保修。root是合法的,但是一旦root就脱离保修。不论软件还是硬件故障,制造商都不会负责。

3.恶意软件很轻易的就能打破你手机安全。root权限会绕过安卓OS设置的安全限制。病毒蠕虫恶意软件都可以从根源上感染。但目前没有大范围的类似现象发生。一旦发生他就全权接管你的手机,银行卡社交各种,即裸奔。

最重要的是第三点,所以给手机一些安全防护也是必要的。鉴于没有大范围时间发生,这个领域好像还挺ok。很多人喜欢安装xposed上的一些模块,需要长一个心眼,不乏有一些模块开发者图谋不轨。

一些建议:

root过后的手机下载一些金融理财等软件要慎重。

root手机最好当副机使用,做做开发,刷刷命令,体验安卓.......

有条件的使用原生安卓,没错,原生安卓才是最好的安卓。没毛病。如果google原生态,在Google play上下载所需,国外这方面相较国内还是安全很多,开发者和用户对隐私方面都很看重。

切忌随便使用国内一些乱七八糟的软件下载助手。

总之root过后,你必须确保每一步操作都在干嘛,仅此而已。安全和危险都是相对的。你能获取root就证明整个安卓系统都是有漏洞的。不耸人听闻,360最近发现的水滴漏洞,有兴趣可以了解。

猜你喜欢

转载自www.cnblogs.com/SunshineKimi/p/12244067.html
今日推荐