如何让应⽤程序获取system权限、root权限
获取system权限
上⼀篇随笔简单介绍了下Android权限的⼀些规则,我们发现很多事如果没有system权限基本上⽆法完成,那么如何让⾃⼰的应⽤获取system权限呢?
⼀般情况下,设定apk的权限,可在l中添加android:sharedUserId=">
例如:给apk添加system权限
1<manifest xmlns:android="schemas.android/apk/res/android"
2 ... ...
3 android:sharedUserId="android.uid.system">
同时还需要在对应的Android.mk中添加LOCAL_CERTIFICATE := platform这⼀项。即⽤系统的签名,通过这种⽅式只能使apk的权限升级到system级别,系统中要求root权限才能访问的⽂件,apk还是不能
访问。⽐如在android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,这个函数需要root权限或者运⾏与系统进程中才可以⽤。
第⼀个⽅法简单点,不过需要在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"这个属性。
android获取真正的签名2. 使⽤eclipse编译出apk⽂件。
3. 使⽤⽬标系统的platform密钥来重新给apk⽂件签名。⾸先到密钥⽂件,在Android源码⽬录中的位置是"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"这个属性。通过sharedUserId,拥有同⼀个UserId的多个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",这样也是保护了系统的安全。
获取Root权限
⼀般linux 获取root权限是通过执⾏su命令,那能不能在apk程序中也同样执⾏⼀下该命令呢?Linux 编程中,有⼀组函数族:
1 int execl(const char *path, const char *arg, ...);
2
3 int execlp(const char *file, const char *arg, ...);
4
5 int execle(const char *path, const char *arg, ..., char *const envp[]);
6
7 int execv(const char *path, char *const argv[]);
8
9 int execvp(const char *file, char *const argv[]);
10
11 int execve(const char *path, char *const argv[], char *const envp[]);
在java中我们可以借助 Runtime().exec( command)访问底层Linux下的程序或脚本,这样就能执⾏su命令,使apk具有root 权限,能够访问系统中需要root权限才能执⾏的程序或脚本了。
还是举个例⼦,
1public class VisitRootfileActivity extends Activity {
2private static final String TAG = "VisitRootfileActivity";
3 Process process = null;
4 Process process1 = null;
5 DataOutputStream os = null;
6 DataInputStream is = null;
7/** Called when the activity is first created. */
8 @Override
9public void onCreate(Bundle savedInstanceState) {
11 setContentView(R.layout.main);
12try {
13 process = Runtime().exec("/system/xbin/su"); /*这⾥可能需要修改su 14
15的源代码(注掉 if (myuid != AID_ROOT && myuid != AID_SHELL) {*/
16
17 os = new OutputStream());
18 is = new InputStream());
19 os.writeBytes("/system/bin/ls" + " \n"); //这⾥可以执⾏具有root 权限的程序了
20 os.writeBytes(" exit \n");
21 os.flush();
22 process.waitFor();
23 } catch (Exception e) {
24 Log.e(TAG, "Unexpected error - Here is what I know:" + e.getMessage());
25 } finally {
26try {
27if (os != null) {
28 os.close();
29 }
30if (is != null) {
31 is.close();
32 }
33 process.destroy();
34 } catch (Exception e) {
35 }
36 }// get the root privileges
37 }
38 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论