华为悦盒 EC6108V9U 破解过程全记录(root扫盲) [原创]

电信宽带送的 IPTV 盒子,CPU 为 Hi3798M,1G 内存,8G 存储,支持 H.265 硬解码,系统为 Android 4.4.2,却只能看电视,岂不浪费?好在华为厚道,还是留了后门供 DIY。于是,经历了10余次刷机之后,终于破解成功,在此记录,与君分享。

目标

  • 不破坏 IPTV 功能
  • 能自由安装 App
  • 能播放外接 U 盘 / USB 硬盘上的视频文件

磨刀篇(扫盲)

关于 root

话说 root 这个词儿,源自 Unix/Linux。因为在 Unix 的世界里,root 用户就是超级用户,是系统管理员,相当于 Windows 系统中的 Administrator,也就是一个 Unix 系统中的 “上帝”!

Android 系统是基于 Linux 的,出于安全考虑,很多系统文件、目录不允许普通用户访问。“破解”Android 的目标,就是为了能自由访问系统文件,从而实现系统优化,或自行管理 App 的安装和卸载。所谓“root”一个 Android 系统,真正的含义其实是:让任意用户获取底层 Linux 的 root 用户权限。

关于 root 的基本原理,比较完整的解释:Android root 原理,简化一点的解释:Android的Root原理。

root 的基本步骤

所有的 root 方法,都不过是想尽一切办法找到某个厂家 Android 的漏洞,以便能把修改后的 su 放进系统的可执行目录,获得 root 权限。
基本步骤如下:

  1. 将可被任何用户执行的 su 可执行文件放入 /system/xbin 目录;
  2. 预装 Superuser/SuperSU 之类的 root 权限管理 App(放入 /system/app 目录);
  3. 将 Superuser 之类 App 的服务程序做成随 Linux 自启动的后台守护进程(比如写入 etc/init.d/)。

所有的 root 工具,都不过是将这个过程自动化,以便能自动判断手机型号、根据 Linux 的不同版本选择 su,仅此而已。

关于 su

其实 su 是 Unix/Linux 自带的程序,功能就是让普通用户能够临时成为 root 用户干活。但是在运行 Android 的 Linux 中,多半是被拿掉了,或者是被修改成仅供 root 用户运行的。因为 Linux 是开源的,所以就有好人用源码编译出一个带有正常功能的 su 的可执行文件,只要选对 Linux 的版本即可拿来用了。

关于 Android 系统的目录结构和配置文件

下面列出最紧要的几个,其他目录可参阅 Android 的文件系统结构。

  • /system/ 基本上所有的 Android 工具和应用程序都在这里。
    • /system/app/ 系统 App 存放目录,删不掉的 App 都在这里。
    • /system/bin/ 常用的可执行程序存放目录。
    • /system/etc/ 系统配置文件存放目录。
    • /system/framework/ Java平台架构核心库,存放 jar 包和 odex 优化的文件。
    • /system/lib/ 系统底层共享库,存放 .so 库文件。
    • /system/xbin/ 存放不常用的系统可执行程序,相当于 Linux 的 /sbin。
    • /system/build.prop 系统设置和变更属性文件。这是个文件,不是目录。
  • /data 存放用户软件和数据。
    • /data/app 普通 App 安装目录。

关于 Superuser

Superuser 是一个开源软件,源码在此。主要功能是监听并管理 App 对 su 的调用,给用户选择是否授予 root 权限。

主要原理是将 apk 层传入的本应放在 shell 进程中执行的命令,放到 daemonsu 创建 进程 sush 中执行。 其中 Daemonsu 为开机时启动的 su 守护进程(user 为 root)。 最重要的过程是 apk、su、daemonsu、sush、superuser 之间的通信。

通信过程大概为:

  1. 三方进程调用su,su 通过 socket 与 daemonsu 通信,
  2. daemonsu 创建sush,
  3. sush 通过 am 启动 superuser apk ,让用户选择是否授予其root权限。
  4. superuser 通过 socket 告知 sush 用户选择的结果
  5. sush 根据 apk 传过来的结果,选择继续执行或中断执行

