HarmonyOSNext模拟器Root(无视模拟器镜像完整性验证)

1,797 阅读4分钟

DevecoStudio Release版本发布了,更新一下步骤

思路

由于模拟器的特性,我们是可以完全的控制模拟器的镜像的,那么就可以通过挂载和修改镜像文件实现对模拟器系统的修改,从而获取Root权限,但是模拟器本身有img镜像的完整性验证,此时我就想到HarmonyOS模拟器是qemu改的,那么它在运行过程中就会产生qcow文件,模拟器又不会校验这个文件得完整性,那么修改这个文件是否可以对模拟器产生效果呢,这就是本文思路的来源。

环境

修改镜像使用:Ubuntu 22.04

模拟器是运行在 Mac 上的Arm版本

模拟器镜像版本 3.0.0.36(Beta 3)、5.0.0.102

准备工作

  1. 找到镜像文件

    qcow2文件,在模拟器的Emulator/deployed/Huawei_Phone,可以从DevEcoStudio的设备管理界面中查看

image-20241028143800033.png 镜像文件,在SDK目录下的 Huawei/Sdk/system-image/HarmonyOS-NEXT-DB3/phone_arm中,具体路径可在模拟器设置页面看到

image-20241028144307492.png

  1. 安装libguestfs-tools工具(从现在开始皆在Ubuntu中操作)

    # 建议从此步骤开始,直接切换为root用户
    sudo su
    apt-get install libguestfs-tools
    
  2. 查看镜像分区

    查看和挂载分区都需要原始的system.img文件,查看分区时如果报错找不到文件,则可以根据报错信息新建文件夹然后将原始的img文件放进去即可,例如报错信息提示找不到/xxx/xx/xxx/xxx/system.img,那么最简单的办法就是根据这个报错新建文件夹,并且将system.img放进去

    virt-filesystems -a xxx.qcow2
    

    如果执行无异常,返回信息为:

    /dev/sda
    

    如果存在异常,则可能提示信息为

    libguestfs: error: qemu-img: /tmp/libguestfszSnN3J/overlay1.qcow2: qemu-img exited with error status 1.
    To see full error messages you may need to enable debugging.
    Do:
      export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
    and run the command again.  For further information, read:
      http://libguestfs.org/guestfs-faq.1.html#debugging-libguestfs
    You can also run 'libguestfs-test-tool' and post the *complete* output
    into a bug report or message to the libguestfs mailing list.
    

    此时根据提示信息,设置环境变量

    export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1
    

    之后再次执行

    virt-filesystems -a system.img.qcow2
    

    此时错误提示信息会包含如下内容

    Could not open backing file: Could not open '/Users/xxx/xxx/Huawei/Sdk/system-image/HarmonyOS-NEXT/phone_arm//system.img': No such file or directory
    

    根据报错的路径新建文件夹,并将第一步找到的system.img文件放到对应文件夹

    mkdir -p /Users/xxx/xxx/Huawei/Sdk/system-image/HarmonyOS-NEXT/phone_arm/
    mv /xxx/xxx/system.img /Users/xxx/xxx/Huawei/Sdk/system-image/HarmonyOS-NEXT/phone_arm/
    

    之后再次执行

    export LIBGUESTFS_DEBUG=0 LIBGUESTFS_TRACE=0
    virt-filesystems -a system.img.qcow2
    

    此时应该已可以正常打印

    /dev/sda
    

    挂载分区

  1. 挂载分区

    guestmount -a xxx.qcow -m /dev/sda1 /mnt/s
    

    /dev/sda1 根据virt-filesystems的输出进行修改

    -a 指定镜像文件

    -m 指定镜像文件需要挂载的目录

    /mnt/s 指定本地的挂载点,需要本地事先已经存在此路径,若不存在,需要新建

  1. 查看和修改文件

    进入挂载目录之后就可以正常查看和修改,修改后立即生效,qcow随即发生变动

    需要注意的是,此时修改镜像中的文件会提示只读文件无法修改,在保存时增加叹号进行强制保存即可,如::x!

    cd /mnt/s
    

修改文件添加root

此处参考大佬的方案进行,可以直接去看大佬的文章去改也可以HarmonyOS Next 模拟器 root

  1. 修改system/etc/param/ohos.para

    //修改前
    const.secure=1
    const.debuggable=0
    //修改后
    const.secure=0
    const.debuggable=1
    
  2. 修改system/etc/param/hdc.para

    直接把源码中的内容搬到本地文件中,全部覆盖

    修改前:

    const.hdc.version = "Ver: 3.0.0b"
    

    修改后

    const.hdc.version = "Ver: 3.0.0b"
    persist.hdc.mode.usb = "enable"
    persist.hdc.mode.tcp = "disable"
    persist.hdc.mode.uart = "disable"
    
  3. 修改system/etc/init/hdcd.cfg

    同样,直接把源码中的内容搬到本地,全部覆盖,注意只覆盖文件内容,不要改文件名字哦

    这里内容有点多,就不展示了,直接去看源码即可

  4. 修改完成后,qcow2文件就会同步发生改变,此时直接将其复制到模拟器对应路径下覆盖原文件即可

  5. 如果是新版本(当前验证版本是5.0.0.102),需要多修改两处内容

    1. system/etc/init/hdcd.cfg中倒数第二行的"secon" : "u:r:su:s0",需要修改为"secon" : "u:r:hdcd:s0",
    2. system/etc/selinux/system_common.cil 中的type sh需要修改为(typepermissive sh)

验证效果

hdc shell进去查看一下,效果如下:

image-20241028145118069.png

卸载

执行以下命令即可卸载镜像

umount /mnt/s