Android Root 的一些理解
之前做过一些有关Android Root的项目,对Android系统的Root也有一些浅薄的理解,在此记录一下。
Android Root 的介绍
相信用Android 的同学对Root并不陌生,其对应与IOS的越狱,Root以后可以对手机进行个性化,也可以卸载系统预装的软件等,好处很多,但是也有很多风险,Root后的应用就是获取到了手机的最高权限,如果此应用是恶意的话,那么他的恶意行为因为获取到Root权限而变的很难控制。
下面有几篇文章,对Android Root后的风险做了分析,写的很好:
android手机root后的安全问题
Android Root 原理
Android Root的方法需要区分版本,在4.3之前,只需要修改位于/system/bin或/system/xbin中的su文件便可达到Root的目的。正常情况下,su文件只能shell或者root用户来提升权限,因为在su.c文件中有如下控制代码:
/* /source/system/extras/su/su.c */
if (myuid != AID_ROOT && myuid != AID_SHELL) {
fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
return 1;
}
可以看到,如果是非root或者shell直接退出。所以,最简单的修改su文件的方法就是注释掉这几行代码,之后重新编译,将生成的su文件替换掉/system/bin或者/system/xbin目录下原来的su文件。不过,正常系统下是没有权限替换su文件的,所以就需要靠系统的漏洞或者刷机来替换,具体的漏洞就不提了,更下详细的可以参考这里:
Android手机Root授权原理细节全解析
Android Root原理和流程分析
然而在4.3以后,此前方法行不通了,新的方法是在系统启动时,启动一个daemon进程,此时是root权限,之后此进程一直运行,当需要root时,将root 命令发送给此daemon进程让他来执行,从而达到了root的目的。
Apk中如何获取Root权限
想要在Apk中获取root权限,主要使用的是Runtime这个类,主要代码如下:
String[] commands = {"remount...", "...", ...};
Process process = null;
DataOutputStream dataOutputStream = null;
try {
process = Runtime.getRuntime().exec("su");
dataOutputStream = new DataOutputStream(process.getOutputStream());
int length = commands.length;
for (int i = 0; i < length; i++) {
Log.e(TAG, "commands[" + i + "]:" + commands[i]);
dataOutputStream.writeBytes(commands[i] + "\n");
}
dataOutputStream.writeBytes("exit\n");
dataOutputStream.flush();
process.waitFor();
} catch (Exception e) {
Log.e(TAG, "copy fail", e);
} finally {
try {
if (dataOutputStream != null) {
dataOutputStream.close();
}
process.destroy();
} catch (Exception e) {
}
}
先写到这里,以后有时间继续写一点。