ROOT的作用

  • Customization

    用户的个人定制,如删除一些预安装,定制开机动画等.
  • 特权操作

    所有需要特权操作的基本都是要通过ROOT,这也是ROOT的初衷.

ROOT的第一步:寻找漏洞并安装特权文件

  • Hacker会寻找漏洞,如UID设置失败(ADB)
  • 手机ROOT后,最重要的是,给手机安装su程序和superuser apk.

    • su: 一般都被安装在/system/xbin 或者 /system/bin
    • superuser: 这个程序主要是用于管理需要特权的应用,在管理界面内可以对需要特权程序进行拒绝/允许

SU的sUID特性

那么拷进手机内的这个su程序到底有什么功能呢?
先看下面一段代码.

# ls su -l
ls su -l
-rwsr-sr-x 1 root root    26334 Aug 1 2008 su

这里可以看到,su的Owner和Group分别为Root:Root. Other用户具有execute权限,另外,su设置了suid和sgid,这个非常重要,使得su进程可以提升自身的EUID.

RootExplorer(文件超级管理器)是如何做特权操作的?

  • 首先我们可以看到RootExplorer 这个app被分配的信息:

    app_73 1143 103 301620 39944 ffffffff 400194c4 S

    包名:

    com.speedsoftware.rootexplorer

    上面可以看到,RootExplorer的EUID=10073(App Base是从10000开始的), PID=1143.

  • 然好RootExplorer通过Runtime 方式,使用shell 命令运行了su.

    • 见下面exec() 方法就是运行su核心代码.

      p=Runtime.getRuntime().exec("su");

    • RootExplorer接着启动sh:

      看一看到下面的1159是多出来的,他其实是通过PPID为 1143这个进程启动的,而1143也就是RootExplorer App.

      信息如下:

      app_73 1159 1143 764 376 c003e454 4001cf94 S /system/bin/sh

      总结:

      默认情况下,进程的UID还是继承app_73,这里sh的PPID是1143,说明是RootExplorer App启动的,启动后sh就是1159.

  • 然后1159 PID的sh会启动su, 这里需要注意的是,su进程的Real UID是10073,因为继承了parent,但是,其EUID却提升为ROOT,这就是由于SUID被设置的原因.由于su进程的EUID是ROOT,所以导致了su可以做很多高权限的事情.

su会通过下面代码启动SuperUser Request Activity来询问用户是否授权当前应用,如果否的话,则su将return结束,否则su会继续运行.

com.koushikdutta.superuser/com.koushikdutta.superuser.SuperuserRequestActivity --ei uid %d --ei pid %d > /dev/null", g_puid, ppid);
 if (system(sysCmd))
 return executionFailure("am.");
  • 得到用户许可后(通过sqlite和SuperUser Request Activity交流用户许可),su会将资金的Real UID也设置成ROOT:
if(setgid(0)||setuid(0))
  return permissionDenied();

由于su EUID是ROOT,所以su 有权限执行以上代码,执行完后su进程的Real UID, effective UID都变成了ROOT.这里设置RUID=0是为了给自己正身,使得后代能够继承特权.

  • 然后在su把自己正身完后就会去复用一个sh来运行用户的指令:
char *exec_args[argc + 1];
 exec_args[argc] = NULL;
 exec_args[0] = "sh";
 int i;
 for (i = 1; i < argc; i++)
 {
  exec_args[i] = argv[i];
 }
 execv("/system/bin/sh", exec_args);

  //下面只会在失败的时候运行
 return executionFailure("sh");

这里非常关键的代码是execv! 这里没有使用fork(fork会有新的进程出来),而是直接使用execv,这将导致不会创建新的进程运行sh image,而是直接在当前su的进程空间load并执行sh image可执行文件。执行完execv后,就开始直接sh的代码了。

点击查看execv与fork的使用

  • 这里可以看到,由于复用su当前进程来运行sh,使得sh运行的进程的EUID,Real UID都是ROOT,那么,任何操作都可以执行了。

    如果不提升Real UID为Root的话,那么只要sh运行中通过启动外部程序的方式来完成操作的话,就会出现权限问题,因为新启动的进程只会继承父进程的Real UID,而不是EUID,那么新起的进程的Real UID=EUID= parent RealUID != ROOT,那么某些操作可能有问题。 所以,su把自己的Real UID也提升为ROOT后,则不管启动后的任何代后的子进程执行操作,都是以ROOT的权限运行。

    RootExplorer通过得到sh流后,就可以通过该流执行任何shell指令了:
