一种老旧安卓电视通用Root与优化方案-以创维G7200_8H87为例

前言

众所周知,国内智能电视的各种广告和安装限制一直是令人头疼的问题。

或许对于新出的智能电视还可以接受,但是在一些老旧的智能电视上已经会导致严重的卡顿问题。

家里有一台2015年的创维G7200的电视,机芯为8H87。

这台机器的配置在如今2023年已经显得有些捉襟见肘,但是不断弹出的各类广告和开机启动的系统应用都进一步拖慢了电视的运行速度。

G7200 8H87系列在2018年6月更新了最后一个酷开6.0版本的系统后就再也没有提供过系统更新。

由于系统安装包瞎改容易变砖,所以最好的解决方案就是直接对当前的电视系统Root后再进行优化。 纵观常见的Root方案,电视上直接运行Root软件已经被证实操作失败,而电视也没有方便的办法刷boot.img。 于是,能否有方法直接获取电视的Root权限?

观前提示

本人只在创维G7200_8H87上操作成功,但是这个方案理论上可以推广到更多旧的电视上。

这里会详细介绍解决问题的思路,给出需要的工具,但是依然会涉及到很多系统知识。

所有使用的工具都是开源的,但是并不是一键解决的方案,需要使用命令行进行操作。

不建议什么都不懂的人直接在本文的给出的操作提示下直接操作电视。

如果没有办法使用ADB或者命令窗口,抱歉到这里就可以结束了。

本文主要目的是知识分享,请尊重知识版权谢谢。
对于任何基于本文操作导致出现任何问题的情况,本人概不负责。

Root智能电视

寻找方案

对于智能电视,不想要拆机的人显然没法直接刷写指定的固件。

在部分智能电视上,Root软件例如"King Root"或"360 Root"都不起效果,因为系统被修改的很彻底。

所以想要Root就只能另辟蹊径利用一些公开的系统CVE方案。

对于智能电视特别是老旧的智能电视,这就是一个可以利用的CVE方案。

以创维G7200_8H87为例,最新的版本是2018年6月发布的酷开6.0,Android 5.0 (21),arm64-v8a架构(64位),Linux内核3.10.61。

值得一提的是,这个系统下的SELinux是关闭状态。

寻找可用的方案除了可以直接搜索之外,还可以看官网公告

通过搜索和结合官网公告进行筛选,最终确定了可用范围从Linux内核2.x到4.8.3的2016/5195 CVE方案。

从描述来看确实"3.10.61"符合条件,但是实际使用需要经过测试。

选择它的另一个原因是XDA有人开发并提供了预编译的文件可以直接使用,这比起自己去研究怎么利用要便捷的多。

这里放一个Github的项目链接,如果要下载与编译版本则查看Github release

只需要下载VIKIROOT-v0.1.1.zip即可(只有64位的版本)。

使用这个工具有个好处,就是就算操作失败,重启设备后就会恢复原样(但是不重启再次执行也无法继续再次运行)。

开启ADB

这里以使用ADB为例讲解如何操作,如果有毅力在电视上运行终端APP执行命令当然也是可以的。

创维G7200_8H87,保持连接家庭局域网的联网状态(就是连接到家里WIFI)。 打开设置,本机信息,用遥控器按"上上下下,左右左右",即可进入工厂菜单。 工厂菜单中,通用设置,ADB开关,然后启用即可。 在设置,本机信息中,可以看到电视的IP地址(如果有其他方法找到电视的IP地址也行)。

在电脑上运行ADB客户端需要下载工具,如果自己电脑上有,并且能用那就再好不过了。 这里给出官方的34.0.4版本的下载链接:

  • Windows
    SHA1: d245eedc17259b15e799c312e9014f78aea3da21
  • MacOS
    SHA1: ecc476b9801fcb6ea61605eedf60f85217964f09
  • Linux
    SHA1: faaac1c05af0e3fa20baee6e8970d96fb53bfe58