详见 Superuser root 原理详细分析。

动手篇

root 方法有以下 2 种:

  1. 利用 ADB 模式,执行命令行脚本,分步完成。
  2. 进入 Recovery 模式,用别人已经 root 完的 ROM,整个替换掉现有的系统。

Recovery 方式(刷机)

Recovery 模式,顾名思义,是 Android 系统提供的恢复操作系统(ROM)、清除用户数据、恢复出厂设置的模式。所谓“刷机”,就是在 Recovery 模式下,把已 root 、已修改过的系统 ROM“恢复”到盒子的存储中去,覆盖现有系统。

刷机方式的好处是简单,适合不懂(或不想懂)计算机原理的人操作。但前提是必须找到适合自己盒子的 ROM 版本。因为盒子不像手机,各省、各个运营商都对 ROM 做过定制,IPTV 的配置参数更是各不相同,刷错了就变砖了。

因此,刷机方式:

  • 必须找到和自己盒子版本完全相同的 ROM;
  • 难以保留 IPTV 功能。

步骤如下(详见华为悦盒EC6108V9系列-海思芯片通刷固件破解教程):

  1. U 盘格式化为 FAT32,在根目录建个 upgrade 文件夹(有些盒子是直接放入根目录),把需要刷入的 ROM(update.zip 文件)拷入;
  2. 进入 Recovery 模式。注意 2 种遥控器的进入方式不同。详见 华为悦盒怎么进入REC模式、升级、双清、恢复出厂教程。
    屏幕上各个选项的含义如下(注意,各个型号的选项次序不一定相同):
    • Apply update from external storage 从外部存储中更新系统(刷机用)
    • Apply update from backup 从内部备份中更新系统(恢复出厂系统)
    • Wipe dalvik-cache partition 清除 Dalvik 缓存数据
    • Wipe data/factory reset 清除系统数据 / 恢复出厂设置
    • Wipe userdata partition 清除用户数据
    • Reboot 重启
  3. 选择 Apply update from external storage,开刷。
  4. 等待完成,重启盒子。

不过我得保留IPTV功能,所以选择下一种方案。

ADB方式(执行脚本)

华为悦盒 EC6108V9U 的 ADB 模式,天然就是带 root 权限的,这就是华为为我们开的 backdoor,不需要再费心费力去找 Linux 的漏洞了。这和一些 Android 手机不同。

判断 ADB 是否已经获到了 root 权限,只要看 shell 的提示符即可。“#”是 root 用户的专属提示符。

> adb shell
$                // 普通用户权限
#                // root 权限

基本步骤:

  1. 保证电脑和盒子的 IP 在同一个网段(子网)内。
  2. 开启盒子的“远程维护连接”,(设置--更多(或高级)--远程连接控制,设为允许),左下角会出现“DEBUG模式”。并记录本次连接的密码(每次开启都会生成新的密码,可以随时进来查看当前密码);
  3. 运行华为 STB 管理工具,导入同一目录下的许可证文件(*.dat);连接盒子,输入IP、连接密码;开启远程登录(ADB模式),提交。
  4. 运行破解脚本(*.bat),可能会有多个。
  5. 重启盒子。

详见华为悦盒电脑破解教程。

关于同一个 IP 网段

盒子和电脑都设置为同一段 IP,才能从电脑上连接到盒子去。“同网段”由 IP 地址和掩码共同决定的,可参阅 IP地址的定义和含义。
简单来说,就是掩码(mask)的每个字节(8 个二进制位)控制着对应 IP 字节是属于主机(Host)地址,还是属于网段地址,同一网段的掩码必定相同。IPv4 的地址由 4 个字节构成,相应的掩码也是 4 个字节。一般地,可以如下设置:

盒子 IP:192.168.0.1
盒子掩码:255.255.255.0

电脑 IP:192.168.0.2
电脑掩码:255.255.255.0

