Android 获得对一个设备节点的访问权限

来源:互联网 发布:奥克洛核反应堆知乎 编辑:程序博客网 时间:2024/06/08 07:55

Android 获得对设备节点的访问权限

       Android 5.0 下,因为采取了 SEAndroid/SElinux 的安全机制,即使拥有 root权限,或者对某内核节点设置为 777 的权限,仍然无法在 JNI 层访问。
       本文将以用户自定义的内核节点 /dev/wf_bt 为例,手把手教会读者如何在 JNI 层获得对该节点的访问权限。

可分为以下四个步骤:

  • 第一步:找到需要访问该内核节点的进程(process),假设这个节点由 system_server 进程来访问。
  • 第二步:打开文件 mydroid/external/sepolicy/file_contexts,仿照这个文件里的写法,为你的节点定义一个你想要的名字,如下:
/dev/watchdog       u:object_r:watchdog_device:s0/dev/xt_qtaguid u:object_r:qtaguid_device:s0/dev/zero       u:object_r:zero_device:s0/dev/__kmsg__       u:object_r:klog_device:s0/dev/__properties__ u:object_r:properties_device:s0# example/dev/wf_bt      u:object_r:wf_bt_device:s0  

       wf_bt_device 是自定义,其他左右两边的内容都和上面的范例一致。

  • 第三步:打开文件 mydroid/external/sepolicy/device.te ,仿照这个文件里的写法,将刚刚第二步写的wf_bt_device 声明为 dev_type:
type video_device, dev_type;type vcs_device, dev_type;type zero_device, dev_type;type fuse_device, dev_type;type iio_device, dev_type;type ion_device, dev_type, mlstrustedobject;type gps_device, dev_type;type qtaguid_device, dev_type;type watchdog_device, dev_type;type uhid_device, dev_type;type uio_device, dev_type;type tun_device, dev_type, mlstrustedobject;type usbaccessory_device, dev_type;type usb_device, dev_type;type klog_device, dev_type;type properties_device, dev_type;# exampletype wf_bt_device, dev_type;  
  • 第四步:打开文件夹 mydroid/external/sepolicy/ ,你会发现有许多以进程名字命名的te文件:
    mydroid/external/sepolicy/

       在第一步中,这个节点是由 system_server 进程来访问,于是我们找到 system_server.te 打开,加入允许这个进程对 /dev/wf_bt 设备节点的读写权限:

# Allow system server to search and write to the persistent factory reset# protection partition. This block device does not get wiped in a factory reset.allow system_server block_device:dir search;allow system_server frp_block_device:blk_file rw_file_perms;allow system_server input_device:dir r_dir_perms;allow system_server input_device:chr_file rw_file_perms;# chr_file表示字符设备文件,如果是普通文件用file,目录请用dir  # rw_file_perms代表读写权限  # exampleallow system_server wf_bt_device:chr_file rw_file_perms;  //允许 system_server 进程拥有对 wf_bt_device 的这个字符设备的读写权限;

     这句话的意思是:允许 system_server 进程拥有对 wf_bt_device 的这个字符设备的读写权限。修改完后重新编译 mmm external/sepolicy -B,然后再重新生成刷机包,刷机测试。

0 0