这台中国移动的 H50G 是朋友那边淘汰下来的:四个千兆口、没有无线、没有电话口,白色小方盒一个。铭牌上写着福建星网锐捷代工,2022 年 11 月生产。外观没什么好讲的,真正有信息量的东西全在板子上,和它开机那几十秒的日志里。
开写之前先摊个牌。网上现在能搜到的光猫「拆解」,绝大多数是看图说话——把芯片丝印抄下来,往搜索引擎一贴,然后把同系列资料里的「主频 900MHz、内存 256MB」直接搬过来。这么写不能说错,但那些数字是那颗芯片能做什么,不是你这台机器实际是什么。板子上到底焊了多大内存、闪存里塞了什么、系统怎么起来的、运营商又往里塞了多少私货,丝印一个字都不会讲。
所以这台机器我没停在「看芯片」。板子上留了调试串口,我给它焊了个排针,从头到尾把启动日志录了一份。日志是设备自己一步一步吐出来的,比任何反推都靠得住。这篇文章一半是拆解,一半是读日志——读到后面你会发现,有些结论真的只有日志能给。最后留个尾巴:下一篇我会在不拆机、不用超级管理员的前提下,用普通用户能拿到的权限把宽带账号密码取出来,再把 telnet 打开,一路拿到 root。这篇先把这台机器彻底看穿。
先说结论
- 主控是中兴微电子的 ZX279127S。丝印写得明白:
ZXIC / ZX279127S / AE10114TTX / THWG6800 / 2224/FHE03009。ZXIC 就是中兴微电子,这是一颗 GPON 网关 SoC,ARM Cortex-A9 内核。有意思的是它有两副面孔:U-Boot 阶段自报家门是ZX279127S@A9,进内核后又变成ZTE ZX279128S。同一颗芯片两套叫法,光靠看丝印是吵不出结果的,下面用日志把这事说清。 - 内存 512MiB,闪存 256MiB,都是日志报的实测值。内存是三星一颗
SEC K4B4G16,DDR3 颗粒;闪存是铠侠TC58BVG1S3HTA00SPI NAND。日志里DRAM: 512 MiB、ddr rate is 1066 Mbps、nand: 256 MiB, SLC, page size: 2048, OOB size: 64,连闪存的两个出厂坏块都标出来了。 - 这台是「4 口纯有线」版本,没有无线,也没有语音。正面指示灯里根本没有 WiFi 灯,日志也一直在刷
Get_Wifi_Type:e_wifi_type=0x0、g_Wlan_Card_Max=0,无线芯片压根不存在;语音这边日志报slic type:[unknown]、slic total_line_num: 0,SILC 没识别到。所以别指望拿它当无线路由用。 - 系统三件套:U-Boot 2013.04 + Linux 4.1.25 + Buildroot 2017.05。内核编译于 2023 年 11 月 21 日,构建机
root@workStation,gcc 4.9.4。这台 2022 年出厂的猫,固件在 2023 年底还刷过一次。 - 闪存被切成 15 个分区,而且核心分区都是 A/B 双份。kernel0/kernel1、osgi/osgi1、phoneapp/phoneapp1 各存两套,跑坏一套切另一套,这是运营商设备「刷不死」的底气。
- 最劲爆的一条:telnet 的开关、端口、账号密码,原文就印在启动日志里。
do action with cfg:enable=1,port=23,maxcon=6,usr=admin,pwd=chzhdpl@246。你没看错,是明文。这就是我一开始说的「日志比拆解更底层」——硬件反推永远推不出这条。 - 地区是广东。日志里
region code:310、region name:Guangdong,配置项WANCPPP也写着GuangDong。移动是按省定制的,同一型号不同省固件不一样,这一点铭牌同样看不出来。
先看壳子:一台没有无线的移动光猫
拆之前先把外壳看一圈。这类方盒光猫的外观信息其实很密集,指示灯和接口的排布本身就在暗示它的定位。

这一排灯里有两个决定了这台机器能不能用:「注册/光信号」决定的是它有没有在运营商的 OLT 上挂上号,「上网」决定的是拨号有没有成功。这两个灯不对的时候,你去重启路由器是没有意义的,问题根本不在你这边。

接口标签写得挺实在,四个口全部标了「千兆」,没有掺百兆。旁边是电源插孔和一个红色自锁开关,最下面单独留了光口。整体就是一台很朴素的有线网关。

