Android Root的一些理解

来源:互联网 发布:税务申报软件 编辑:程序博客网 时间:2024/06/04 23:33

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) {                  }              }  

先写到这里,以后有时间继续写一点。

0 0
原创粉丝点击