移动的网络机顶盒,不让安装第三方应用,abd 调试开关也有二维码密码。拆开试了试,接上 TTL 也不能输入。

  网上查了查,还有拆开短接触点刷机,可是刷了之后就不能看移动的 IPTV ,也刷不回原来的系统了。

  还有是用 ZTE STB Tools,这个好像是中兴内部流出来的调试工具。但我在用 ZTE STB Tools root 完盒子后,又被强制更新,这个工具就失效了。

  降级回旧系统后想找个 TWRP 避免被强制升级的时候发现了这个,TWRP 线刷包!就是那种只会替换 Recovery 的可以用 USB Burning Tool 刷的包。还是两年前发的帖子,我之前也为了给别的盒子救砖做过只有 boot 的线刷包,怎么就没想到还能这样呢……

拿到 root

  不破坏原系统 root 盒子的好处还是很多的。比如说可以给当前系统做全量备份,就算刷了其他包后还能恢复回来看电视。官方的 EPG 比网路上面别人收集的更全,频道还支持回看。当然缺点也很多,广告很多,付费频道有观看时间限制,还有万一按错什么话费就没了。

线刷 TWRP

  拆开短接 C122 或 C128,再插电插线,用 USB Burning Tool 刷进去,注意 不要勾选 擦除flash 和 擦除bootloader 。开机时连按遥控器左键就可以进 Recovery,进不去就按电源按钮开关机多试几次。

  还有短接刷机的时候不要接 TTL ,会把编程器搞坏,我已经坏了两个了……

  有 TWRP 就可以直接刷 SuperSU 了。

ZTE STB Tools

  一些电视论坛有人在发 ZTE STB Tools 这个软件,看上去应该可以 root 这个盒子。可这个软件要激活才能用,网上的人全是卖码的。最近在网上看到这个这个帖子在讲如何算激活码,试了下果然可以激活。不过手动拼码太麻烦了,我就写了个脚本来生成 License 。

脚本
ZTE_STB_Tools_License.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
# 适用于 `ZTE_STB_Tools_V2.1.1_T02 20200317` 的 License 生成脚本。
# Link:
# https://sora.vercel.app/root-B860AV2.1/
# 用法:
# ZTE_STB_Tools_License.sh <特征码>
# 参考:
# https://data.znds.com/attachment/forum/202303/16/233938fudccpbqu9tp8niq.txt
# https://www.right.com.cn/forum/forum.php?mod=redirect&goto=findpost&ptid=8240773&pid=18076069

CI=$1
CI_key=${CI:10:32}0000000000000000
CI_content_encrypted=${CI:42}
CI_content_decrypted=$(echo -n $CI_content_encrypted | xxd -r -p | openssl enc -d -des-ede3-ecb -K $CI_key | xxd -p -u -c0)
SN=${CI_content_decrypted:96:48}

license_key=D62C0000AE720000
license_random=3068E85E00000000
license_key_padding=${license_key}00000000000000000000000000000000
license_content=${SN}000000000C140610190B1000500001CDECE9A74F04EB82A29174570BF2F600754B49684F2F72826294EAA86C974049A184E5DABC79833F717032E03DC1330FB09BBFBEA7E6164DD7C422E41CE3950BE5A9D6F8AD31BB182067B15F6B17382C00013E7F
license_content_encrypted=$(echo -n $license_content | xxd -r -p | openssl enc -e -des-ede3-ecb -K $license_key_padding | xxd -p -u -c0)
license=800001${license_key}${license_random}${license_content_encrypted}

echo $license

  最好先不要连网,用 ZTE_STB_Tools 连接到盒子,可以看到这个软件功能还满多的,能导出频道列表,还可以给盒子开 adb ssh telnet ,连上去就是 root 。记得在工具里面备份下配置。/cache/upgrade/ota.zip最好也备份下,是当前系统的卡刷包,如果连网了就是最新系统的卡刷包。

安装 SuperSU

  系统是 32 位的 Android 4.4,也只能用 SuperSU 了。把 SuperSU 卡刷包里面的 armv7/su 放到盒子。