铭牌是整机信息量最大的地方,把常用的参数列一下。注意这里所有信息都是厂商印上去的「标称」,和板子上真实焊了什么,是两回事。
| 项目 | 铭牌参数 | 说明 |
|---|---|---|
| 设备型号 | H50G | 中国移动「智能家庭网关 类型十一」,GPON ONU |
| 制造商 | 福建星网锐捷通讯股份有限公司 | 整机代工厂,但主控是中兴微的方案 |
| 用户口 | 4×GE + 1×USB | 四个千兆网口,无电话口、无无线 |
| 默认账号 | user / 密码印在铭牌 | 注意这是普通用户,不是超级管理员 |
| 管理地址 | 192.168.1.1 | 网页后台入口 |
| 电源 | 12V ⎓ 1A | 板上有 12V1 丝印,与铭牌一致 |
| 生产日期 | 2022-11-09 | 铭牌右上角 |
| 进网许可 | 19-7748-213516 | 蓝色许可标签 |
拆开看板子:丝印能告诉你什么,不能告诉你什么
拆机没什么技术含量,背面就一颗螺丝,拧掉之后拿撬板沿着边缘慢慢撬一圈,上下盖就分开了。第一次拆最好用塑料撬棒,金属的容易在壳子上留印。

打开之后,板子整体规整,主控上压着一块散热片。这块板的分区思路很典型:一颗主控管所有,外围就是内存、闪存、光组件和网络变压器。


板子右边是网口区和电源区。四个网口下面各配了一组网络变压器,作用是把主控出来的信号和网线上的差分信号隔离开,顺便做阻抗匹配和防雷,这几颗小方块虽然不起眼,但网口稳不稳全看它们。电源那一片能看到 12V 输入、几颗标着 4R7 的功率电感和一圈稳压电路,整板的电就从这儿分下去。还有左上角那根从光组件引出来的白色尾纤,它一路绕到前面板的光口,翻板子、拧螺丝的时候千万别硬拽,这东西又细又脆,扯断了这台机器基本就报废了。
接下来把板上有丝印的主器件逐颗看过来。这一段就是绝大多数拆解文章的全部内容——但请留意,丝印只能告诉你「型号」,告诉不了你「参数」。

ZXIC / ZX279127S。ZXIC 是中兴微电子,这是一颗集成度很高的 GPON SoC。丝印能告诉你它叫什么,但主频多少、塞了几个核,得看日志主控旁边那颗大的就是内存。三星的颗粒,丝印 SEC K4B4G16。懂行的人能从这个料号算出容量——K4B4G16 是 4Gbit 的 DDR3,等于 512MB。但网上不少拆解会直接写成 256MB,原因就是没算、抄了错资料。这颗到底是不是 512MB,日志一句话就定死了。

SEC K4B4G16,4Gbit DDR3 颗粒,单颗即 512MB。板子上只有这一颗,容量一目了然
KIOXIA / TC58BVG1S3HTA00,一颗 SPI NAND。按料号看是 2Gbit,也就是 256MB,和日志报的 256 MiB 对得上
看到这儿,你手里已经有四个型号了:主控、内存、闪存、光组件。现在问题来了——光凭这些丝印,你能说出这台机器的主频、内存实际容量、闪存分区、装载的系统版本和地区吗?说不出来。芯片型号只是起点,真正决定这台机器「是什么」的那些参数,全在它开机时自己报出来的日志里。而想读到日志,得先在板子上接一个 TTL 口出来。
焊一个 TTL 口:从「听不到」到「能听到」
板子上厂家预留了调试串口的焊盘,丝印写得明明白白:RX TX GND VCC,四个孔一字排开。这就是接串口的入口。

为什么不直接用探针顶、用夹子夹,非要焊?因为串口是长时间实时通信,不是点一下就读完的数据。探针一滑就断,夹子夹不牢还会碰到旁边元件,日志读一半断掉最气人。焊上排针之后,插上杜邦线就稳了,想读几次读几次。
电平是 3.3V TTL,波特率日志里早就写好了——内核命令行是 console=ttyAMA0,115200n8,也就是 115200、8 数据位、无校验、1 停止位。这两点先记住,一会儿接线要用。
动手之前先把工具说清楚,这事比手艺更影响成败。一把能调温的恒温烙铁或者焊台就够用,烙铁头建议选刀头或马蹄头,接触面大、好控锡,尖头反而容易把锡抖飞;焊锡用带松香芯的有铅锡,熔点低、流动好,比无铅锡好上手得多;助焊剂松香或膏状的都行;清理用洗板水配吸锡带。工具对了,成功率立刻上一个台阶。
焊接本身不难,但「能亮」和「焊得好看又可靠」之间差着几个细节。我把自己这套流程拆成五步,对着图讲。
第一步,先给烙铁头镀锡。烙铁头裸露在空气里会氧化发黑,氧化层不吃锡,你拿它去焊东西只会越焊越脏。所以升温之后先蘸点焊锡,把整个工作头裹上一层亮锡,这一步纯粹是为了保护烙铁头、让后面上锡顺畅。

