android6.0第三方APP获得设备节点的访问权限

来源:互联网 发布:阿里云机顶盒破解 编辑:程序博客网 时间:2024/05/20 03:07

之前使用android4.4的系统进行开发时 system/app(系统自带APP) 目录下的 app 可以直接访问 dev 目录下的设备节点,Android 5.0 以后,因为采取了 SEAndroid/SElinux 的安全机制,即使拥有 root权限,或者对某内核节点设置为 777 的权限,仍然无法在 JNI 层访问。


这里先了解一下 SEAndroid app 的分类
SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):

  1. untrusted_app 第三方app,没有android平台签名,没有system权限
  2. platform_app 有android平台签名,没有system权限
  3. system_app 有android平台签名和system权限

从上面划分,权限等级,理论上:untrusted_app < platform_app < system_app


那么第三方APP,在SElinux下,如何获得对一个内核节点的访问权限
分下面三个步奏:

  1. 在 android/external/sepolicy/file_contexts 文件中添加:
    /dev/relay u:object_r:relay_device:s0
    其中“relay”是我的设备节点名称,可自行更改,“relay_device”是自定义设备名

  2. 在 android/external/sepolicy/device.te 文件中添加:
    type relay_device, dev_type, mlstrustedobject;
    其中“relay_device”需要跟上面自定义的设备名一致
    注:
    mlstrustedsubject:这一attribute包含了所有能越过MLS检查的主体domain。
    mlstrustedobject:这一attribute包含了所有能越过MLS检查的客体type。

  3. 在 android/external/sepolicy/untrusted_app.te 文件中添加:
    allow untrusted_app relay_device:chr_file rw_file_perms;
    修改完后重新编译系统,最好将设备节点的权限也改为777(chmod 777 /dev/relay)
    如果不想买次重启都需要修改权限,在 /system/core/rootdir 目录下的 ueventd.rc 文件添加修改权限即可


tips:
因为有些第三方APP我们可能需要写成系统自带的软件,所以需要将它放入system目录,这里说一下访问system目录的指令:首先执行“mount”可以查看目前 system 目录的挂载情况,我可以查找到的情况如下:

/dev/block/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0

之后使用“mount”命令即可:

mount -o remount rw /dev/block/by-name/system /system

之后把 apk 复制到 system/app 下,并且将 apk 权限改为644,进入查看lib/armeabi文件夹下有没有 .so文件,因为有些apk文件是要调用动态链接库的,你不拷贝的话,就没有办法运行!会报错,如果有so的话, 将这些*.so文件都拷贝到/system/lib文件夹下,重启后即可。

阅读全文
0 0