admin管理员组

文章数量:1532326

2024年6月21日发(作者:)

如何使Android应用程序获得root权限

写这篇文章前,首先要感谢Simon_fu,他的两篇关于root权限的文章对于我的工作起

到了非常大的帮助,这篇文章可以说是对他的文章的一个补充。Simon_fu的文章可以参考

如下两个网页:

Android程序的安全系统

Android应用程序获得root权限

一般来说,Android下的应用程序可以“直接”得到的最大的权限为system,但是如果

我们需要在程序中执行某些需要root权限的命令,如ifconfig等,就需要root权限了。按照

Simon的文章中提到的,应用程序有以下两种办法临时获得root权限:

1) 实现一个init实现一个Service,来帮助Android应用程序执行root权限的命令。

2) 实现一个虚拟设备,这个设备帮助Android应用程序执行root权限的命令。

第二种办法我这里没有尝试,暂时也不会。这里讲讲我在实现第一种办法的过程和遇到

的一些问题。

1. 将我们要执行的命令写成脚本,或者可执行程序。

下面是我的脚本ifconfig_:

#!/system/bin/sh

ifconfig

注意:脚本的第一行必须为#!/system/bin/sh,否则无法执行,通过dmesg可以查看到

信息内容为cannot execve ./ifconfig_: Exec format error

也可以采用C/C++编写需要执行的命令或者程序,并在编译image的时候编译成可执行

程序。

2. 在中注册service

Android中的service需要在中注册,中定义的Service将会被init进程创建,

这样将可以获得root权限。当得到相应的通知(通过属性设置)后,init进程会启动该service。

本文中注册的内容如下:

service ifconfig_test /system/etc/ifconfig_

oneshot

disabled

其中,oneshot表示程序退出后不再重新启动,disabled表示不在系统启动时启动。

注意:这里service name不能超过16个字符。我之前的service name由于定义的比较长,

18个字符,设置属性通知service启动后查看dmesg可以看到提示:init: no such service。查

看/system/core/init/parser.c的源代码,在parse_service->valid_name函数中可以看到如下内容:

if (strlen(name) > 16) { return 0; },证明service的名字的确不能超过16个字符。

3. 将Android应用程序提升为system权限

既然应用程序可以通过启动service获得root权限,那么岂不是很不安全。Android考虑

到了这点,规定只有system权限的应用程序才能设置属性,通知service启动。关于提升system

权限的文章网上已有很多,这里就不再细说,可以参考如下两篇文章:

/liujian885/archive/2010/03/22/

/mblog/532767_73183

4. 在应用程序中添加属性设置代码

前面已经提到,对于Android来说,应用程序通知init启动service是通过设置系统属性

来完成的,具体为设置System系统属性“”为“ifconfig_test”,这样Android系统将会

帮我们运行ifconfig_test 这个service了。

对该系统属性的设置有三种方法,分别对应三种不同的应用程序:

1) Java代码

Android在Java库中提供perty和perty方法, Java程序可以

通过他们来设置和获得属性。代码如下:

("", "ifconfig_test");

上面的代码是通知Android执行ifconfig_test service,如果需要查询当前service执行的

状态,如是否执行完毕,可以通过如下代码查询:

ret = (". ifconfig_test ", "");

if(ret != null && ("stopped"))

{

return true;

}

2) JNI代码

当编写NDK的程序时,可以使用property_get和property_set这两个API来获得和设置

属性。使用这两个API必须要包含头文件cutils/properties.h和链接libcutil库。

3) Shell脚本

Android提供了命令行setprop和getprop来设置和获取属性,他们可以在脚本中被使用。

由于我的程序是在JNI中调用脚本,脚本中又执行ifconfig,因此我将设置属性的部分

放在了脚本中完成,代码如下:

setprop ifconfig_test

#wait for the service until it stops

ret=1

while [ $ret -ne 0 ]

do

getprop | grep "$ENABLE_MAPPER_SRV" | grep stopped

ret=$?

done

通过上面4个步骤,Android应用程序就获得了root权限,更具体的说,是在执行我们

需要执行的命令时临时获得了root权限。

本文标签: 执行权限应用程序设置属性