HarmonyOS Next 模拟器 root

HarmonyOS Next(Based on OpenHarmony)公测了,微信、QQ也都适配了,我们尝试修改HarmonyOS Next模拟器,获取root权限.

Android adb root权限回顾

玩过Android adb root的同学,可能对如何获取adb root并不陌生,一般而言,构建userdebug、eng版本,便能直接通过adb root,获取root权限.
至于user版本,想要变成adb root版本,则需要修改:

  • 修改default.prop/prop.default/build.prop等prop文件,将ro.debuggable由0改为1,可能也需要将ro.secure和ro.adb.secure由1改为0;
  • 编译userdebug版本的sepolicy,替换(增加编译su.te).
  • 可能需要编译userdebug版本的adbd,替换掉adbd;

之前尝试基于Magisk来作相关修改,测试能成功获取adb root权限,adb root Magisk 模块.
(待补充更多技术细节介绍……)

获取HarmonyOS Next模拟器的hdc root权限

获取模拟器镜像

从官网下载IDE:DevEco Studio,安装后,在IDE的界面下载模拟器镜像,按照QA解决相关问题,即可启动模拟器镜像.

模拟器镜像位于%LOCALAPPDATA%\Huawei\Sdk\system-image

开始修改

参考Android的adb root的修改方案,我们来修改HarmonyOS Next的模拟器的system.img.

1
2
3
4
5
6
7
8
9
//创建临时目录,用于挂载
mkdir system
//挂载为读写
sudo mount -o rw,loop system.img system
//进行各种修改,举例修改system/etc/param/ohos.para
sudo sed -i 's/const.secure=1/const.secure=0/g' system/system/etc/param/ohos.para
sudo sed -i 's/const.debuggable=0/const.debuggable=1/g' system/system/etc/param/ohos.para
//修改完后,卸载
sudo umount system

针对5.0.0.71(Beta1)版本的system.img,我修改了如下内容:

/system/etc/param/ohos.para

1
2
3
4
5
6
//修改前
const.secure=1
const.debuggable=0
//修改后
const.secure=0
const.debuggable=1

/system/etc/param/hdc.para

我们参考OpenHarmony的代码,直接替换:修改前developtools/hdc/src/daemon/etc/hdc.para修改后developtools/hdc/src/daemon/etc/hdc.root.para.

/system/etc/init/hdc.cfg

我们参考OpenHarmony的代码,直接替换:修改前developtools/hdc/src/daemon/etc/hdcd.cfg修改后developtools/hdc/src/daemon/etc/hdcd.root.cfg

大家如果对比在两个cfg,会发现root版本修改了hdcd进程启动的uid和selinux domain:
修改前:

1
2
"uid" : "shell"
"secon" : "u:r:hdcd:s0"

修改后:

1
2
"uid" : "root"
"secon" : "u:r:su:s0"

如果就这样启动,会提示找不到u:r:su:s0,很显然,user版本为了安全,也为了精简,不会编译su.te,从源代码base/security/selinux_adapter/sepolicy/ohos_policy/developtools/hdc/system/su.te我们也很明显看到su.te中使用了debug_only宏.
但是通过修改system.img,增加su domain的定义以及相关权限,可能需要编译源码对比编译产物,才好相对完整的添加到模拟器,有点麻烦,后面再尝试.
我使用如下临时方案:

  • 将hdcd.cfg的”u:r:su:s0”还原为”u:r:hdcd:s0”
  • 修改u:r:sh:s0的权限,改为permissive.

简单修改sepolicy

我们修改system/etc/selinux/sepolicy_common.cil,将sh改为permissive type.

1
2
3
4
修改前
(type sh)
修改后
(typepermissive sh)

测试

修改前:

  • hdc shell id,普通的shell权限(uid 2000)
  • setenforce 0,设置SELinux为Permissive失败
  • ls /data/,没有权限访问/data用户数据目录
    normal mode

修改后:

  • hdc shell id,root权限(uid 0)
  • setenforce 0,成功设置SELinux为Permissive
  • ls /data/,成功访问/data用户数据目录
    root mode

镜像下载

modified HarmonyOS Next Emulator

更新

有朋友分享了修改qcow2文件的方案,免修改原system.img.
Windows X86版本IDE,运行过的模拟器,qcow2文件位于%LOCALAPPDATA%\Huawei\Emulator\deployed
吐槽一下,DevEco Studio没有Linux版本,但是DevEco Device Tool却有Linux版本.

参考

DevEco Studio
DevEco Studio QA