怎样使Android应用程序获得root权限
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
写这篇文章前,首先要感谢
Simon_fu
,他的两篇关于
root
权限的文章对于我的工作起到了很大的帮助,这篇文章能够说是对他的文章的一个补充。
Simon_fu
的文章能够參考例如以下两个网页:
root权限
一般来说,
Android
下的应用程序能够“直接”得到的最大的权限为
system
,可是假设我们须要在程序中运行某些须要
root
权限的命令,如
ifconfig
等,就须要
root
权限了。依照
Simon
的文章中提到的,应用程序有下面两种办法暂时获得
root
权限:
1)
实现一个
init
实现一个
Service
,来帮助
Android
应用程序运行
root
权限的命令。
2)
实现一个虚拟设备,这个设备帮助
Android
应用程序运行
root
权限的命令。
另外一种办法我这里没有尝试,临时也不会。这里讲讲我在实现第一种办法的过程和遇到的一些问题。
1.
将我们要运行的命令写成脚本,或者可运行程序。
以下是我的脚本
ifconfig_test.sh
:
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
#
!
/system/bin/shifconfig
注意:
脚本的第一行必须为
#
!
/system/bin/sh
,否则无法运行,通过
dmesg
能够查看到信息内容为
cannot execve ./ifconfig_test.sh: Exec format error
也能够採用
C/C++
编写须要运行的命令或者程序,并在编译
image
的时候编译成可运行程序。
2.
在
init.rc
中注冊
service
Android
中的
service
须要在
init.rc
中注冊,
Init.rc
中定义的
Service
将会被
init
进程创建,这样将能够获得
root
权限。当得到对应的通知(通过属性设置)后,
init
进程会启动该
service
。
本文中注冊的内容例如以下:
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
service ifconfig_test /system/etc/ifconfig_test.sh
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
权限的文章网上已有非常多,这里就不再细说,能够參考例如以下两篇文章:
http://blog.csdn.net/liujian885/archive/2010/03/22/5404834.aspx
http://labs.chinamobile.com/mblog/532767_73183
4.
在应用程序中加入属性设置代码
前面已经提到,对于
Android
来说,应用程序通知
init
启动
service
是通过设置系统属性来完毕的,详细为设置
System
系统属性
“ctl.start”
为
“ifconfig_test”
,这样
Android
系统将会帮我们执行
ifconfig_test
这个
service
了。
对该系统属性的设置有三种方法,分别相应三种不同的应用程序:
1) Java 代码
Android 在 Java 库中提供 System.getProperty 和 System.setProperty 方法, Java 程序能够通过他们来设置和获得属性。代码例如以下:
SystemProperties.set("ctl.start", "ifconfig_test");
上面的代码是通知
Android
运行
ifconfig_test service
,假设须要查询当前
service
运行的状态,如是否运行完成,能够通过例如以下代码查询:
ret = SystemProperties.get("init.svc. ifconfig_test ", "");
if(ret != null && ret.equals("stopped"))
{
return true;
}
2)
JNI
代码
当编写
NDK
的程序时,能够使用
property_get
和
property_set
这两个
API
来获得和设置属性。使用这两个
API
必需要包括头文件
cutils/properties.h
和链接
libcutil
库。
3)
Shell
脚本
Android
提供了命令行
setprop
和
getprop
来设置和获取属性,他们能够在脚本中被使用。
因为我的程序是在
JNI
中调用脚本,脚本中又运行
ifconfig
,因此我将设置属性的部分放在了脚本中完毕,代码例如以下:
setprop ctl.start 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权限的更多相关文章
- Android 上SuperUser获取ROOT权限原理解析
Android 上SuperUser获取ROOT权限原理解析 一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. ...
- Delphi编写的Android程序获取Root权限实现(2015.4.15更新,支持Android 4.4)
借助谷歌,并经过本大侠施展坑.蒙.拐.骗.偷五大绝技,终于成功实现在Delphi下获取Root权限并将其扩展为一个完整功能更加完整的TQAndroidShell记录,在华为荣耀2(Android 4. ...
- 转:Android随笔之——使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
本文转载自CSDN的jzj1993,原文连接:http://blog.csdn.net/jzj1993/article/details/39158865 有时我们需要使用安卓实现在后台模拟系统按键,比 ...
- Android应用请求获取Root权限
应用获取Root权限的原理:让应用的代码执行目录获取最高权限.在Linux中通过chmod 777 [代码执行目录] /** * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限) ...
- Android Studio模拟器的root权限
前言 一个安卓练习中用自带的sqlite3数据库查看数据的时候,需要通过adb shell进入/data/data/[包名]/databases/目录中,通过查看创建的数据库来查看相应的数据或者表.起 ...
- 使用WakeLock使Android应用程序保持后台唤醒
在使用一些产品列如微信.QQ之类的,如果有新消息来时,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就知道有新消息来临了.但是,一般情况下手机锁屏后,Android系统为了省电以及减少CP ...
- android(五)----使用WakeLock使Android应用程序保持后台唤醒
在使用一些产品列如微信.QQ之类的,如果有新消息来时,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就知道有新消息来临了. 但是,一般情况下手机锁屏后,Android系统为了省电以及减少CPU消 ...
- 在Vista操作系统中通过manifest文件使VC应用程序获得管理员权限
原文 VC编译出来的应用程序在vista下运行,有可能因为权限问题,不能成功运行. 用以下办法,给应用程序添加一个manifest文件,程序运行时系统就会跳出UAC对话框,获得管理权限. 1.打开应用 ...
- android应用执行需要root权限的shell命令
导入jar包:http://blog.csdn.net/zhw1551706847/article/details/77709142 RootTools:http://blog.csdn.net/st ...
随机推荐
- 玩转Web之JavaScript(四)-----javaScript语法总结(四) JS中的函数
1.function/return function用来定义函数(位于head部分),函数包含着一些代码,这些代码只能被事件激活,或者在函数被调用时才会执行. return 用来从函数中返回值 ...
- int a[5]={1,2,3,4,5};printf("%d\n", *((int*)(&a+1)-2);
有说服力的笔试题有一定的期限,问:什么是结果,答案是4,为什么要挤? 我明白(不知道是不正确): &a这是一个数组指针,类型int[5],然后&a添加1其实a+sizeof(int)* ...
- ROADS+dijkstra的灵活运用+POJ
ROADS Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10742 Accepted: 3949 Descriptio ...
- 采用WindowManager添加您自己的自定义视图
原文地址:使用WindowManager加入自己定义视图 在写手机卫士的时候,用户拨打|接听电话须要显示号码归属地,然后出现了一些异常.在此留下记号,希望对麻友们有帮助: BUG教程 在使用 view ...
- ext3文件系统反删除利器ext3grep应用实战
推荐:10年技术力作:<高性能Linuxserver构建实战Ⅱ>全网发行,附试读章节和全书实例源代码下载! 一."rm –rf"带来的困惑 国外一份非常著名的Linux ...
- USACO maze1 BFS
不写了很长的时间bfs该,很长一段时间的中间失误,当延期一次延伸成功的新节点的节点应该被标记为参观.否则,在某些情况下无限期延长队列. 输入一个小坑爹处理称号,能够进来当字符串被读取.然后用周围的墙上 ...
- c# Ftp下载程序源代码解析
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 最受欢迎telnet
点击开关在模拟器,它相当于实PC经由控制线连接真实开关 由于我使用telnet远程登录到交换机的话.因为telnet工作在TCP/IP模型的应用层,现在让应用层通信的话,我首先要保证网络层通信,通信, ...
- MapReduce架构和算法(2)
一个.combiner计划 每map它可能会产生大量的输出,combiner的作用是map输出端先做合并.reducer的数据量. combiner最基本是实现本地key的归并,combiner具有类 ...
- 在InstallShield中发布单一的Setup.exe文件
原文:在InstallShield中发布单一的Setup.exe文件 InstallShield默认的Release模式下,生成了一个setup.exe文件,一个msi文件,以及一些其它的杂项文件. ...