Android Root原理
概述:通过阅读本文可以深刻理解Android系统中获得Root权限的方法和原理。本文会详细介绍Root的目的,原理和代码层次的具体实现方法。
Android Root介绍:
1. Root目的
手机获得Root权限以后,用户就可以完全拥有手机系统的最高权限,在Linux系统中相当于Root账号,在Windows系统中相当于Administrator账号。因为Android系统是基于Linux的,所以叫Root权限。
有了Root权限以后,用户可以自由删除一些系统自带的无用软件,更换开关机铃声,去除状态栏弹出的广告和常用软件中嵌入的第三方广告平台展示广告的干扰,让你的手机随心所欲,不再受干扰,总之一句话Root可以让你真正享有手机主人的感觉。
2. Root原理介绍
给手机Root的原理大概分为三个步骤:步骤一,把su文件拷贝到/system/bin/目录下面。步骤二,把Superuser.apk放到/system/app/目录下面。步骤三,设置/system/bin/su让任意用户都可以运行并且拥有set_uid和set_gid的权限。
当然,这些操作厂商是不会轻易允许我们这样做的,这样我们就需要去利用Android操作系统的各种漏洞去实现这些操作,利用这些漏洞完成以上三步操作的过程就是Root的过程。
Su – Switch User切换用户。
3. Root方法介绍
从Root的原理我们了解到,想要Root需要三个步骤:
- adb push su /system/bin — xbin下是放一些小工具来方便使用的
- adb push SuperUser.apk /system/app
- adb shell chmod 4755 /system/bin/su(关于chmod XXX可以到这里了解一下http://hi.baidu.com/angivo/item/345af44260142b09e9350416)
如果系统是英文版,那么经过以上三个步骤,Root就大功告成了,通过安装Root Explorer软件就可以在根目录下创建删除文件了。但是国内的手机的系统都是经过厂商改造过的中文版,通过以上三个步骤是不行的,原因有以下三点:
- 中文版的/system路径是只读权限,我们是不能完成写入或者copy操作的
- chmod命令是需要拥有Root权限后才可以使用的,我们的在操作的时候是没有Root权限的,所以这个命令在我们Root过程中是无法使用的
- 某些厂商定制的系统在系统重新启动的时候会自动将su的权限从4755改成755或者直接删除了su,正是因为这个原因我们经常会碰到,明明我们是已经Root过的手机,但是手机重启后就没有Root权限了。这种只是临时获得的Root权限。
针对以上三点,我们怎么能够确保获得永久的Root权限呢?一种方案是自己去烧制一个英文版boot.img,刷一个英文版的系统然后再Root就OK了。另外一种方案就是去实时监控system/bin目录下已有的su文件是否存在,如果不存在就立即copy一个过去。
4. 深入理解Root机制
Root调用流程如下:
- su被用户调用
- su创建一个socket监听,搭建一个通道来完成通讯
- su通过广播的方式通知superuser目前有一个应用要使用Root
- su等待socket数据通讯完成,通常会有超时处理
- superuser在收到广播以后会在界面弹出一个对话框,与用户交互,询问用户是否给予Root权限
- superuser将用户的选择结果再通过socket回传给su
- su根据socket得到的结果在做相应的处理判断应不应该继续给Root权限
- 完成本次授权处理
Superuser.apk这个应用是Root成功后,专门用来管理Root权限使用的,防止恶意应用滥用。可以去这个地方下载官方的superuser源码和su文件:http://superuser.googlecode.com/svn/trunk/ 自己就可以在Eclipse上打开superuser代码,完成编译和安装。
Superuser和su之间的通讯原理:
Superuser使用运行在Java虚拟机中,而su是运行在Linux的真是进程中,他们两个之间通讯superuser这个应用来完成大部分工作,superuser一共有两个Activity:一个是SuperuserActivity另外一个是SuperuserRequestActivity,其中SuperuserActivity是用来管理白名单的,用来记住那些应用程序已经被允许使用Root权限了,这样白名单中的应用再次提权时,就不需要麻烦用户选择了。而superuserRequestActivity是用来负责弹出对话框询问用户当前某个应用请求使用Root权限,让用户来完成选择授予还是不授予。如果用户选择永久授予Root权限,那会通过SuperuserActivity会将本次提权的应用写入白名单中。白名单其实就是一个sqlite的数据库,来保存用户选择永久授予Root权限的应用名单。白名单在数据库中位置为:
/data/data/com.koushikdutta.superuser/databases/superuser.sqlite
上文已经说过,Root的本质就是往 /system/bin/ 目录下放一个su文件,并且给su文件4755的权限,任何用户都有调用su的权限,这样普通程序可以调用该su来运行Root权限的命令。superuser.apk中就自带了一个这样的su程序。一开始superuser会检测/system/bin/su是否存在:
File su = new File("/system/bin/su");
// 检测su文件是否存在,如果不存在则直接返回
if (!su.exists()) {
Toast toast = Toast.makeText(this, "Unable to find /system/bin/su.",
Toast.LENGTH_LONG);
toast.show();
return;
}
//如果大小一样,则认为su文件正确,直接返回了事。
if (su.length() == suStream.available())
{
suStream.close();
return;
}
// 如果检测到/system/bin/su 文件存在,但是不对头,则把自带的su先写到"/data/data/com.koushikdutta.superuser/su"
//再写到/system/bin/su。
byte[] bytes = new byte[suStream.available()];
DataInputStream dis = new DataInputStream(suStream);
dis.readFully(bytes);
FileOutputStream suOutStream = new
FileOutputStream("/data/data/com.koushikdutta.superuser/su");
suOutStream.write(bytes);
suOutStream.close();
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new
DataOutputStream(process.getOutputStream());
os.writeBytes("mount -oremount,rw /dev/block/mtdblock3 /system\n");
os.writeBytes("busybox cp /data/data/com.koushikdutta.superuser/su /system/bin/su\n");
os.writeBytes("busybox chown 0:0 /system/bin/su\n");
os.writeBytes("chmod 4755 /system/bin/su\n");
os.writeBytes("exit\n");
os.flush();
有进程使用root权限,superuser是怎么知道的呢,关键是句:
sprintf(sysCmd, "am start -a android.intent.action.MAIN -n com.koushikdutta.superuser/com.koushikdutta.superuser.SuperuserRe questActivity --ei uid %d --ei pid %d > /dev/null", g_puid, ppid);
if (system(sysCmd))
return executionFailure("am.");
Superuser操作白名单代码:
static int checkWhitelist()
{
sqlite3 *db;
int rc = sqlite3_open_v2(DBPATH, &db, SQLITE_OPEN_READWRITE, NULL);
if (!rc)
{
char *errorMessage;
char query[1024];
sprintf(query, "select * from whitelist where _id=%d limit 1;", g_puid);
struct whitelistCallInfo callInfo;
callInfo.count = 0;
callInfo.db = db;
rc = sqlite3_exec(db, query, whitelistCallback, &callInfo, &errorMessage);
if (rc != SQLITE_OK)
{
sqlite3_close(db);
return 0;
}
sqlite3_close(db);
return callInfo.count;
}
sqlite3_close(db);
return 0;
}
5. 资源文件的获取
从上文的源码地址获取源代码,替换系统的system/extras/su/下面的su.c 和Android.mk文件,使用编译命令./mk td28 u adr system/extras/su/ 编译成功后会生成out/target/product/hsdroid/system/xbin/su 文件,而Superuser.apk就是普通的apk文件,都在源码地址里面可以下载,下载后倒入到eclipse即可直接运行。
Android Root原理的更多相关文章
- Android root 原理
Android root 原理 0x00 关于root linux和类Unix系统的最初设计都是针对多用户的操作系统,对于用户权限的管理很非常严格的,而root用户(超级用户)就是整个系统的唯一管理员 ...
- [转] Android root 原理
欢迎转载,转载请注明出处:http://www.cnblogs.com/lanrenxinxin/p/5572640.html 0x00 关于root linux和类Unix系统的最初设计都是针对多用 ...
- Android Root原理初探
Root Linux:Root == Windows:Adminstrator Android是Linux系统吗? 操作系统 = 系统内核 + 文件系统 Linux发行版:Linux内核 + 文件系统 ...
- Android root检测方法小结
转载目的,之前主要应用这里的原理解决了,手机被某个APP检测为root过的手机的问题,记录后续可能参考. 出于安全原因,我们的应用程序不建议在已经root的设备上运行,所以需要检测是否设备已经root ...
- [Android Pro] android root权限破解分析
许 多机友新购来的Android机器没有破解过Root权限,无法使用一些需要高权限的软件,以及进行一些高权限的操作,其实破解手机Root权限是比较简 单及安全的,破解Root权限的原理就是在手机的/s ...
- Android ADB原理及常用命令
Android调试桥(ADB, Android Debug Bridge)是一个Android命令行工具,包含在SDK 平台工具包中,adb可以用于连接Android设备,或者模拟器,实现对设备的控制 ...
- NFC(6)NFC编程的几个重要类,NFC硬件启动android应用原理
用于NFC编程的几个重要类 Tag NFC 标签 NfcAdapter Nfc 的适配类 NdefMessage 描述NDEF格式的信息 NdefRecord 描述NDEF信息的一个信息段,类似tab ...
- android的原理,为什么不需要手动关闭程序
转自android的原理,为什么不需要手动关闭程序 不用在意剩余内存的大小,其实很多人都是把使用其他系统的习惯带过来来了. Andoird大多应用没有退出的设计其实是有道理的,这和系统对进程的调度机制 ...
- 【转】Android Activity原理以及其子类描述,androidactivity
Android Activity原理以及其子类描述,androidactivity 简介 Activity是Android应用程序组件,实现一个用户交互窗口,我们可以实现布局填充屏幕,也可以实 ...
随机推荐
- NOIP200905
暴力,简单,,, 题目好长,差点没读完 试题描述 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则:1)S国军方内 ...
- OpenJudge/Poj 1723 SOLDIERS
1.链接地址: http://bailian.openjudge.cn/practice/1723/ http://poj.org/problem?id=1723 2.题目: 总时间限制: 1000m ...
- 纯javascript 回到 顶部 实例
很多网站都会采用瀑布式的加载模式,像qq空间加载好友动态,为了用户体验更好,很多网站会加上回到顶部的连接,但大多数网站都是一下子就回到了顶部,当然,这样有这样的好处,但是我是个比较喜欢很炫的东西的人, ...
- MySQL字符串类型转换时间类型
如果MySQL数据库里面的某个时间用的是varchar(或者是char)类型的,这样可以方便系统使用而不用随便转换时间类型来适应数据库版本的不同,当要把取出的字段转换成时间类型的时候,可以按如下方法操 ...
- java Object类
常用的共性内容 1,实现任何对象的比较,一般比较同一种对象的比较 Object1.equals(Object obj);等同于Object1 == obj: 只有当两个引用指向同一个对象时方法返回tr ...
- Css3 阴影效果
box-shadow:#333 0 0 5px 10px; //上下左右有阴影-webkit-box-shadow: #666 0px 5px 10px; -moz-box-shadow: #666 ...
- python函数的返回值 讲解
我们一起来聊聊python函数返回值的特殊情况,之前我也碰到过类似方面的问题,到后来查阅了一些资料后,发现原来是这样. 首先,写函数的时候,一定要写函数的文档,这样方便我们识别函数是做什么的.我记得很 ...
- Python操作Excel——win32com模块和xlrd+xlwt+xlutils组合
今天,接到一个任务,要生成大约两百个excel文件,从2006年到2013年,每个月两个文件,这些文件中除了几个关于日期的单元格不同外,其他数据都相同,所以就想到可以用python写一个小脚本,自动生 ...
- Binding的源和路径
书上写着:Binding的源也就是数据的源头.Binding对于源的要求很简单-只要他是一个对象!并且通过属性(Property)公开自己的数据,它就可以作为Binding的源了.就像上一篇我写的那个 ...
- HttpContext
HttpContext 类:封装有关个别 HTTP 请求的所有 HTTP 特定的信息.也有人叫上下文信息. 1.生存周期:从客户端用户点击并产生了一个向服务器发送请求开始---服务器处理完请求并生成返 ...