开启任意一个命令窗口,在含有adb.exe的目录下使用adb命令连接到电视。

shell 复制代码
# adb connect "电视IP"
# 部分电视需要指定端口号,默认端口5555
# 例如:
adb connect 192.168.1.100
# 出现 connected to 192.168.1.100:5555 即连接成功
# 进入电视的命令行界面 (这是电视系统的命令行了别搞错)
adb shell

另外附加一些电视系统的命令行下的常用命令:

(所有命令前使用adb shell开头都可以在自己电脑的命令行环境下使用)

shell 复制代码
# 查看Linux内核版本
cat /proc/version
# 查看所有系统信息
getprop
# 查看系统版本名称
getprop ro.build.version.release
# 查看系统SDK版本
getprop ro.build.version.sdk
# 查看CPU支持的架构
getprop ro.product.cpu.abilist

获取临时Root权限

确认好电视的版本是支持的,就可以进一步操作了。

提前解压VIKIROOT-v0.1.1.zip得到exploit文件。

shell 复制代码
# 再开一个自己电脑的命令行窗口用于发送文件
# 请注意替换exploit文件位自己电脑上它的位置
# 命令含义:将exploit文件推送到/data/local/tmp目录下
adb push exploit /data/local/tmp

回到刚才打开的电视系统的命令行窗口:

shell 复制代码
# 电视的命令行界面
# 打开/data/local/tmp目录
cd /data/local/tmp
# 为exploit文件赋予执行权限(否则不能运行)
chmod +x exploit

# 执行当前目录下的exploit
./exploit
# 如果一切顺利,就可以看到如下提示:
# CVE-2016-5195 POC FOR ANDROID 6.0.1 MARSHMALLOW
# Usage:
# exploit port: use local terminal.
# exploit ip port: use remote terminal.
# 如果执行失败,说明你的电视不是ARM架构的64位系统,请自行编译或者寻找其它方案

这个帮助命令告诉我们有两种方式启动,一种是本地命令窗口,另一种是远程命令窗口。

远程命令窗口需要使用nc命令在自己电脑上连接,我尝试了但是没成功过。

所以,不如使用本地命令窗口模式方便。

但是,由于未知原因,直接使用本地命令窗口模式可能会出现一直卡等待的情况,所以如果出现这个情况可以先启动远程命令窗口等待自动30秒关闭后,再启动本地命令窗口。

如果想要试试能不能本地命令窗口直接使用:

shell 复制代码
# 电视的命令行界面
# 在10800端口开启本地命令窗口
./exploit 10800
# 如果出现:
# >>> Reverse shell target: 127.0.0.1:10800
# >>> Exploit process starts.
# >>> Inject: patch 1/2
# >>> Inject: patch 2/2
# >>> Please wake up you phone now.
# 的输出提示后不动了,可以尝试打开或者关闭蓝牙/打开或者关闭闹钟(时钟)应用
# 如果依然卡在这里,那就只能重启电视重新换下面的方法继续了
# 如果成功继续执行,详见后面的教程

先启动远程命令窗口等待自动30秒关闭后,再启动本地命令窗口的方法:

shell 复制代码
# 电视的命令行界面
# 在IP0.0.0.0与10800端口开启本地命令窗口
./exploit 0.0.0.0 10800
# >>> Reverse shell target: 0.0.0.0:10800
# >>> Exploit process starts.
# >>> Inject: patch 1/2
# >>> Inject: patch 2/2
# >>> Please wake up you phone now.
# >>> Restore process will start in 30s.
# >>> Restore process starts.
# >>> Remove: patch 2/2
# >>> Remove: patch 1/2
# >>> Removing .x file.
# 等待一次打补丁与反打补丁执行完成

# 在10800端口开启本地命令窗口
./exploit 10800
# 如果出现:
# >>> Reverse shell target: 127.0.0.1:10800
# >>> Exploit process starts.
# >>> Inject: patch 1/2
# >>> Inject: patch 2/2
# >>> Please wake up you phone now.
# >>> Waiting for reverse connect shell.
# >>> Enjoy!
# ====================TERMINAL====================
# 就说明一切顺利,完成了打补丁
# 此时不要退出这个窗口或者程序,因为打补丁得到的权限只在目前本次启动的命令下时有用

