Android APK权限提升到System

本文详细介绍了在Android系统中,如何通过共享userID机制使不同应用进程互相访问对方资源,以及如何通过修改APK文件提升特定应用至系统权限状态。包括具体操作步骤、原理解析以及安全性考虑。

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就有修改系统时间的权限了。


Android系统中,`system_ext`分区是一个用于存放系统扩展应用的分区。与传统的`system`分区不同,`system_ext`分区允许设备制造商和开发者将一些扩展功能的应用安装到这个分区中,而不需要修改`system`分区。以下是如何将APK安装到`system_ext`分区的步骤和定义: ### 步骤: 1. **准备APK文件**: - 确保你要安装的APK文件已经编译好,并且没有错误。 2. **签名APK**: - 系统应用需要使用平台签名进行签名。确保你的APK文件已经使用与系统相同的签名密钥进行签名。 3. **创建目录结构**: - 在`system_ext`分区中创建相应的目录结构。通常情况下,APK文件会被放置在`system_ext/app/`目录下,而其依赖的库文件会被放置在`system_ext/lib/`目录下。 4. **复制APK文件**: - 将签名后的APK文件复制到`system_ext/app/`目录下。例如: ```bash adb push your_app.apk /system_ext/app/ ``` 5. **设置权限**: - 确保APK文件和相关目录的权限设置正确。通常情况下,APK文件的权限应该设置为`644`,目录的权限应该设置为`755`。 6. **创建`AndroidManifest.xml`文件**: - 在`system_ext/app/`目录下创建与APK文件同名的目录,并在其中创建`AndroidManifest.xml`文件。这个文件描述了应用的元数据。 7. **重新生成系统镜像**: - 如果你是在编译Android系统镜像,需要重新编译系统镜像并刷入设备。 ### 定义: - **平台签名**:系统应用需要使用与系统相同的签名密钥进行签名,以确保系统的安全性和一致性。 - **目录结构**:APK文件和相关库文件需要放置在`system_ext`分区中的特定目录中,通常是`system_ext/app/`和`system_ext/lib/`。 - **权限设置**:确保文件和目录的权限设置正确,以避免安全问题。 ### 示例: 假设你要安装一个名为`YourApp.apk`的应用到`system_ext`分区,可以按照以下步骤进行: 1. **签名APK**: ```bash apksigner sign --ks your_keystore.jks --out YourApp_signed.apk YourApp.apk ``` 2. **复制APK文件**: ```bash adb push YourApp_signed.apk /system_ext/app/YourApp/ ``` 3. **设置权限**: ```bash adb shell chmod 644 /system_ext/app/YourApp/YourApp.apk adb shell chmod 755 /system_ext/app/YourApp/ ``` 4. **创建`AndroidManifest.xml`文件**: 在`/system_ext/app/YourApp/`目录下创建`AndroidManifest.xml`文件,并添加必要的元数据。 5. **重新生成系统镜像**: ```bash make systemimage ``` 通过以上步骤,你可以将APK文件安装到`system_ext`分区中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值