掩码为 255.255.255.0,表示 IP 地址的前 3 个字节(192.168.0.X)均为网段地址,用于识别网段,不用作识别主机。这时 IP 地址中的最后 1 个字节才是标识主机用的。各个主机必须设为不同的数字,总共有 256 (2 的 8 次方)种可能,再去掉第 1 个可用数字 0(固定用于代表本网段)和最后 1 个可用数字 255(固定表示本网段的广播地址),剩下 254 个可用数字(1-254)。也就是说,当掩码字节为 0 时,同网段最多可以接入 254 个主机。

当然,掩码可以是任意值,不一定非得是 0 或 255。这样 IP 拆分为网段和主机部分就得用二进制计算了,有专门的网站提供了方便,比如网络和IP地址计算器。

详细解析破解脚本

一般会有一个或多个 .bat 文件供运行。.bat 文件是普通的文本文件,只是后缀改成 .bat 而已,用记事本打开就行了,里面都是 windows/DOS 能够运行的命令。下面逐条解释一下几条主要命令:

.\root\adb kill-server

运行 root 目录下的 adb 程序,参数为 kill-server。作用是关闭已经在运行的 adb 进程。

set /p ip=请输入盒子的IP地址,然后按回车键:

获取用户键盘录入,赋值给变量 ip。这里务必准确输入盒子的 IP,比如 192.168.0.1。

.\root\adb connect %ip%:5555

运行 root 目录下的 adb 程序,参数为 connect %ip%:5555。作用是连接 ip 指定的盒子 IP 地址,端口为 5555。ADB 默认服务端口即为 5555,因此可省略为 adb connect 192.168.0.1。

.\root\adb shell mount -o remount,rw /system

运行 adb 程序,参数为 shell mount -o remount,rw /system,也即通过 ADB 在盒子上执行 mount -o remount,rw /system 命令。作用是将 /system 目录重新挂载为可读写模式,便于下面的写入操作,默认是只读的。

.\root\adb push .\root\su /system/xbin/su

运行 adb 程序,参数为 push .\root\su /system/xbin/su。作用是推送本地 root 目录下的 su 文件到盒子上的 /system/xbin/ 目录下,文件名仍然为 su。既然文件名不变,其实可以简写为 adb push .\root\su /system/xbin/。

.\root\adb shell "chmod 06755 /system/xbin/su"

运行 adb 程序,参数为 shell "chmod 06755 /system/xbin/su",即通过 ADB 在盒子上执行 chmod 06755 /system/xbin/su 命令。作用是将 /system/xbin/ 目录下的 su 文件的访问权限修改为 06755,也就是允许任意用户执行 su,详见 UNIX 文件权限。

.\root\adb push .\root\Shafa.apk /system/app/Shafa.apk.apk

运行 adb 程序,参数为 shell .\root\Shafa.apk /system/app/Shafa.apk.apk。作用是推送本地 root 目录下的 Shafa.apk 文件到盒子上的 /system/app/ 目录下,文件名为 Shafa.apk.apk,使得沙发桌面应用成为系统预装应用

.\root\adb shell "settings put secure install_non_market_apps 1"

运行 adb 程序,参数为 shell "settings put secure install_non_market_apps 1",即通过 ADB 在盒子上执行 settings put secure install_non_market_apps 1 命令。作用是允许盒子安装非官方市场的 App

.\root\adb shell "chmod 0000 /system/app/UpgradeOnline.apk"

运行 adb 程序,参数为 shell "chmod 0000 /system/app/UpgradeOnline.apk",即通过 ADB 在盒子上执行 chmod 0000 /system/app/UpgradeOnline.apk 命令。作用是将 /system/app/ 目录下的 UpgradeOnline.apk 文件访问权限该为 0000,也即禁止任何用户访问,以禁止盒子自动升级系统

.\root\adb shell "echo 1 > /system/etc/.installed_su_daemon"