1
2
3
4
5
6
adb install Superuser.apk
adb shell mount -o remount,rw /system
adb push su /system/xbin/su
adb shell chmod 755 /system/xbin/su
adb shell "/system/xbin/su --auto-daemon"
adb shell am start -n eu.chainfire.supersu/eu.chainfire.supersu.MainActivity

  然后电视上就会弹出 SuperSU ,选常规方式更新就好了。

开机启动 adb 和 entware

  开机脚本在 /system/bin/init.zte.post_boot.sh 所以直接 echo 'nohup adbd &' >> /system/bin/init.zte.post_boot.sh

  还有一个开机脚本在 /system/bin/startsoftdetector.sh。内容是:如果有 /data/data/com.cmcc.mid.softdetector/lib/libpcapcmcc.so ,就会用 root 执行它,没有则会执行 /system/bin/libpcapcmcc.so

  这就很有趣了,因为固件升级会替换 /system 里面的文件,但是是不会清 /data 的,所以只要更新后这个脚本的内容不变,/datalibpcapcmcc.so 里面的内容会是一直有效的。

所以再把 adbd 启动命令再放这里一份。

1
2
mkdir /data/app-lib/com.cmcc.mid.softdetector
touch /data/data/com.cmcc.mid.softdetector/lib/libpcapcmcc.so
/data/data/com.cmcc.mid.softdetector/lib/libpcapcmcc.so
1
2
3
4
5
6
7
8
9
10
11
#!/system/bin/sh

while [ 0 ]
do
adbd_str=`ps | grep adbd | grep -v grep`
if [ -z "$adbd_str" ]
then
start adbd
fi
sleep 2
done

然后改下文件权限,防止被软件删除或修改。

1
2
chmod +x-w /data/data/com.cmcc.mid.softdetector/lib/libpcapcmcc.so
chattr +i /data/data/com.cmcc.mid.softdetector/lib/libpcapcmcc.so

同样在 /data 并用 root 用户运行的还有/data/data/com.ztestb.basecomp/files/zteKlog

广告

  还有一些广告之类的,不过我不用这个盒子就没怎么仔细研究,下面是我发现的一些广告位置。

1
2
3
4
/data/iptvdata/logo/logoinfo.ini
/data/iptvdata/logo/loadingback-hd
/data/local/bootanimation.zip
/system/bin/adplay.sh

开机广告

  开机广告的配置文件在/data/iptvdata/logo/logoinfo.ini,开机广告生成脚本在/data/data/com.itv.android.iptv.tvclient/files/tv_adv.sh

/data/data/com.itv.android.iptv.tvclient/files/tv_adv.sh
1
2
3
4
#!/system/bin/sh
rm -r /data/local/bootanimation.zip
cd /data/iptvdata/logo/bootanimation
...

  所以只要把第二行以下都删掉,再改下文件权限。

1
2
3
4
5
rm -r /data/iptvdata/logo/bootanimation/* /data/local/bootanimation.zip
chown 0:0 /data/data/com.itv.android.iptv.tvclient/files/tv_adv.sh /data/iptvdata/logo/bootanimation
chmod 000 /data/data/com.itv.android.iptv.tvclient/files/tv_adv.sh
chmod 000 /data/iptvdata/logo/bootanimation /data/iptvdata/logo/logoinfo.ini
chattr +i /data/data/com.itv.android.iptv.tvclient/files/tv_adv.sh /data/iptvdata/logo/bootanimation /data/iptvdata/logo/logoinfo.ini

  再在 build.prop 里面加上一句 debug.sf.nobootanimation=1 关闭开机动画。

EPG 上的广告

  换台时的广告,切换频道时会向http://10.206.254.32:31000/IPTVADService/AdvertisementRequest?***发送请求,然后返回图片地址http://10.206.254.12:4000/pic/***10.206.254.32:31000这个服务器好像就只是用来放广告的,没有其他内容。所以直接用 iptables DROP 掉。
iptables -I OUTPUT -d 10.206.254.32 -p tcp --dport 31000 -j DROP

  其他广告就交给路由器上的 AdGuardHome 吧。

播放列表

  播放列表除了抓包还可以在/data/data/com.itv.android.iptv.tvclient/files/channellist_qick.ini找到。

应用列表

  这条命令可以打开应用列表。
am start -n com.zte.newlauncher.appslistapi/com.zte.newlauncher.appslistapi.AppsList

  看了下 netstat 和 AdGuardHome 的查询日志,我觉得这个盒子还是刷了干净一点的包再用比较好……

被强制更新后的降级

  今天刚连上网就提示有更新包,然后就被强制重启更新了。更新之后之前安装的 SuperSU 和 Entware 都不能用了,ZTE STB Tools 也连不上盒子了,我还没有 dd 备份,这就很难受了。不过我想起来上次 root 的时候我有把盒子里面旧的升级包拖下来,盒子里面也有个升级服务器的设置,就想试试看能不能更新到旧版。

  盒子设置里面的升级服务器是http://10.206.253.50:8080/upgrade/B860AV2D1A,所以直接在路由器上劫持盒子的 80 和 8080 端口到电脑上的 Fiddler。然后在盒子升级服务器的设置页面按确定,会提示输入密码,我这里的密码是 10086。(不知道也没关系,盒子时不时的就会检查一次更新,每次开机也会检查,检查到新版就会后台下载并强制更新。)

  输入完密码后会在 Fiddler 中看到一条新连接http://10.206.253.50:8080/upgrade/B860AV2D1A/zteSTBVer.cfg,这个就是更新配置文件了,内容为:

zteSTBVer.cfg
1
2
3
4
5
6
7
[Model=ZXB860AV2.1-A(STBAC-ANDROIDSTB-069)] 
UpdateType=background BgBandWidth=10240
AppName=ota Version=81011354.5017 Location="ota_full_B860AV2.1-A_tianjinYD_V81011354.5017.zip" Length=449168378 Rules={Y(!81011354.5017)}

[Model=ZXB860AV2.1(STBAB-ANDROIDSTB-069)]
UpdateType=background BgBandWidth=10240
AppName=ota Version=81011354.5017 Location="ota_full_B860AV2.1-A_tianjinYD_V81011354.5017.zip" Length=449168378 Rules={Y(!81011354.5017)}

  只需要保存下来把版本号改高,然后用 Fiddler 的 AutoResponder 替换。其中的Length是文件的大小。

zteSTBVer.cfg
1
2
3
4
5
6
7
[Model=ZXB860AV2.1-A(STBAC-ANDROIDSTB-069)] 
UpdateType=background BgBandWidth=10240
AppName=ota Version=81011354.5020 Location="ota.zip" Length=449168378 Rules={Y(!81011354.5020)}

[Model=ZXB860AV2.1(STBAB-ANDROIDSTB-069)]
UpdateType=background BgBandWidth=10240
AppName=ota Version=81011354.5020 Location="ota.zip" Length=449168378 Rules={Y(!81011354.5020)}

  这样盒子就会去http://10.206.253.50:8080/upgrade/B860AV2D1A/ota.zip下载升级包,所以 Fiddler 里面添加两条规则。

1
2
3
4
5
EXACT:http://10.206.253.50:8080/upgrade/B860AV2D1A/zteSTBVer.cfg
http://10.0.0.2/zteSTBVer.cfg

EXACT:http://10.206.253.50:8080/upgrade/B860AV2D1A/ota.zip
http://10.0.0.2/ota.zip

  升级包用 Fiddler 直接替换文件盒子会报错,所以在电脑上开个 HTTP 服务,用来给盒子下载,Windows 的话可以用 HFS 。

  设置完后再点下确定,他会飞速下载完我们给的升级包,然后提示检测到新版本,强制升级到旧版本并重启。

  重启后就可以用 ZTE STB Tools 连上去啦!真的是好惊险,可以说在 HTTPS 已经普及的今天,IPTV 盒子还在用 HTTP 真是帮大忙了。

禁止自动更新

  刷了第三方 Recovery 后应该就不会自动更新成新系统了,但是盒子还是会下载更新包并强制重启。
  目前想到的解决方法是在设置里面修改升级服务器的地址,再用 iptables DROP 到升级服务器的连接,但盒子联网还会被下发升级服务器配置,所以再禁止对/cache/upgrade/这个目录写入:

1
2
3
iptables -I OUTPUT -d 10.206.253.50 -p tcp --dport 8080 -j DROP
chmod -w /cache/upgrade
chattr +i /cache/upgrade

  感觉还是不太靠谱,并且盒子还可以被云控……算了,反正有卡刷包,找个 TWRP,再 dd 备份下, 应该就不怕被升级了。

Armbian

  刷 Armbian 可以用这个镜像,安装说明可以看这个。这里来写一些遇到的问题。

修改 dtb

  用 rufus 或 dd 把镜像写到优盘,修改优盘 BOOT 分区的 uEnv.txt。第三行的 dtb 改成 meson-gxl-s905l3b-e900v22e.dtb 可以开机,但是 mmc 频率不对不能写入。需要反编译 dtb 修改 mmc@74000max-frequency100000000

反编译:

1
dtc -I dtb -O dts -o dts-meson-gxl-s905l3b-e900v22e.dtb.dts meson-gxl-s905l3b-e900v22e.dtb

回编译:

1
dtc -I dts -O dtb -o meson-gxl-s905l3b-e900v22e-mod.dtb dts-meson-gxl-s905l3b-e900v22e.dtb.dts

从优盘启动

  在 Android 下执行 reboot update 只会重启进 recovery 。网上说 TTL 上去执行可以从优盘启动,但是这个盒子的系统禁止了 TTL 输入。

  可以在刷了 TWRP 之后启动到 TWRP 然后在 TTL 或 TWRP 的终端执行 reboot update 从优盘启动。

  或者刷入可以中断的 uboot,中断后执行 run update。(用这个 uboot 进 Android 屏幕显示会不正常。)

  连接 TTL 的时候一定要小心,碰到其他地方很容易烧坏编程器,最好焊下排针。

无线网卡驱动

  无线网卡是 MT7668RSN,驱动用的是 SOUTH5663/MT7668,编译参考这个 issue

切换内核版本:

armbian-update -k 5.10 -u dev

编译器:

1
2
3
4
5
6
7
wget https://developer.arm.com/-/media/Files/downloads/gnu/12.3.rel1/binrel/arm-gnu-toolchain-12.3.rel1-aarch64-aarch64-none-elf.tar.xz 
mkdir /opt/gcc-aarch64-none-elf
tar xf arm-gnu-toolchain-12.3.rel1-aarch64-aarch64-none-elf.tar.xz --strip-components=1 -C /opt/gcc-aarch64-none-elf
echo 'export PATH=$PATH:/opt/gcc-aarch64-none-elf/bin' | tee -a /etc/profile.d/gcc-aarch64-none-elf.sh
source /etc/profile
ln -sf /opt/gcc-aarch64-none-elf/bin/aarch64-none-elf-gcc /usr/local/bin/gcc
cp -r /usr/src/linux-headers-$(uname -r)/* /usr/src/

编译驱动:

1
2
3
git clone -b k5.10 https://github.com/SOUTH5663/MT7668
cd MT7668
make EXTRA_CFLAGS="-w" CROSS_COMPILE= -f Makefile.x86 -j4

安装驱动:

1
2
3
4
5
6
7
8
cp 7668_firmware/* /usr/lib/firmware/ 
cp drv_wlan/MT6632/wlan/*.ko /usr/lib/modules/$(uname -r)/
echo 'wlan_mt76x8.ko\nwlan_mt76x8_sdio.ko' >> /usr/lib/modules/$(uname -r)/modules.order
echo 'cfg80211\nwlan_mt76x8' >> /etc/modules
cd drv_wlan/MT6632/wlan
modprobe cfg80211
insmod wlan_mt76x8.ko
depmod -a

其他

文中提到的一些文件

原 uboot 启动参数:

1
2
dd if=/dev/block/env of=/sdcard/env_B860AV2.1-A.bin
mkenv extract -s 65536 env_B860AV2.1-A.bin
1
2
3
4
5
6
7
8
# 导出 bootloader 命令
dd if=/dev/block/bootloader of=/data/local/bootloader.bin

# 导出 dtb 命令
cat /dev/dtb >/data/local/mybox.dtb

# 导出 gpio 命令
cat /sys/kernel/debug/gpio >/data/local/mybox_gpio.txt