问题
我遇到的问题是我想在 Java应用程序中动态 mount一
个 NFS 的系统,但是执行 mount 命令必须要要 root 权限才
Android Java root
可以。一般情况下,在 的 层是不能获得
权限的。
思路
我在博文《Android 程序的安全系统》中提到两种思路:
1、实现一个 init 实现一个 Service,来帮助 Android 应用程
序执行 root 权限的命令。
2、实现一个虚拟设备,这个设备帮助 Android 应用程序执
行 root 权限的命令。
本文将会选择第一种来解决 Android 应用程序 mount
NFS 文件系统的问题。
Init.rc Service
Init.rc Service
IInniitt..rrcc SSeerrvviiccee
在 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 属性系统》。
Android property
Android property
AAnnddrrooiidd pprrooppeerrttyy 权限
难道 Android 属性“ctl.start”是所有进程都可以设置的
吗?那世界不就乱套了,谁都可以可以执行 init.rc中Service
了,查看 property_service.c 中的源码,设置 Android 系统
属性的函数为 handle_property_set_fd:
1: void handle_property_set_fd(int fd)
2: {
3:
4: switch(msg.cmd) {
5: case PROP_MSG_SETPROP:
6: msg.name[PROP_NAME_MAX-1] = 0;
7: msg.value[PROP_VALUE_MAX-1] = 0;
8:
9: if(memcmp(msg.name,"ctl.",4) == 0) {
10: if (check_control_perms(msg.value, cr.uid, cr.gid)) {
11: handle_control_message((char*) msg.name + 4, (char*)
msg.value);
12: } else {
13: ERROR("sys_prop: Unable to %s service ctl [%s] uid:
%d pid:%d\n",
14: msg.name + 4, msg.value, cr.uid, cr.pid);
15: }
16: