快捷方式移动宽带送的 IPTV 盒子,型号 EC6108V9U,CPU 为 Hi3798M,1G 内存,8G 存储,支持 H.265 硬解码,系统为 Android 4.4.2,却只能看电视,岂不浪费?好在华为厚道,还是留了后门供 DIY。于是,经历了10余次刷机之后,终于破解成功,在此记录,与君分享。(听说还有个 CA 版的,不过我不是。)
- 进入 Recovery 模式
- 按遥控首页不回桌面
- 去除系统被篡改的提示
- 系统预装应用
- 允许盒子安装非官方市场的 App
- 禁止盒子自动升级系统
- 备份用户数据
- 恢复用户数据
- 提取出厂固件
- 恢复出厂固件
- 观看本地视频
- 不破坏 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 权限。基本步骤如下:
- 将可被任何用户执行的 su 可执行文件放入 /system/xbin 目录;
- 预装 Superuser/SuperSU 之类的 root 权限管理 App(放入 /system/app 目录);
- 将 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 之间的通信。
通信过程大概为:
- 三方进程调用su,su 通过 socket 与 daemonsu 通信,
- daemonsu 创建sush,
- sush 通过 am 启动 superuser apk ,让用户选择是否授予其root权限。
- superuser 通过 socket 告知 sush 用户选择的结果
- sush 根据 apk 传过来的结果,选择继续执行或中断执行
详见 Superuser root 原理详细分析。
动手篇root 方法有以下 2 种:
- 利用 ADB 模式,执行命令行脚本,分步完成。
- 进入 Recovery 模式,用别人已经 root 完的 ROM,整个替换掉现有的系统。
Recovery 方式(刷机)
Recovery 模式,顾名思义,是 Android 系统提供的恢复操作系统(ROM)、清除用户数据、恢复出厂设置的模式。所谓“刷机”,就是在 Recovery 模式下,把已 root 、已修改过的系统 ROM“恢复”到盒子的存储中去,覆盖现有系统。
刷机方式的好处是简单,适合不懂(或不想懂)计算机原理的人操作。但前提是必须找到适合自己盒子的 ROM 版本。因为盒子不像手机,各省、各个运营商都对 ROM 做过定制,IPTV 的配置参数更是各不相同,刷错了就变砖了。
因此,刷机方式:
- 必须找到和自己盒子版本完全相同的 ROM;
- 难以保留 IPTV 功能。
步骤如下(详见华为悦盒EC6108V9系列-海思芯片通刷固件破解教程):
- U 盘格式化为 FAT32,在根目录建个 upgrade 文件夹(有些盒子是直接放入根目录),把需要刷入的 ROM(update.zip 文件)拷入;
- 进入 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 重启 - 选择 Apply update from external storage,开刷。
- 等待完成,重启盒子。
不过我得保留IPTV功能,所以选择下一种方案。
ADB方式(执行脚本)
华为悦盒 EC6108V9U 的 ADB 模式,天然就是带 root 权限的,这就是华为为我们开的 backdoor,不需要再费心费力去找 Linux 的漏洞了。这和一些 Android 手机不同。
判断 ADB 是否已经获到了 root 权限,只要看 shell 的提示符即可。“#”是 root 用户的专属提示符。
> adb shell $ // 普通用户权限 # // root 权限
基本步骤:
- 保证电脑和盒子的 IP 在同一个网段(子网)内。如果都是用 DHCP 获取 IP 的,默认就是同一网段。Wifi 或 有线网络均可,只是盒子优先认网线,想用 Wifi 就必须拔下网线。
- 开启盒子的“远程维护连接”,(设置--更多(或高级)--远程连接控制,设为允许),左下角会出现“DEBUG模式”。并记录本次连接的密码(每次开启都会生成新的密码,可以随时进来查看当前密码);
- 运行华为 STB 管理工具,导入同一目录下的许可证文件(*.dat);连接盒子,输入IP、连接密码;开启远程登录(ADB模式),提交。
- 运行破解脚本(*.bat),可能会有多个。
- 重启盒子。
详见华为悦盒电脑破解教程。
关于同一个 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,如有同名文件则覆盖。作用是解决按遥控首页不回桌面的问题。
.\root\adb shell "> /system/checksum.img"
运行 adb 程序,将盒子 /system/ 目录下的 checksum.img 清为 0 个字节的文件。作用是去除系统被篡改的提示。盒子在启动时,会对几个关键文件进行校验,校验数据保存在 checksum.img 文件中,将其内容清为 0 就取不到校验数据了,也就不提示了。其实盒子提示被篡改也没啥关系,多点击一次确定罢了,继续用就是了。
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命令详解。
观看本地视频要不怎么说华为厚道呢,内置的媒体中心App 天然就能播放本地视频,根本不需要安装什么暴风影音之类的!进入第三方桌面,就能打开媒体中心看视频了,简单吧。