第二步,处理焊盘。这四个孔看着是新的,其实表面有氧化层和出厂阻焊残留,直接上锡会「挂不上」。做法是先用细砂纸轻轻磨一下焊盘,磨掉氧化层,再用洗板水擦干净,然后拿吸锡带(铜编织带)贴着焊盘、用烙铁压上去,把焊盘重新吃一层薄锡。吸锡带在这里的作用不是吸锡,是帮你把焊盘表面「带干净」。

第三步,确认焊盘均匀上锡,涂助焊剂。上完锡之后看一眼焊盘,要四个都均匀发亮,不能有黑点、不能有没吃上锡的地方。确认没问题了再涂一层助焊剂(松香或膏状都行),助焊剂的作用是降低表面张力、隔绝氧化,一会插针的时候锡才会「顺着流」而不是缩成一坨。

第四步,插针、上锡。把排针插进孔里,烙铁头贴住针脚和焊盘的接缝处,给一点锡,让熔化的锡自己顺着针脚往下流、把焊盘和针脚裹住。这里的关键是「贴住等它化」而不是「拿锡去抹」——你把锡丝往烙铁头上一送,锡会比较自然地形成一个饱满的小圆锥,这就是想要的焊点形态。

第五步,洗板水收尾。焊完之后焊点周围会残留助焊剂和被打掉的阻焊,看着脏,时间长了也会吸潮。用洗板水(或无水酒精)刷干净,成品就是四个圆润、发亮、没有毛刺的焊点。这样焊出来的口子,插拔几十次也不会松。

补几句焊接里最容易翻车的地方,都是血泪:温度别太高,有铅锡 300–350℃ 就够,温度高了焊盘铜箔容易翘;时间别太长,一个点两三秒解决,烙铁压在焊盘上超过五秒就是在烤板子;助焊剂一定要洗,不洗时间长了会漏电、发黑;最怕虚焊——焊点看着圆,其实锡没真正爬进孔里,串口偶尔通偶尔不通,多半就是它。判断虚焊的办法很简单:拿镊子轻轻拨一下针脚,会晃就返工。
焊完之后接线:买一个 CH340 之类的 USB 转 TTL 小板,开发板的 TX 接转接板的 RX、开发板的 RX 接转接板的 TX,GND 对 GND,VCC 千万别接(板子自己有电,接了 VCC 可能顶电打架)。交叉接是新手最容易卡住的地方,接反了就是一片乱码或者一点反应都没有。接好之后电脑上会多一个串口,波特率设 115200、8N1,打开就能看到日志了。
TTL 日志实录:从上电到系统起来
下面按时间顺序,把这次录到的日志关键段贴出来。日志很长,我只挑信息量大的部分。
最先出来的是上电自检那几行,芯片还没引导系统,已经在报自己的硬件底子了:

Boot NAND、non secure boot(注意这四个字,说明它没开安全启动),DDR 初始化 rate is 1066 Mbps,容量 0x20000000——换算过来正好 512MB紧接着是 U-Boot 的横幅,把 CPU、内存、闪存的实参一股脑报了出来:

CPU : ZX279127S@A9, Board: ZXIC zx279127sevb、1000MHZ、DRAM: 512 MiB。主频、内存容量,这一屏全给了U-Boot 2013.04 (Nov 21 2023 - 03:41:26)
1000MHZ
CPU : ZX279127S@A9,Board: ZXIC zx279127sevb
CONFIG_SYS_SDRAM_SIZE = 0x20000000
DRAM: 512 MiB
NAND: boot mode: 1
Manu ID: 0x98, Chip ID: 0xda (Toshiba NAND 256MiB 3,3V 8-bit)
256 MiB
然后是识别 NAND、读分区表、初始化 GPON 光口这一段:

Toshiba NAND 256MiB 3,3V 8-bit、ZXIC_SOFT_VID:0x00050002,最后 gpon serdes init——光口串行器开始初始化再往下从闪存读内核镜像,把要启动的系统和内核命令行都报了出来:

Image Name: Linux Kernel Image、Data Size: 26497323 Bytes = 25.3 MiB。内核本体 25.3MB,加载地址 40008000
console=ttyAMA0,115200n8 rdinit=/sbin/init mem=512M。串口参数(115200 8N1)、根文件系统位置、内存大小全在这一行里====commandline:console=ttyAMA0,115200n8 rdinit=/sbin/init mem=512M; U-Boot 3.0.16 20231121044948=====
----------------------
|-->setup versioninfo tag...
Starting kernel ...
内核起来之后有一屏参数区的初始化,把厂商 VID 原始数据 dump 了出来:

INFO zxic_param_init 和那片 5a 58 49 43 49 44(ASCII 就是「ZXICID」)是厂商私有参数区,用来存这台机器的定制标识最后进用户态,挂载分区、读出固件版本、探测光组件和语音芯片:

/GN25L95_datas、verinfo 报出固件标识 ZXIC 1GPON UNI SGUV2.0.0B05,光组件 GN25L95 found,语音这边则一路 slic type:[unknown]日志到这儿基本把整机交代完了。接下来是重头戏——把这些日志和「看丝印猜参数」放在一起比,看看差距在哪。
日志给出的结论:硬件反推推不出来的那些
我把这次从日志里读到的、以及铭牌和丝印给不出的东西,整理成一张对照表。左边是硬件能看到的,右边是日志说的。你会发现右边明显更具体、更可信。
| 项目 | 硬件反推(看丝印) | TTL 日志(实测) |
|---|---|---|
| 主控 | ZXIC ZX279127S,Cortex-A9,主频未知 | U-Boot 报 ZX279127S@A9、1000MHZ;内核 device tree 报 ZTE ZX279128S |
| 内存 | 三星 K4B4G16,需自己算容量 | DRAM: 512 MiB、ddr rate is 1066 Mbps |
| 闪存 | 铠侠 TC58BVG1S3HTA00,容量靠查料号 | 256 MiB, SLC, page size: 2048, OOB size: 64,并报出 2 个出厂坏块 |
| 分区 | 看不到 | 15 个 MTD 分区,含 kernel0/1、osgi/1、phoneapp/1 双份 |
| 系统版本 | 看不到 | U-Boot 2013.04 + Linux 4.1.25 + Buildroot 2017.05 |
| 固件标识 | 看不到 | ZXIC 1GPON UNI SGUV2.0.0B05 |
| 地区 | 看不到 | region code:310 = 广东 |
| 无线 | 板上没无线芯片,但也许是没焊 | g_WifiType=0、无 wlan 卡,是软件层面确认没有 |
| 语音 | 板上有 PHONE 丝印 | slic type:[unknown]、total_line_num: 0,确认没启用 |
| telnet | 完全看不到 | enable=1,port=23,usr=admin,pwd=****,明文 |
挑几条展开说,这几条最能说明「为什么要读日志」。
第一,主控有两套名字。U-Boot 说它是 ZX279127S,内核的 device tree 说它是 ZTE ZX279128S。同一颗芯片,引导程序和操作系统两边的叫法不一样。这个细节如果你只看丝印、只翻同系列资料,是永远对不上的。日志告诉你的是:以芯片丝印为准,同时记住它在软件里的平台代号,两个都得知道,后面折腾固件才不容易懵。
第二,内存和闪存是精确值,不带猜。DRAM: 512 MiB、256 MiB, SLC,连闪存的两个坏块位置(Bad eraseblock 1536、1537)都标出来了。你要是靠丝印算,能算对,但慢,而且容易算错——网上一堆把 K4B4G16 写成 256MB 的,就是这么来的。
第三,15 个分区是「防砖设计」。U-Boot、kernel0、kernel1、osgi、osgi1、phoneapp、phoneapp1、wlan、usercfg……全套 A/B 双份。运营商推固件的时候先写备用区,校验过了再切过去,写坏了还能回滚。这种「刷不死」的机制决定了这台机器一旦玩崩了,还有救回来的余地——而这一点,从板子上是绝对看不出来的。
Creating 15 MTD partitions on "denali-nand":
0x000000000000-0x000010000000 : "whole flash"
0x000000000000-0x000000200000 : "u-boot"
0x000000200000-0x000002200000 : "kernel0"
0x000002200000-0x000004200000 : "kernel1"
0x000004800000-0x000004c00000 : "parameter tags"
0x000004c00000-0x000005400000 : "usercfg"
0x000005400000-0x000005800000 : "middleware"
0x000005800000-0x000005c00000 : "wlan"
0x000005c00000-0x000005e00000 : "phoneapp"
0x000005e00000-0x000006000000 : "phoneapp1"
0x000006000000-0x000007e00000 : "osgi"
0x000007e00000-0x000009c00000 : "osgi1"
0x000009c00000-0x00000ff60000 : "plugin_data"
0x00000ff60000-0x000010000000 : "GN25L95_datas"
第四,这台机器没有无线,也没有语音,是软件盖章确认的。板上没看到无线芯片,可能是「没焊」,也可能是「焊了但没启用」,光看板子分不清;但日志里 g_WifiType=0、g_Wlan_Card_Max=0,语音那边 slic total_line_num: 0,等于软件层已经告诉你「这里没有」。一台移动光猫买回来当千兆交换机用,心里就有数了。
第五,也是最有意思的一条:telnet 配置是明文。日志里有一行,把 telnet 的开关、端口、账号、密码原样打了出来:
[telnetd][Error] do action with cfg:enable=1,port=23,maxcon=6,usr=admin,pwd=chzhdpl@246,ProcType=0
[telnetd][Warn ] telnetd lan should be Stop
[telnetd][Warn ] stop lan telnetd success
注意这行日志的奇特之处:它一边把 telnet 的凭据打得清清楚楚,一边下一句又把 telnet 停了(telnetd lan should be Stop)。也就是说这台机器默认 telnet 是关着的,但它的账号密码藏在固件里,并且会随着启动流程被打进日志。这就是「读日志」和「看芯片」的本质差别——芯片给你型号,日志给你凭据。至于这个 admin 账号到底能登到哪一层、进去之后是不是 root,那是下一篇要拆的事。
还有一条只有日志肯说的:这台机器的四个千兆口,并不是外挂交换芯片给的,而是主控内部自带的交换模块吐出来的。日志里明明白白写着 Init switch module、zy uni num:4、switch config 9127/9128 GPON mode,意思是这颗 SoC 内部一共有 7 个交换端口,对外放出 4 个 UNI 口给用户。旁边那行 VendorId=38c,ChipModel=1271,Revision = 28 也印证了同一件事——交换模块的厂商标识和芯片型号都指向中兴微这颗主控。也就是说,这台猫的网络转发能力,上限就锁死在主控自己身上,跟外挂交换芯片的老式猫是两种结构。
最后再把日志第一屏那句话拎出来说:non secure boot。翻译过来就是没开安全启动,引导的时候 U-Boot 不会去校验内核镜像的数字签名。对日常上网没有任何影响,但对后面想动固件的人意义很大,它意味着通过校验的门槛比很多人以为的要低。这种信息,铭牌不会写,丝印也看不出来,只有设备自己开机时那句日志会老老实实告诉你。
另外还有一屏信息值得记一笔:这台机器跑着一整套中国移动的插件。日志里能看到 Felix OSGi 框架、Java 运行环境,以及 andlink、appcore、cmccdpi、wuyougateway 这几个智能网关组件,JVM 堆上限被压到 -Xmx128M。说白了,光猫早就不是「一块光电转换的板子」了,它是一台跑着 Java、跑着移动全家桶的小电脑。这些插件是干什么用的、要不要关掉,是另一个话题。
最后把整机的真实规格收个尾,这些才是这台机器「实际是什么」:
- SoC:中兴微 ZX279127S(内核平台代号 ZTE ZX279128S),ARM Cortex-A9,1000MHz
- 内存:512MiB DDR3,频率 1066Mbps
- 闪存:256MiB SLC SPI NAND(铠侠 TC58BVG1S3HTA00),15 个分区、A/B 双系统
- 光:GN25L95 光组件,GPON,厂商标识 ZTE_B+_G
- 业务口:4×GE + 1×USB2.0,无无线、无语音
- 系统:U-Boot 2013.04 / Linux 4.1.25 / Buildroot 2017.05,固件 SGUV2.0.0B05
- 地区:310 广东
还没完:下一步,普通权限拿宽带账号密码,再上 root
到这儿,这台 H50G 的硬件和系统已经被摆得明明白白。但真正麻烦的部分还没开始——我现在手里只有一个铭牌上印着的普通账号 user,超级管理员是进不去的,因为它被运营商改过密码。而普通用户能看到的界面里,最关键的那个东西(宽带拨号的账号和密码)恰恰是藏起来的。
下一篇我要做的,就是顺着今天读到的这些线索往下走。大致几步:先在不拆机、不用超级管理员的情况下,从普通用户能碰到的范围里把宽带账号和密码取出来;然后想办法把 telnet 打开,用今天日志里那套 admin 凭据登进去;最后进去之后做提权,拿到 root。今天日志里那句明文配置,就是这条路的起点之一。
至于结果能不能一路走通、中间会踩哪些坑,等实操完再写。提前说一句:这些操作只在自己名下的设备上折腾,动别人的光猫、拿别人的宽带账号,是另一回事,别混为一谈。
写这些内容需要耗费大量的时间和金钱,觉得有用的话可以点击下面的“赞赏”支持作者,你的支持是我更新的动力。


Comments NOTHING