Android APK权限提升到System
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就有修改系统时间的权限了。
更多推荐
所有评论(0)