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权限。
版权声明:本文标题:如何使Android应用程序获得root权限 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1718978594a745523.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论