博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
安卓 root权限笔记
阅读量:4509 次
发布时间:2019-06-08

本文共 3480 字,大约阅读时间需要 11 分钟。

Root原理

Root的终极目标就是要把编译好的su文件拷贝到Android手机的/system/bin或者/system/xbin/目录下。su一定要放到/system/bin/或者/system/xbin/,su不能放在data分区原因是因为data分区在mount时就指定了不能给可执行程序加s位。

    需要获得root的时候:Process p = Runtime.getRuntime().exec("su")。换句话说你必须把su放到环境变量PATH所有的目录里,APP才能调用到它。如果你不想放到bin或者xbin下,你就必须给PATH增加一个目录。PATH是root权限才能修改的,你如果能修改PATH,说明你已经有root权限了,修改PATH就没必要了,还不如直接放到bin下面。

Superuser与su授权原理

 

Superuser与su授权交互图

    su和Suepruser进行root授权的处理流程:对于su命令行程序在对来自应用的Root权限请求处理流程大致如图所示图中Android应用是申请Root权限的申请者,su命令行程序时Root权限拥有者,因su设置了suid位,因此任何执行它的进程都会获得和它一样的权限,这个好像在之前的文章中提到过,其实细节上并非这么容易,和Superuser用户权限管理apk结合起来使用的话还会有一些仲裁的过程。 描述起来就是:

 1.Android应用调用su程序,来申请root权限;

2.su启动LocalSocket服务,LocalSocket的功能和通常我们进程通信的Socket类似,其实是在本地共享一块内存来实现和本地其他进程之间进行通信的Socket服务;

3.su命令行程序通过am命令请求显示Superuser应用的RequestActivity窗口,这个窗口里面显示哪个uid的和user的应用申请权限;

4.Superuser连接到由su进程建立的LocalSocket服务上,至此LocalSocket连接成功,之后进程和Superuser对应的进程可以通过这个LocalSocket来进行信息传递了;

5.LocalSocket的数据通道成功连接库,su程序通过socket传递调用者(申请root权限的Android应用)的一些信息。

6.Superuser将用户的仲裁结果数据返回给su程序,如果用户允许授权则,则 ALLOW root授权,反之DENY。(其中还有用户在一定时间内未作出选择的情况,默认为DENY)

这是从Android应用申请root权限到su和Superuser配合实现用户选择后的仲裁的整个过程。 下面我一步一步分析一下这些过程中的细节。

从su的main函数开始,分析细节 因为su是一个linux命令行程序,故我们首先在Superuser的源码的jni目录下找到su.c文件,定位到main函数处。

main函数中主要完成了三个主要的工作: 

 1.初始化调用者数据和效验

1)获取调用者调用su命令的命令行参数-from_init函数

2)获取su命令的链接路径-user_init函数

3)获取调用者的名称

2.通过SQLlite数据库检查申请“Root授权”的Android应用程序是否还需要进一步效验

3.建立LocalSocket服务,并进行相应的数据通信

main函数中第二个主要完成的工作就是:检查申请“Root”授权的Android应用程序是否还需要进一步的效验。然后在本地SQLite数据库中进行查询,如果数据库中显示授予root权限就直接 授予root权限,拒绝过就直接拒绝,如果没有记录就进入到下一阶段,和Superuser进行通信,然后Superuser接收到用户的选择后将选择数据传回到su程序中来决定是否授予新申请root权限的Android应用Roo权限。 main中完成的。第三个主要的主要工作就是建立本地LocalSocket服务,等待Superuser的连接,当连接成功后传递调用者信息即初始化后的su_context结构体,Superuser在收到调用者的信息后显示出来让用户仲裁是否授予权限,最后将用户选择回传到su程序,su根据结果来执行deny()或者allow()函数(允许或拒绝root权限授权的关键allow()函数和deny()函数)。

到现在为止,我们已经了解了su命令和Superuser在授权root权限时,su端的工作原理,但是su.c文件中的两个函数allow()和deny()的具体实现我们还没有看到,这两个函数才是最终允许或拒绝root权限授权的关键。

参考:

    Root的过程原理★★★★★

    Superuser与su授权交互原理★★★★★

   

    root原理

    su删除

方案参考:

  P1.Xposed Installer +  Xposed插件MATE7安装失败,基于安卓系统进程劫持原理;

  P2. 方案较复杂,实现方案改动大,风险高;

最终实现方案:

    实现原理基于以下几点:

S1.root的终极目标就是在/system/bin/或者/system/xbin/目录下刷入su文件;

S2. Process p = Runtime.getRuntime().exec("su")相当于windows在系统环境变量path目录下查找可执行程序,因此su可以更名为xxx。

S3.su与superuser的交互原理,通过LocalSocket建立交互类似于Socket通信,授权结果存贮在SQLite数据库中。Root软件有其一套对应的su与superuser。

使用KingRoot root后,复制/system/xbin/su为/system/xbin/sudo,卸载KingRoot(与移除su文件)。再重新装上KingRoot,程序执行Runtime.getRuntime().exec("sudo")才能获取权限,其他程序检测su文件失效。

测试代码

/**     * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限)     *  http://blog.csdn.net/zhufuing/article/details/7875216/     * @return 应用程序是/否获取Root权限     */    public static boolean getRootPermission(String pkgCodePath) {        Process process = null;        DataOutputStream os = null;        try {            String cmd="chmod 777 " + pkgCodePath;//            process = Runtime.getRuntime().exec("su"); //切换到root帐号            process = Runtime.getRuntime().exec("sudo"); //切换到root帐号            os = new DataOutputStream(process.getOutputStream());            os.writeBytes(cmd + "\n");            os.writeBytes("exit\n");            os.flush();            process.waitFor();        } catch (Exception e) {            return false;        } finally {            try {                if (os != null) {                    os.close();                }                process.destroy();            } catch (Exception e) {            }        }        return true;    }

 

转载于:https://www.cnblogs.com/zhen-android/p/6408164.html

你可能感兴趣的文章
ios对new Date() 的兼容问题
查看>>
Spark发展现状与战线
查看>>
Charles常用设置
查看>>
filebeat
查看>>
如何在Bitmap中画图?(MFC)
查看>>
Windows 用来定位 DLL 的搜索路径
查看>>
常见的游戏设计技术
查看>>
Backbone 学习笔记五
查看>>
R语言:各种零碎
查看>>
Mysql5.7修改root密码
查看>>
WC2019退役失败记
查看>>
Centos6.6下安装nginx1.6.3
查看>>
iOS开发之多线程
查看>>
[算法竞赛]第七章_暴力求解法
查看>>
关于全局替换空格,制表符,换行符
查看>>
MorkDown 常用语法总结
查看>>
sqlserver生成随机数 2011-12-21 15:47 QQ空间
查看>>
jQuery禁止鼠标右键
查看>>
查询linux计算机的出口ip
查看>>
解决Android的ListView控件滚动时背景变黑
查看>>