# 在这里输入的任何命令都是作为临时的Root权限执行的
# 需要注意的是,这个窗口无法使用左右上下的按键,也无法粘贴文本,只能输入,删除和回车。

# 查看可用的命令所在位置 $PATH
echo $PATH
# 本人的机器返回的结果为 /usr/bin:/bin 意思就是/system/bin与/system/xbin的命令必须指定路径才能执行

# 查看当前用户ID
/system/bin/id
# 如果返回 uid=0(root) gid=0(root) 说明当前为root账户

如果想要修改系统文件,则需要挂载分区为可读写,以下命令按需求使用:

shell 复制代码
# 挂载根目录为可读写
/system/bin/mount -o remount /

# 挂载/system分区为可读写
/system/bin/mount -o remount /system

在这个情况下可以执行任何想要的操作了,但是这是一个临时的Root权限并且启动的操作很复杂。

另外,每次执行命令无法粘贴,修改,必须指定路径都非常繁琐。 因此,我们需要将其变为永久的Root权限,即加入su命令。

获取永久Root权限

就本人而言,并没有在电视上使用SuperSU等Root管理软件的需求。

因为旧的智能电视本来空间就小,卸载不用的系统软件后也禁不起Magisk或者Exposed的折腾了。

本人希望把电视清理干净后就基本用不到Root权限了,知识作为一种应急需求。

所以,本人使用了一种不使用SuperSU等Root管理软件,直接使用su命令的方案。

首先,我们需要从SuperSU的官网下载预编译的su命令(如果你的电视系统不支持运行这个su命令,就需要去寻找其他可用的了)。

点击这个链接可以跳转到下载页面,下载Recovery V2.82 Flashable.zip

解压到本地,根据CPU架构选择合适的su文件(G7200_8H87是arm64架构)。

shell 复制代码
# 在自己电脑的命令行窗口发送文件
# 请注意替换su文件位自己电脑上它的位置
# 命令含义:将su文件推送到/data/local/tmp目录下
# 注意,adb依然没有也不会有root权限(后面会说明),所以只能把文件发送到这个临时目录中
adb push su /data/local/tmp
shell 复制代码
# 打开刚才的电视的命令行界面(获得临时Root权限的窗口)
# 挂载/system分区为可读写
/system/bin/mount -o remount /system

# 先把exploit文件自己复制到系统文件夹,方便以后使用
/system/bin/cp /data/local/tmp/exploit /system/xbin/exploit

# 然后把su文件复制到系统文件夹
/system/bin/cp /data/local/tmp/su /system/xbin/su

# 使用命令查看其他文件的权限和拥有者信息
/system/bin/ls -l /system/bin

# 给两个文件设置合适的权限
/system/bin/chmod 755 /system/xbin/exploit
/system/bin/chmod 755 /system/xbin/su

# 给两个文件设置合适的拥有者
/system/bin/chown root:shell /system/xbin/exploit
/system/bin/chown root:shell /system/xbin/su

# 此时,su命令就可以尝试使用了,如果输出一些帮助信息就是执行成功
/system/xbin/su

# 但是,此时su命令还没有设置为系统守护进程,所以su命令是无法在命令行中正常使用切换权限的
# 我们可以通过以下命令在Root权限下设置为系统守护进程
# 这样只要电视没重启,打开一个新的命令窗口,使用adb shell进入电视命令行界面,就能正常使用su命令切换为root账户
/system/xbin/su -ad &

