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", null, null);
使用这两句代码进行发送短信,因此我们去查看下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