【专业技术】android 应用程序如何获取root权限
问题:
我遇到的问题是,在setting中我要操作/dev/mem设备,在一个寄存器中写值。对/dev/mem的操作毫无疑问是需要root权限的。开始我的做法是使用jni方法。添加一个jni调用然后setting调用。但是就算我把/dev/mem的权限模式设置为777,在setting中依旧无权限打开/dev/mem。
解决方法:
把操作/dev/mem的部分写成一个独立的应用程序,然后在init.rc中启动一个service,把此服务的属性设置为 oneshot以及disabled,然后在需要的时候在setting中启动此服务。
主要修改有两个地方,第一个是init.rc,添加了下面一个服务:
service set_recovery_mode /system/bin/set_recovery_mode class core disabled
第二个地方是setting中需要启动set_recovery_mode服务的地方,最简单的方法是添加下面代码:
try {
Runtime.getRuntime().exec("start set_recovery_mode");
} catch (Exception e) {
e.printStackTrace();
}
附加介绍下init程序中与service相关的内容
在Android系统init.rc中定义很多Service,具体定义格式可以参考《Android Platform Developer’s Guide》中的“Android Init Language”。Init.rc中定义的Service将会被Init进程创建,这样将可以获得root权限。
现在问题是Android应用程序怎样启动让init进程知道我们想运行那个进程呢?
答案是设置系统属性“ctl.start”,把 “ctl.start”设置为你要运行的Service,假设为“xxx”,Android系统将会帮你运行“ctl.start”系统属性中指定的 Service。那么运行结果init进程将会将会写入命名为“init.svc.+Service名称”的属性中,也就是“init.svc.xxx” 属性,应用程序可以参考查阅这个值来确定Service执行的情况。
Android property权限
难道Android属性“ctl.start”是所有进程都可以设置的吗?那世界不就乱套了,谁都可以可以执行init.rc中Service了,查看 property_service.c中的源码,设置Android系统属性的函数为
handle_property_set_fd:
void handle_property_set_fd(int fd)
{
switch(msg.cmd) {
case PROP_MSG_SETPROP:
msg.name[PROP_NAME_MAX-1] = 0;
msg.value[PROP_VALUE_MAX-1] = 0;
if(memcmp(msg.name,"ctl.",4) == 0) {
if (check_control_perms(msg.value, cr.uid, cr.gid)) {
handle_control_message((char*) msg.name + 4, (char*) msg.value);
} else {
ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%dn",
msg.name + 4, msg.value, cr.uid, cr.pid);
}
}
}
}
从源码中我们发现如果设置“ctl.”开头的Android系统property,将会调用check_control_perms函数来检查调用者的权限,其定义如下:
static int check_control_perms(const char *name, int uid, int gid) {
int i;
if (uid == AID_SYSTEM || uid == AID_ROOT)
return 1;
/* Search the ACL */
for (i = 0; control_perms[i].service; i++) {
if (strcmp(control_perms[i].service, name) == 0) {
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid)) {
return 1;
}
}
}
return 0;
}
我们发现root权限和system权限的应用程序将会授权修改“ctl.”开头的Android系统属性。否则将会检查control_perms全局变量中的定义权限和Service。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- R语言单因素方差分析简单小例子
- 回炉重造:计算图
- CenterNet的骨干网络之DLASeg
- 一份朴实无华的移动端盒子滤波算法优化笔记
- [译]基于以太坊和USDC搭建去中心化金融系统
- 使用Substrate开发区块链存证dApp
- Flutter Dojo设计之道——如何打造一个通用的Playground
- [译]构建去中心化智能合约编程货币
- 你不知道c语言写的程序要多块——以NGS fastq文件reads计数为例
- JVM系列之:从汇编角度分析Volatile
- JVM系列之:从汇编角度分析NullCheck
- 基于机器学习的文本分类!
- JVM系列之:再谈java中的safepoint
- 《图解算法》第2章 选择排序
- 《图解算法》第3章 递归