# 如果想要开机启动的时候就能够自动设置为系统守护进程
# 就需要在系统开机就能够执行的脚本上动手脚
# 多数系统中/system/bin/install-recovery.sh文件和/system/etc/install-recovery.sh文件都是自动开机最高权限执行的脚本
# 如果你的电视不是G7200_8H87并且想要确认一下是不是自动开机执行的脚本,可以使用如下命令查看
/system/bin/cat /init.rc
# 如果发现存在 service flash_recovery /system/bin/install-recovery.sh 的句子,就说明这是一个自动开机执行的脚本
# 如果不存在,则可以寻找其他的方案,或者先试一试/system/bin/install-recovery.sh文件和/system/etc/install-recovery.sh文件

# 此处以/system/bin/install-recovery.sh文件为例
# 查看是否存在/system/bin/install-recovery.sh文件
/system/bin/cat /system/bin/install-recovery.sh
# 如果返回No such file or directory则不存在

# 如果/system/bin/install-recovery.sh文件不存在,则执行
# 若存在,则忽略这句命令
echo "#!/system/bin/sh" >> /system/bin/install-recovery.sh

# 写入一个换行,避免出现问题
echo "" >> /system/bin/install-recovery.sh

# 写入要执行的命令
echo "/system/xbin/su -ad &" >> /system/bin/install-recovery.sh

# 再次查看/system/bin/install-recovery.sh文件中的内容
# 此时文件末尾应该就是刚才写入的内容了
/system/bin/cat /system/bin/install-recovery.sh

# 如果/system/bin/install-recovery.sh文件不存在,则需要手动设定权限和拥有者
/system/bin/chmod 755 /system/bin/install-recovery.sh
/system/bin/chown root:shell /system/bin/install-recovery.sh

至此,你的电视就已经完美的获得了永久的Root权限,可以重启尝试一下了。

为了避免其它应用直接使用这个su命令,我们还可以将/system/bin/install-recovery.sh文件改名字避免开机执行。

只在需要的使用通过exploit将文件名改回来,然后重启后正常使用su命令。

注意:改名字仅限/system/bin/install-recovery.sh文件一开始不存在的情况,若是存在就最好只是把开机执行的命令注解了。

虽然老旧的系统存在如此多的问题,但是能避免直接利用最高权限的应用也是好的。

使用Root权限

完成以上的步骤,重启电视,然后在本机的命令行窗口像之前一样连接电视:

shell 复制代码
# 连接电视IP的ADB
adb connect 192.168.1.100

# 打开电视的命令行界面
adb shell

# 执行root用户切换
su
# 默认用户前缀一般是 shell@XXXXXX:/ $
# root用户前缀一般是 root@XXXXXX:/ #
# 如果看到切换为root用户,并且前缀中以#结尾,那就要恭喜你成功获取root权限了

# 挂载/system分区为可读写
# 然后愉快的精简系统吧
mount -o remount /system

关于ADB Root权限

有一些人会奇怪,为什么有Root权限了,adb依然无法直接写入系统文件。

这是因为adb默认使用的就是最普通的用户权限而不是root用户,没有写入系统文件的权限。

虽然有adb root命令可以设置为使用root用户,但这个仅在debug的开发版本的系统中有效。

就算手动在build.prop添加配置,也是无法生效的,因为这个是写死在boot分区中的。

所以获得Root权限后,还是需要在电视的命令行界面使用su命令才能切换root用户,进行高权限的操作。

创维G7200_8H87系统精简优化方案

看到这里,如果你成功获取了Root权限但是不是创维电视系统,就可以退出了。

如果你是创维G7200_8H87机芯,那么继续跟着操作就好。

如果你是创维其它型号或者版本的电视系统,那么请务必有选择参考以下操作。

以下给出了部分可用的精简方案,你可以在有Root权限的基础上做到更多。

删除开机广告以及卸载无用的系统应用

shell 复制代码
# 在电视命令行窗口,获取su Root权限,并挂载/system分区为可读写后执行以下命令
# 查看全部安装的应用
pm list packages

# 以下使用的卸载方法是保留原始文件在系统中,但是不让其继续运行
# 你也可以使用disable-user的方法禁用这些应用
# 但是卸载后应用不会出现在第三方桌面,只是禁用还是可能会出现的
# 只卸载不删除的目的是为了万一出问题还能恢复
# 当然你也可以卸载后再去删除/system/app或者/system/vendor或者/data/app下的文件

# 卸载广告服务
# 只要卸载了就不会有开机广告了
# 有可能导致开机启动的加载页面会黑屏闪1s
pm uninstall -k --user 0 com.tianci.ad

# 以下应用按需卸载,或者你可以卸载其它不想要的
# 经过测试卸载以下应用不会出现严重系统问题

# 卸载天气
pm uninstall -k --user 0 com.icoolme.tv.weather

# 卸载小维智联
pm uninstall -k --user 0 com.skyworth.smarthome_tv

# 卸载商城
pm uninstall -k --user 0 com.coocaa.mall

# 卸载卡拉OK
pm uninstall -k --user 0 com.bajintech.karaok

# 卸载语音助手
pm uninstall -k --user 0 com.skyworth.lafite.srtnj.speechserver

# 卸载亲朋圈
pm uninstall -k --user 0 com.skyworth.voip

还原卸载的系统应用

如果误操作卸载了某个应用,可以通过这个方法还原:

shell 复制代码
# 列出所有已卸载的应用所在的位置,例如com.icoolme.tv.weather
pm list packages -u -f | grep com.icoolme.tv.weather

# 返回的结果为:package:/system/app/ZuiMeiWeather/ZuiMeiWeather.apk=com.icoolme.tv.weather
# 所以我们可以使用以下命令还原
pm install -r --user 0 /system/app/ZuiMeiWeather/ZuiMeiWeather.apk

替换应用市场

如果你提前通过各种方式安装了其它的应用市场,则可以直接卸载自带的应用圈

在电脑本机的命令窗口执行以下命令安装XXX.apk:

shell 复制代码
adb shell install -r XXX.apk

如果你希望安装其为一个系统应用可以看后面的教程。

在电视命令窗口执行以下命令卸载应用圈:

shell 复制代码
pm uninstall -k --user 0 com.tianci.appstore

注意:如果卸载了"应用圈",信号源中的"我的应用"会处于点击无反应的情况

修改系统文件

假设你想修改/system/build.prop文件,则可以执行以下命令:

shell 复制代码
# 在电视命令行窗口操作

# 命令行中查看文件内容(可选)
cat /system/build.prop
# 命令行中查看文件权限和拥有者
ls -l /system | grep build.prop
# 备份文件
cp -a /system/build.prop /system/build.prop.bak

# 在电脑命令行窗口操作

# 将/system/build.prop文件拉取到当前目录
adb pull /system/build.prop .

# 你可以修改拉取的build.prop文件

# 将build.prop文件推送到/data/local/tmp
adb push build.prop /data/local/tmp/

# 在电视命令行窗口操作
mv /data/local/tmp/build.prop /system/build.prop

# 设置正确的权限和拥有者
# 这一步因不同的文件而异,请先确认自己修改的文件需要哪些权限
chmod 644 /system/build.prop
chown root:root /system/build.prop

安装一个应用为系统应用

假设你有一个Launcher.apk想安装为系统应用,则可以执行以下命令:

shell 复制代码
# 在电脑命令行窗口推送APK
adb push Launcher.apk /data/local/tmp

# 接下来在电视命令行窗口操作

# 打开/system/priv-app文件夹
# 虽然放在/system/app也可以,但是/system/priv-app文件夹下的APP权限更大
cd /system/priv-app

# 新建一个文件夹Launcher
# 取名随意,必须英文无空格,不要和其他的文件重复
mkdir Launcher

# 设置文件夹权限
chmod 755 Launcher
chown root:root Launcher

# 将APK移动到Launcher/下
mv /data/local/tmp/Launcher.apk Launcher/

# 打开Launcher文件夹
cd Launcher

# 设置Launcher.apk权限
chmod 644 Launcher.apk
chown root:root Launcher.apk

