1 简介:

在Android系统中,每一个应用程序都被分配一个唯一的linux userID,以“app_"开头,这些应用程序都有独立的进程地址空间。默认情况下,互相无法进行访问。当然,每一个Android进程也都有一个linux userID。
同时,Android还提供了一种机制,可以使两个应用程序进程互相访问对方的资源,这就是共享userID机制。

2 userID举例说明:

下表是一个手机中的进程列表信息:

USER     PID   PPID  VSIZE RSS   WCHAN    PC         NAME
root     1     0     548   196   c00b8c14 0000d5cc S /init
root     2     0     0     0     c006bf70 00000000 S kthreadd
......
system   727   1     840   188   c022d8a0 afe0c47c S /system/bin/servicemanager
radio    733   1     12796 648   ffffffff beaab18c S /system/bin/rild
root     734   1     72000 14172 c00b92b0 afe0c5a4 S zygote
root     735   1     33848 4512  ffffffff afe0c47c S /system/bin/mediaserver
system   825   734   574128 28360 ffffffff afe0c47c S system_server

radio    877   734   158260 20040 ffffffff afe0d404 S com.android.phone
app_5    879   734   100888 13616 ffffffff afe0d404 S android.process.acore
system   882   734   144664 24296 ffffffff afe0d404 S android.process.omsservice
app_45   884   734   92304 10932 ffffffff afe0d404 S com.motorola.motohome
app_22   890   734   117068 30228 ffffffff afe0d404 S oms.home
system   1018  734   94732 13792 ffffffff afe0d404 S oms.dm
app_14   1025  734   95636 13036 ffffffff afe0d404 S com.android.calendar

app_47   1157  734   100204 15964 ffffffff afe0d404 S com.motorola.camera
app_11   1183  734   122672 23576 ffffffff afe0d404 S com.android.browser
app_6    1199  734   117032 20388 ffffffff afe0d404 S oms.mobilemusic
system   1244  734   99292 15940 ffffffff afe0d404 S com.android.settings

root     1684  1     3364  176   ffffffff 0000e8f4 S /sbin/adbd
root     1692  1684  776   348   c0059cd4 afe0d0ac S /system/bin/sh
root     1724  1692  920   356   00000000 afe0c1dc R ps

说明: 

(1)典型的userId类型有:

root,system,radio,app_xxx

(2) system: 系统用户,例如

    /system/bin/servicemanager: 是一个守护进程,用于通过binder进行service的管理;
    com.android.settings:即“设置”app所在的进程,同时,这也是它的包名

(3)radio:射频相关,例如:

    /system/bin/rild: 一个守护进程,用于打电话等底层的实现;

    com.android.phone:打电话App;

(4)app_xxx: 各种app。

3 原理

共享userID机制的原理是:
在AndroidManifest.xml中利用sharedUserId属性给不同的package分配相同的userID,通过这样做,两个package可以被当做同一个程序,
系统会分配给两个程序相同的UserID。当然,基于安全考虑,两个apk需要相同的签名。

这样,只要让app获取了系统userID(即“system”),这个app就能够取得系统权限。有了系统权限,就可以访问到一些“只有系统权限才能访问的资源”,例如SystemClock.setCurrentTimeMillis()修改系统时间,WRITE_SECURE_SETTINGS权限等。

4 提升到System权限的方法一:

通过修改Apk,重新打包来实现。步骤如下:

(1).添加sharedUserId:

在AndroidManifest.xml中的manifest节点中添加 android:sharedUserId="android.uid.system"。

(2).编译成apk。

(3).删除签名校验文件:

          编译成apk后用压缩工具打开apk,把META-INF目录中的CERT.SF、CERT.RSA 两个文件删除。

(4).重新签名: 

          使用android自带的签名工具signapk.jar 以及源码中的platform.x509.pem,platform.pk8 对apk进行重新签名。方法如下:

   执行:java -jar signapk.jar  platform.x509.pem platform.pk8 old.apk new.apk 执行后new.apk即为签名后的文件。

   (注:执行命令时所有文件这里放在同一目录下,如果不在同一目录请修改路径)。

  文件platform.x509.pem和platform.pk8我们可以在源码的 build/target/product/security中找到。signapk.jar 可以编译build/tools/signapk/ 得到。

(5).重新安装apk:

          签名后就可以安装使用了

5 提升到System权限的方法二:

需要在android源码编译环境中,修改Android.mk的方式来实现的。

核心步骤如下:

(1). 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。

(2). 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

(3). 使用mm命令来编译,生成的apk就有修改系统时间的权限了。


GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