关于Root权限获取以及操作data⽬录的⼀点看法
看论坛⾥好多都在root操作data⽬录这⾥出问题,给⼈家回答也没解决,今天⾃⼰学习了下,⼤致总结了下,挺多都是个⼈猜想,欢迎⼤神指导。
以下正⽂:
⼀、关于android的⽤户机制⾸先,Android不同的应⽤拥有不同的进程,进程有独⽴的地址空间,进程与进程间默认是不能互相访问的,是⼀种很可靠的保护机制。
Android通过为每⼀个安装在设备上的包(apk)分配唯⼀的linux userID来实现,名称为"app_"加⼀个数字,⽐如app_43不同的UserID,运⾏在不同的进程,所以apk之间默认便不能相互访问。
⼀般的讲,如果你没有⼿动的设置uid,Android将为每⼀个APK独⽴的分配⼀个进程,⼀个UserId。所以不同的apk之间不能互相访问对⽅的私有数据。Android的系统程序也有它的UId,Android的系统程序的Uid是android.uid.system,所以,普通的apk⽤户是不能访问System的数据。
使⽤adb shell命令,进⼊android的shell,输⼊ls -l
可以看到输出详细的⽂件⽬录信息。例如
drwxrwxr-x root system 2013-10-08 17:25 mnt
最前⾯的第2~10个字符是⽤来表⽰权限。第⼀个字符⼀般⽤来区分⽂件和⽬录,第2~10个字符当中的每3个为⼀组,左边三个字符表⽰所有者权限,中间3个字符表⽰与所有者同⼀组的⽤户的权限,右边3个字符是其他⽤户的权限。这三个⼀组共9个字符,代表的意义如下:r(Read,读取):对⽂件⽽⾔,具有读取⽂件内容的权限;对⽬录来说,具有浏览⽬录的权限。
w(Write,写⼊):对⽂件⽽⾔,具有新增、修改⽂件内容的权限;对⽬录来说,具有删除、移动⽬录内⽂件的权限。
x(eXecute,执⾏):对⽂件⽽⾔,具有执⾏⽂件的权限;对⽬录了来说该⽤户具有进⼊⽬录的权限。
因为其他⽤户组拥有r-x的权限,所以,即便不是⽬录所有者或同组⽤户,也可以读取和执⾏/mnt的东西。
后边的两组表⽰所有者为root,⽤户组为system。
⼆、获取root,操作/data⽬录进⼊整体,操作data⽬录.
之前ls -l 会发现/data⽬录的权限为
drwxrwx--x system system
由此得知,要想操作data⽬录
第⼀种,就是必须为system⽤户组或者有⽤户权限,因为系统应⽤可以访问这些⽬录的,其他⽤户只有执⾏权限。
第⼆种,就是把/data⽬录的权限更改为其他⽤户也可以访问
1、修改/data⽬录权限修改/data权限,必须有root,这个简单。但是需要注意的是,只有执⾏su后的那⼀段流才能继续保持root权限,如果再次调⽤("xxx");这⾥将失去root权限。
⾄于为什么,我猜可能是每⼀次()都是打开⼀个终端,之后的输⼊输出流都是这个终端的输⼊输出,⽽再次执⾏,就相当于关闭了当前终端,你的root权限就么有了。以上这⼀段属猜想,欢迎拍砖。
还有就是,更改了权限,操作完后,就把权限再改回去。
添加权限的cmd= chmod 777 /data
改回去的cmd = chmod 771 /data
具体改权限这块不会的,百度下,就明⽩了。
如果操作过程中,遇到其他类似的问题,活学活⽤应该能解决。
以下为代码,如下。
Runtime runtime = null;
Process process=null;
if (runtime==null) {
Runtime();
try {
("su");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
InputStream InputStream();
OutputStream OutputStream();
cmd=cmd+"\n";
outputStream.Bytes());
outputStream.close();
System.out.println("Execute:"+cmd);
BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
reader.close();
inputStream.close();
System.out.println("Execute End!");
2、让你的APK成为系统应⽤这个理论上是可以实现的,但是有很多限制。如上,所说,系统应⽤⼀般都是
Uid="android.uid.system",但是仅有uid还是不能够成为系统级应⽤的,不然早被⿊成灰了。
添加uid后,同时还需要在对应的Android.mk中添加LOCAL_CERTIFICATE := platform这⼀项。即⽤系统的签名,通过这种⽅式只能使apk的权限升级到system级别,系统中要求root权限才能访问的⽂件,apk还是不能访问。⽐如在android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,这个函数需要root权限或者运⾏与系统进程中才可以⽤。
android获取真正的签名第⼀个⽅法简单点,不过需要在Android系统源码的环境下⽤make来编译:
1. 在应⽤程序的l中的manifest节点中加⼊android:sharedUserId="android.uid.system"这个属性。
2. 修改Android.mk⽂件,加⼊LOCAL_CERTIFICATE := platform这⼀⾏
3. 使⽤mm命令来编译,⽣成的apk就有修改系统时间的权限了。
第⼆个⽅法是直接把eclipse编出来的apk⽤系统的签名⽂件签名
1. 加⼊android:sharedUserId="android.uid.system"这个属性。
2. 使⽤eclipse编译出apk⽂件。
3. 使⽤⽬标系统的platform密钥来重新给apk⽂件签名。⾸先到密钥⽂件,在我ndroid源码⽬录中的位置是"build/target /product/security",下⾯的platform.pk8和platform.x509.pem两个⽂件。然后⽤Android提供的 Signapk⼯具来签名,signapk 的源代码是在"build/tools/signapk"下,编译后在out/host/linux-x86 /framework下,⽤法为java -jar signapk.jar
platform.x509.pem platform.pk8 input.apk output.apk"。
加⼊android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同⼀个User id的多个APK可以配置成运⾏在同⼀个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运⾏在系统进程中,这样就有权限来修改系统时间了。
只是加⼊UID还不够,如果这时候安装APK的话发现⽆法安装,提⽰签名不符,原因是程序想要运⾏在系统进程中还要有⽬标系统的platform key,就是上⾯第⼆个⽅法提到的platform.pk8和platform.x509.pem两个⽂件。⽤这两个key签名后apk才真正可以放⼊系统进程中。第⼀个⽅法中加⼊LOCAL_CERTIFICATE := platform其实就是⽤这两个key来签名。
这也有⼀个问题,就是这样⽣成的程序只有在原始的Android系统或者是⾃⼰编译的系统中才可以⽤,因为这样的系统才可以拿到platform.pk8 和platform.x509.pem两个⽂件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运⾏OK,不过放到G3上安装直接提⽰"Package ... has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。
以上内容部分参考⾃:
blog.csdn/superkris/article/details/7709504#t11
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论