重启电视,就可以发现这个应用被安装为系统应用了。

替换默认主页

替换默认的主页,首先需要将一个主页APK安装为系统应用。

但是,在创维G7200_8H87上,就算安装为系统应用也无法通过按主页键回到指定的主页APP。

也不会弹出任何要求选定默认主页APP的选项。

在此情况下,若是直接禁用或者卸载默认的主页APP则会导致主页完全无法打开的问题。

本人在查看了许多系统文件后,在/data/data/com.tianci.setting/shared_prefs/tcsetting.xml文件中找到了解决方案。

这个文件定义了系统的配置文件所在的位置,即<string name="preSavedPcfgPath">/system/pcfg/8H87_G7200/config</string>

打开这个config文件夹,就可以发现许多配置文件了。

找到general_config.xml文件,拉取到本地进行修改。

shell 复制代码
# 在电脑命令行窗口
# 拉取配置文件到本地的当前文件夹
adb pull /system/pcfg/8H87_G7200/config/general_config.xml .

将其中的:
<config name="DEFAULT_HOMEPAGE" value="com.tianci.movieplatform/com.coocaa.homepage.vast.HomePageActivity" />

修改为你想要的主页的启动包名和Activity名称。

本人使用了Emotn UI,所以修改为:
<config name="DEFAULT_HOMEPAGE" value="com.oversea.aslauncher/com.oversea.aslauncher.ui.main.MainActivity" />

最后保证有原始文件备份,将这个文件替换过去,保证权限和拥有人正确,重启电视即可生效。

shell 复制代码
# 在电脑命令行窗口
# 推送本地文件到缓存目录
adb push general_config.xml /data/local/tmp

# 在电视命令行窗口操作
# 备份并设置新的配置文件
mv /system/pcfg/8H87_G7200/config/general_config.xml /system/pcfg/8H87_G7200/config/general_config.xml.bak
mv /data/local/tmp/general_config.xml /system/pcfg/8H87_G7200/config/general_config.xml

# 最后设置权限和拥有人
chmod 644 general_config.xml
chown root:root general_config.xml

# 重启电视
reboot

重启电视后可以打开任意APP,点击主页按钮,就能返回到自定义的主页APP了。

确保生效后就可以卸载原来默认的主页APP了。

shell 复制代码
# 在电视命令行窗口操作
# 卸载默认主页
pm uninstall -k --user 0 com.tianci.movieplatform

目前已知存在的问题:由于第三方主页没有缓冲加载界面,开机后首次打开可能会黑屏1~2s。

其他创维系统配置

创维电视系统在/system/pcfg中存放了许多有用的配置文件。

这些都可以进行修改,并通过重启测试其是否有效。

例如,general_config.xml文件中还可以直接通过配置关闭开机广告。

例如,bootQueue.xml文件中定义了开机启动的应用队列。

在保证有原始文件备份,权限和拥有人正确的情况下都可以尝试修改。

禁用开机Root权限

如果电视上所有的操作都完成了,想要关闭Root权限也很简单:

shell 复制代码
# 在电视命令行窗口操作
# 此处以之前不存在/system/bin/install-recovery.sh为例
# 更改开机启动的脚本文件名称,重启后就没有Root权限了
mv /system/bin/install-recovery.sh /system/bin/install-recovery.sh.bak

# 如果想再次开启su命令,由于我们已经保存了一份/system/xbin/exploit
# 再次执行教程的步骤,然后将文件名改回来或者直接执行以下命令就可以使su命令可用
/system/xbin/su -ad &

本文首发于个人博客,并转载于简书

相关推荐
小白也想学C5 分钟前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程12 分钟前
初级数据结构——树
android·java·数据结构
闲暇部落2 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
诸神黄昏EX4 小时前
Android 分区相关介绍
android
大白要努力!5 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
Estar.Lee5 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
Winston Wood6 小时前
Perfetto学习大全
android·性能优化·perfetto
Dnelic-9 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen11 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年18 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin