android权限代码分析(六)

6:su 与Superuser 配合管理root权限申请

6.1 root原理 以及目标

简单来说,root原理便是利用系统漏洞,达到可以将su 与Superuser 扔进系统。并将su放在/system/bin或者xbin下面,权限配置为


这里关键为su位系统用户root,属于系统组root,关键位s位,s位的意思为如果非root用户启动su时,有s位后,非root用户便会以root权限运行。而su里面通过使用

execv(ctx->to.shell, ctx->to.argv + argc)来将自己的镜像替换成su -s 后面的参数,达到后面的运行便是root权限,具体请查看分享文档su-binary-master源码深入研究。

6.2 su 与Superuser 配合管理

 

我们看到,如果root后su可以任意被调用,那么root后手机则会使得恶意程序肆意运行,因此我们需要做Superuser.apk ,这个图形化的应用配合su,来进行管理哪些apk被允许,哪些被拒绝,只有允许的apk才放行,使用su,否则拒绝。

查看su的源码


步骤为:

创建socket

扔出广播,使用


这里am便是activitymanager的意思,传出一个广播,此广播被Superuser.apk接收,然后将结果通过建立的socket传回给su,su依据传回结果选择允许或者拒绝即可。

7:系统属性权限

 打开alps\frameworks\base\core\java\android\os\SystemProperties.Java



SystemProperties.get 接口:

参数有哪些,可以在alps\out\target\product\项目名\system\build.Prop

去查看。

我们看两类特殊的:

ro.sf.hwrotation=0  只读类别的。

persist.radio.fd.counter=15  可保存数值的。

参数即为 等号前面的。

顺着native_get 接口,我们来查看下本地代码实现位置:

alps\frameworks\base\core\jni\android_os_SystemProperties.Cpp


我们找到本地函数,继续前进,查看


__system_property_get

函数。

 

我们来看__system_property_set

这个设置代码:

里面使用socket 进行通信,目标位置为:

alps\system\core\init\property_service.C  在init进程里面,相关代码如下:


我们知道handle_property_set_fd函数是在init.c里面,应用层通过上层接口set,最终会通过socket 通信方式给init 进程发送,init进程收到此类消息,进入handle_property_set_fd接口处理。

Accept

Getsockopt

等待消息来到。

来消息后继续,我们可以看到这里面有权限判断了。

这里看到分两类了,我们只分析else下面的语句。


继续查看check_perms 代码:




这里可以看到uid=0 即为root,直接放行。如果我们自己增加的,可以仿照随后的比较来处理。

我们来看for循环语句,通过循环判断,如果从property_perms[i].Prefix匹配,则去判断是否是允许的uid 或者gid

property_perms数组为:


这里便是权限配置地方。

我们看一行    { "persist.sys.",     AID_SYSTEM,   0 },

这个意义为:属性值已persist.sys打头,可操作的权限为AID_SYSTEM,,或者组为0.

这里的persist开头还有另一个意义,这个便是此属性具有保存属性,即关机重新开机设置值不会丢失。ro开头的属性不能操作,只读属性。

继续看

可以看到如何去存储设置的方法。

我们关注这一段代码:


这个是会存储的属性值,可以看到这些文件都存储在/data/property/路径下:

我们查看一个/data/property/persist.sys.sd.defaultpath 这个是我们的默认存储路径的设置配置值。

如此,这边的权限也就讲完了,下面我们去看一个权限的鉴权在activitymanager 和 packagemanager里面的流程。

8:跟踪android:name="android.permission.SEND_SMS 这个权限:

 

SmsManager Sms=SmsManager.getDefault();

Sms.sendTextMessage("10086"null"hello"nullnull);

使用这两句代码进行发送短信,因此我们去查看下sendTextMessage接口:

android\frameworks\base\telephony\java\android\telephony\SmsManager.java


继续跟踪,可以看到代码在:

android\frameworks\base\telephony\java\com\android\internal\telephony\IccSmsInterfaceManager.java

里面:


这里我们看到了鉴权代码,进入此接口,此接口的调用位置为:

android\frameworks\base\core\java\android\app\ContextImpl.java里面的:


继续跟入此函数,直接到此处:


我们可以看到真正的鉴权会走到activitymanagerserver 这边,ActivityManagerNative这边使用的是binder机制,实际代码会在activitymanagerserver里面,我们直接过去查看:

android\frameworks\base\services\java\com\android\server\am\ActivityManagerService.java


这里我们就可以看到权限如何管理的了,我们瞅一句:

 

        // Root, system server and our own process get to do everything.

        if (uid == 0 || uid == Process.SYSTEM_UID || pid == MY_PID) {

            return PackageManager.PERMISSION_GRANTED;

        }

可以看到root 或者系统uid 或者是本进程会直接放行,否则进入鉴权代码:


顺利来到了packagemanager里面了,我们继续跟入此接口,此接口位置在:

android\frameworks\base\services\java\com\android\server\pm\PackageManagerService.java


获取此uid被允许的权限列表,去匹配是否存在传入的权限。

mSettings这个类比较关键,具体在

android\frameworks\base\services\java\com\android\server\pm\Settings.java 可以详细去看,这边分析就有些庞大了,具体可以去看系统启动时packagemanager的初始化过程了,此处不分析了。

我们之前已经分析过,在/data/system/packages.xml存储着所有apk的权限配置,通过uid则可以拿到所有的允许的权限表,以此为依据进行判断是否有发送短信的权限即可。

这里我们使用发送短信的权限,将系统中判断权限的机制做了大概的浏览,具体的可以去深入查看activitymanager和packagemanager模块,这里不深究了。


完整版下载地址:

http://ishare.iask.sina.com.cn/f/66977695.html




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。