try {
 // Preform su to get root privledges   

   p = Runtime.getRuntime().exec("su");    


 // Attempt to write a file to a root-only   

   DataOutputStream os = new DataOutputStream(p.getOutputStream());   

   os.writeBytes("echo "Do I have root?" >/system/sd/temporary.txtn");   

 // Close the terminal   
   os.writeBytes("exitn");
     os.flush();
    }

总结: android中app授权获取root权限,其实不是app自身的权限提升了,而是通过具有root权限的sh 流来执行shell命令.

Android中典型的ROOT原理(5)的更多相关文章

  1. Android中的LruCache的原理和使用

    Android中的LruCache的原理和使用 LruCache,虽然很多文章都把LRU翻译成"最近最少使用"缓存策略,但Android中的LruCache真的如此吗? 答案是No ...

  2. Android 中View的工作原理

    Android中的View在Android的知识体系中扮演着重要的角色.简单来说,View就是Android在视觉的体现.我们所展现的页面就是Android提供的GUI库中控件的组合.但是当要求不能满 ...

  3. Android中微信抢红包插件原理解析和开发实现

    一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  4. Android中图像变换Matrix的原理、代码验证和应用(一)

    第一部分 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.Android中的Matrix是一个3 x 3的矩阵,其内容如下: Matri ...

  5. Android中图像变换Matrix的原理、代码验证和应用(三)

    第三部分 应用 在这一部分,我们会将前面两部分所了解到的内容和Android手势结合起来,利用各种不同的手势对图像进行平移.缩放和旋转,前面两项都是在实践中经常需要用到的功能,后一项据说苹果也是最近才 ...

  6. JAVA回调函数ANDROID中典型的回调地方

    在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...

  7. Android中SensorManager.getRotationMatrix函数原理解释

    SensorManager是Android中的一个类,其有一个函数getRotationMatrix,可以计算出旋转矩阵,进而通过getOrientation求得设备的方向(航向角.俯仰角.横滚角). ...

  8. Android中线程间通信原理分析:Looper,MessageQueue,Handler

    自问自答的两个问题 在我们去讨论Handler,Looper,MessageQueue的关系之前,我们需要先问两个问题: 1.这一套东西搞出来是为了解决什么问题呢? 2.如果让我们来解决这个问题该怎么 ...

  9. Android 的提权 (Root) 原理是什么?

    作者:Kevin链接:https://www.zhihu.com/question/21074979/answer/18176410来源:知乎著作权归作者所有,转载请联系作者获得授权. Android ...

随机推荐

  1. 最新IP数据库 存储优化 查询性能优化 每秒解析上千万

    高性能IP数据库格式详解 每秒解析1000多万ip  qqzeng-ip-ultimate.dat 3.0版 编码:UTF8     字节序:Little-Endian 返回规范字段(如:亚洲|中国| ...

  2. Python面向对象——多重继承大揭秘

    1如果如图所示使用多重继承,我们将看到什么 2我们看到了基类被执行了两次Baseclass 3代码验证吧 class BaseClass: num_base_calls = 0 def call_me ...

  3. 知物由学 | 基于DNN的人脸识别中的反欺骗机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  4. .NET Core2.0+MVC 用session,cookie实现的sso单点登录

    博主刚接触.NET Core2.0,想做一个单点登录的demo,所以参考了一些资料,这里给上链接: 1.http://www.cnblogs.com/baibaomen/p/sso-sequence- ...

  5. [LeetCode] Zuma Game 祖玛游戏

    Think about Zuma Game. You have a row of balls on the table, colored red(R), yellow(Y), blue(B), gre ...

  6. pyqt4 写动画不能播放问题集合

    最近在学习动画,真的真的是血泪史,百度基本是0资源,各种在谷歌外国大佬的英文中躺过一个一个血坑....... 这是随便写的一个动画功能调试窗口..... 问题现象: 点击食灵,没反应,写的动画不能生成 ...

  7. 视觉slam学习之路(一)看高翔十四讲所遇到的问题

      目前实验室做机器人,主要分三个方向,定位导航,建图,图像识别,之前做的也是做了下Qt上位机,后面又弄红外识别,因为这学期上课也没怎么花时间在项目,然后导师让我们确定一个方向来,便于以后发论文什么. ...

  8. Redis常用命令--Keys

    Redis是一个key-value型的数据库. 所以在Redis也提供了很多操作key的命令,大概有22个. EXISTS key [key ...]:查询一个key是否存在,时间复杂度为O(1),存 ...

  9. [SHOI2017]相逢是问候

    Description 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,a ...

  10. 计蒜客NOIP2017提高组模拟赛(四)day1

    T1:小X的质数 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小 X 认为,质数是一切自然数起源的地方. 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因数的 ...