在没有root的前提下,system分区为只读,若要动态修改该分区下的文件,可以按照下面流程实现:
1.写执行脚本,这里以修改system/etc/hosts文件为例,在/device/mediatek/mt67xx目录下创建名为modifyhosts.sh的文件,文件内容如下:
# 修改system分区为可读写
mount -o remount,rw /system
# 修改内容,可以执行拷贝、删除、写入等操作
echo 127.0.0.1 localhost > /etc/hosts
# 修改hosts文件权限
chmod 644 /etc/hosts
# 修改system分区为只读
mount -o remount,ro /system
PRODUCT_COPY_FILES += $(LOCAL_PATH)/modifyhosts.sh:system/bin/modifyhosts.sh
service remount-sys /system/bin/modifyhosts.sh
# 这个服务不能通过启动一类服务来启动,只能单独以名字来启动
disabled
# 服务只运行一次,退出后不再重启
oneshot
# 将domain设置为modifyhosts的属性,表明modifyhosts是用来描述进程的安全上下文的
type modifyhosts, domain;
# 调试时先加上下面这一句,它会打印出所有需要申请的权限,调试完成后删除该语句。
permissive modifyhosts;
# 将exec_type和file_type设置为modifyhosts_exec的属性,表明modifyhosts_exec是用来描述可执行文件的安全上下文的
type modifyhosts_exec, exec_type, file_type;
init_daemon_domain(modifyhosts)
/system/bin/modifyhosts.sh u:object_r:modifyhosts_exec:s0
6.添加SELinux权限,由于不知道需要添加哪些权限,故按上面5个步骤操作完后,可以先编译版本刷机,之后在adb shell 下执行:
setprop ctl.start remount-sys
dmesg > /data/data/a.txt
log内容如下:
[ 659.805760] .(0)[269:logd.auditd]type=1400 audit(1481859095.080:77): avc: denied { remount } for pid=5080 comm="mount" scontext=u:r:modifyhosts:s0 tcontext=u:object_r:labeledfs:s0 tclass=filesystem permissive=1
allow 主体的Type 客体的Type:操作 权限1;
或者:
allow 主体的Type 客体的Type:操作 { 权限1 权限2 };
allow modifyhosts labeledfs:filesystem { remount };
libsepol.report_failure: neverallow on line 284 of external/sepolicy/domain.te (or line 5613 of policy.conf) violated by allow modifyhosts labeledfs:filesystem { remount };
libsepol.check_assertions: 1 neverallow failures occurred
neverallow { domain -kernel -init -recovery -vold -zygote
-modifyhosts # add by zhangyongfei
} { fs_type -sdcard_type }:filesystem { mount remount relabelfrom relabelto };
// remount-sys是在init.rc中自定义的服务名
SystemProperties.set("ctl.start","remount-sys");