运行 adb 程序,参数为 shell "echo 1 > /system/etc/.installed_su_daemon",即通过 ADB 在盒子上执行 echo 1 > /system/etc/.installed_su_daemon 命令。作用是在 /system/etc/ 目录下生成 .installed_su_daemon 文件(如果已存在则覆盖),文件内容为一个字符“1”,启用 su 的守护(常驻内存)标志。

.\root\adb shell mkdir /system/etc/init.d

运行 adb 程序,参数为 shell mkdir /system/etc/init.d,即通过 ADB 在盒子上执行 mkdir /system/etc/init.d 命令。作用是在 /system/etc/ 目录下新建 init.d 目录。该目录下的所有文件都被 Linux 视为系统启动时自动执行的脚本。

.\root\adb push .\root\android /system/framework/android.policy.jar

运行 adb 程序,将本地 root 目录下的 android 文件推送到盒子的 /system/framework 目录下,文件名变为 android.policy.jar,如有同名文件则覆盖。作用是解决按遥控首页不回桌面的问题。

adb pull /data/data/com.huawei.iptv.stb.stbconfig .\bak

运行 adb 程序,将盒子 /data/data/ 目录下的 com.huawei.iptv.stb.stbconfig 文件复制到本地的 bak 目录下。作用是备份用户数据

adb push .\bak\com.huawei.iptv.stb.stbconfig /data/data/

运行 adb 程序,将本地 bak 目录下的 com.huawei.iptv.stb.stbconfig 文件复制到盒子的 /data/data/ 下。作用是恢复用户数据

提取出厂固件

出厂时的固件,可以通过 Recovery 模式的 Apply update from backup 菜单进行恢复。出厂固件位于盒子存储的特定分区中,一般不会被覆盖,所以提取出来主要是为了修改里面的内容,比如制作已经 root 的 ROM。完整的命令如下(前面 2条是连接盒子和修改 /system 为读写模式):

adb connect 192.168.0.1
adb shell mount -o remount,rw /system
adb shell mkdir /tmp/bak
adb shell mount -t ext3 /dev/block/platform/hi_mci.1/by-name/backup /tmp/bak
adb pull /tmp/bak/update.zip ./update.zip

下面逐条解释一下这几条命令:

adb connect 192.168.0.1

运行 adb 程序,参数为 connect 192.168.0.1。作用是连接 192.168.0.1(盒子 IP 地址),端口用默认的(5555)。如接着前面的操作,则无需再执行了。

adb shell mount -o remount,rw /system

同上所述,将 /system 目录重新挂载为可读写模式。如接着前面的操作,则无需再执行了。

adb shell mkdir /tmp/bak

运行 adb 程序,在盒子上执行 mkdir /tmp/bak 命令。作用是在盒子的 /tmp/ 目录下新建一个名为 bak 的目录,用于挂载备份文件所在的分区。Unix 系统下要访问设备(存储设备分区也被视为一种设备),得先挂到某个目录下面,以便像访问文件一样访问设备。

adb shell mount -t ext3 /dev/block/platform/hi_mci.1/by-name/backup /tmp/bak

运行 adb 程序,在盒子上执行 mount -t ext3 /dev/block/platform/hi_mci.1/by-name/backup /tmp/bak 命令。作用是将 /dev/block/platform/hi_mci.1/by-name/backup 设备挂载为 /tmp/bak 目录,存储格式是 ext3。

adb pull /tmp/bak/update.zip

运行 adb 程序,从盒子的 /tmp/bak/ 目录下拉取 update.zip 文件,保存到当前目录下。这个就是盒子自带的 ROM 备份。

在拉取文件之前,还可以用以下命令查看一下挂载成功的分区(即 /tmp/bak 目录),我是看到里面只有一个 update.zip 文件的。

adb shell ls -l /tmp/bak

运行 adb 程序,列出盒子 /tmp/bak/ 目录下的文件。关于 ls 命令的详细信息,可参考 ls命令详解。

结束语

“天下武功,唯快不破”。只要抓住 root 的本质,略懂一点 Android 和 Linux,root 还是很容易的吧!

相关推荐