搁废品站捡的 4G 工业路由
拆解

硬件版本号 v30-s705c
硬件信息
- SoC: MediaTek MT7620A
- Flash: 16 MB
- RAM: 128 MB
- 电源: DC 5V-36V 1.5A
- 以太网: 1x WAN, 4x LAN (10/100 Mbps)
- 无线: 802.11n 2.4g-only
- LED:
System/Power (RUN): GPIO/26 active-low
Ethernet: 1x WAN, 4x LAN
Modem 1: GPIO/66 active-low
RF 1 (Modem 1 Signal): GPIO/67 active-low
Modem 2: GPIO 71 active-low
RF 2 (Modem 2 Signal): GPIO/24 active-low
WLAN: GPIO/72 active-low
WPS: GPIO/12 active-low - 按钮:
WPS / RESET: GPIO/34 active-low - UART: 1x UART on PCB - 115200 8N1
- GPIO 看门狗: GPIO/62 mode=toggle timeout=1s
- PCIe: 2x miniPCIe for modem (只焊了1个 另外一个需要自己焊)
- SIM Slots: 2x SIM Slots
固件分析
原厂 Web UI

颇有 DD-wrt 风味
原厂 Uboot Web UI
无 DHCP
静态IP 192.168.1.1

HTTP upload is done! Upgrading...
Bad firmware Magic Number,0x56190527
## Error: HTTP ugrade failed!有校验
OS 版本
内核版本 3.10.44
root@router:~# cat /etc/openwrt_release
DISTRIB_ID="OpenWrt"
DISTRIB_RELEASE="Bleeding Edge"
DISTRIB_REVISION="r20476"
DISTRIB_CODENAME="barrier_breaker"
DISTRIB_TARGET="ramips/generic"
DISTRIB_DESCRIPTION="OpenWrt Barrier Breaker r20476"
DISTRIB_TAINTS="no-all no-ipv6 busybox"
root@router:~# cat /etc/openwrt_version
r20476内核命令行
root@router:~# cat /proc/cmdline
console==/dev/null,115200 rootfstype=squashfs,ro分区布局
root@router:/sys/class/leds# cat /proc/mtd
dev: size erasesize name
mtd0: 00030000 00010000 "u-boot"
mtd1: 00180000 00010000 "kernel"
mtd2: 00a50000 00010000 "rootfs"
mtd3: 00400000 00010000 "rootfs_data"没有 eeprom 的 factory 分区, 网卡MAC 存储在 /etc/hdconfig/systeminfo/system.info, /etc/system.info 和 /etc/defconfig/system.info 文件内
GPIO
root@router:/# cat /sys/kernel/debug/gpio
GPIOs 0-23, platform/10000600.gpio, 10000600.gpio:
GPIOs 24-39, platform/10000638.gpio, 10000638.gpio:
gpio-24 (modem2_signal1 ) out hi
gpio-25 (led_data ) out hi
gpio-26 (led_sys ) out lo
gpio-29 (modem2_signal2 ) out hi
gpio-30 (J2_6 ) in hi
gpio-31 (J2_9 ) in hi
gpio-32 (J2_4 ) in hi
gpio-33 (J2_1 ) in hi
gpio-34 (reset ) in hi
GPIOs 40-71, platform/10000660.gpio, 10000660.gpio:
gpio-60 (3g1 ) out hi
gpio-61 (3g2 ) out hi
gpio-62 (hw_watchdog ) out hi
gpio-63 (sd ) out hi
gpio-64 (gps ) out lo
gpio-65 (simcard_s ) out lo
gpio-66 (modem ) out hi
gpio-67 (modem_signal1 ) out hi
gpio-68 (gps_oe ) out hi
gpio-69 (temperature ) out hi
gpio-70 (modem_signal2 ) out hi
gpio-71 (modem2 ) out hi
GPIOs 72-72, platform/10000688.gpio, 10000688.gpio:
gpio-72 (led_wifi ) out hi使用 GPIO 看门狗而不是 MT7620A 内置的看门狗
部分 LED 无效, 板子 DTS 是 H9350 的, 看上去是几个板子的通用 DTS
端口监听状态
root@router:~# netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5188 0.0.0.0:* LISTEN 1759/telnetd
tcp 0 0 0.0.0.0:2601 0.0.0.0:* LISTEN 1613/zebra
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1760/lighttpd
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 1944/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1490/dropbear
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 1757/cli
tcp 0 0 0.0.0.0:1566 0.0.0.0:* LISTEN 1753/socket_app
tcp 0 132 192.168.8.1:22 192.168.8.215:64557 ESTABLISHED 1004/dropbear
udp 0 0 0.0.0.0:53 0.0.0.0:* 1944/dnsmasq
udp 0 0 0.0.0.0:67 0.0.0.0:* 1944/dnsmasq
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ] DGRAM 2590 669/modem /tmp/mp.listen
unix 2 [ ACC ] STREAM LISTENING 2855 1757/cli /tmp/cli.sock
unix 14 [ ] DGRAM 2599 1752/syslogd /dev/log
unix 2 [ ACC ] STREAM LISTENING 2149 1613/zebra /var/run/quagga/zserv.api
unix 2 [ ACC ] STREAM LISTENING 2698 1757/cli /tmp/.zserv
unix 2 [ ACC ] STREAM LISTENING 675 807/ubusd /var/run/ubus.sock
unix 7 [ ] DGRAM 1785 1379/logd /dev/log
unix 2 [ ] DGRAM 1924 1436/netifd
unix 2 [ ] DGRAM 2870 1892/dhcps
unix 3 [ ] STREAM CONNECTED 1349 1/procd
unix 3 [ ] STREAM CONNECTED 1788 807/ubusd /var/run/ubus.sock
unix 2 [ ] DGRAM 2634 1756/natd
unix 2 [ ] DGRAM 1938 1436/netifd
unix 3 [ ] STREAM CONNECTED 1850 807/ubusd /var/run/ubus.sock
unix 3 [ ] STREAM CONNECTED 1350 807/ubusd /var/run/ubus.sock
unix 2 [ ] DGRAM 40520 669/modem
unix 2 [ ] DGRAM 1799 1/procd
unix 2 [ ] DGRAM 2633 1755/filterd
unix 2 [ ] DGRAM 1919 1004/dropbear
unix 3 [ ] STREAM CONNECTED 1849 1436/netifd
unix 2 [ ] DGRAM 2858 1761/openvpn_init
unix 2 [ ] DGRAM 39654 1763/time
unix 2 [ ] DGRAM 2651 1757/cli
unix 2 [ ] DGRAM 2624 1762/timing
unix 2 [ ] DGRAM 2144 1613/zebra
unix 2 [ ] DGRAM 1877 1465/crond
unix 2 [ ] DGRAM 2882 1944/dnsmasq
unix 3 [ ] STREAM CONNECTED 1787 1379/logd
unix 2 [ ] DGRAM 2644 1753/socket_app
unix 2 [ ] DGRAM 2629 1767/modem_mg
unix 2 [ ] DGRAM 2636 1754/ipfixROOT 密码 (OpenSSH/Telnet)
ROOT 密码是 superzxmn
OpenSSH 端口 TCP 22
Telnet 端口 TCP 5188
Telnet 23 端口被原厂定制的 CLI 程序吃了, 密码 super
固件加密
- 内层加密
XOR 配合 MD5 Salt 校验
package main
import (
"crypto/md5"
"os"
)
const (
salt = "hdm2mfreewifi"
salt_len = len(salt)
)
func main() {
data, err := os.ReadFile("input.bin")
if err != nil {
panic(err.Error())
}
encrypted := encrypt(data)
output := addMD5(encrypted)
os.WriteFile("encrypted.bin", output, 0644)
}
func addMD5(data []byte) []byte {
hash := md5.New()
hash.Write([]byte(salt))
hash.Write(data)
return hash.Sum(data)
}
func encrypt(data []byte) []byte {
dataLen := len(data)
fixedKey := dataLen / (salt_len + 1)
encrypted := make([]byte, len(data))
copy(encrypted, data)
for i := range encrypted {
key := (dataLen + i) - fixedKey
encrypted[i] ^= byte(key)
}
return encrypted
}使用 IDA 逆向原厂固件 /usr/sbin/encrypt 文件刷写固件
刷写 Breed
刷了就死循环重启, 必砖!
应该是 GPIO 看门狗没喂狗导致的
Breed Console Bauds: 57600 8N1

通过 UART 进入 UBoot 刷写
U-Boot WebUI 和 UART Console 升级固件有 Header Magic 验证, 更新内核 和 更新rootfs 也会检查 Header. 不过检查的是 uImage 和 squashfs header
内核分区只有 1.5M, OpenWRT 内核超过这个大小
所以我们必须先更新 rootfs,然后 启动固件一次 (直接启动 initramfs-kernel 失败, 自动重启)
然后我们可以去 openwrt 并将完整固件刷入到 SPI NOR
固件格式有双层加密, 而且同样会检查分区大小, 无法刷入最新固件, 所以搞出来也没有意义
- 使用静态 IP 地址配置 PC 并设置 TFTP 服务器。
- 将 rootfs 和 sysupgrade (固件) 放入 tftp 目录中.
- 按照 PCB 上的说明连接 UART
- 启动设备并按 Ctrl+C 中断自动启动
- 使用
system 6命令并按照说明设置设备和 tftp 服务器 IP 地址并输入 rootfs 文件名
然后 U-boot 将加载 rootfs 并将其写入闪存。 - 使用
system 1命令并按照说明设置设备和 tftp 服务器 IP 地址并输入固件文件名
然后 U-boot 将引导固件一次 - 登录 LuCI 并使用 LuCI 升级固件
9 条评论
你好,我按照你这篇 Hongdian H8922 v30 刷 OpenWrt 的文章操作,目前有一台 H8922 v30 卡住了,想请教一下。
设备信息:U-Boot 1.1.3,Ralink UBoot Version 4.2.1.0,MT7620,128MB RAM,SPI Flash。现在 U-Boot 还能进 MT7620#,HTTP recovery 也能启动,IP 是 192.168.1.1。
我按文章流程操作:
system 6 写 OpenWrt rootfs 可以成功,TFTP 能读到 r.bin,并且能看到:
update_rootfs
erase...
write...
然后回到 MT7620#。
接着执行:
setenv bootfile s.bin
system 1
文件名位置直接回车,TFTP 也能正常读到 s.bin,例如:
Bytes transferred = 6619447
Image Name: MIPS OpenWrt Linux-6.6.119
Verifying Checksum ... OK
Uncompressing Kernel Image ...
但问题是:每次到 Uncompressing Kernel Image ... 后就自动复位,然后又回到原厂 Linux-3.10.44,或者进入 HTTP recovery,提示 failed to autoboot。
我已经排查过:
TFTP 没问题,r.bin 和 s.bin 都能正常读取。文件名问题也排查过,使用 setenv bootfile r.bin/s.bin,文件名提示处直接回车。试过 OpenWrt 24.10.1、24.10.3、24.10.4、24.10.5、24.10.6、24.10.7,现象一样。试过 initramfs-kernel,也是 6.6 内核解压后自动复位。手动 tftpboot 0x80a00000 s.bin 可以读到并校验 OK,但同样解压后复位。用文章原厂包里的 factory_linux.bin 走 HTTP 或 system 4 会提示 Magic Number 不对。mtdblock2 / raw rootfs 用 system 6 会提示 The Rootfs Image size is too big !!!。现在机器 U-Boot 还活,HTTP recovery 也能启动,但正常系统后台进不去。想请教一下,这种 s.bin 能读、校验 OK,但 6.6 内核解压后自动复位的情况,可能是什么原因?是否需要修改 U-Boot 环境变量、启动地址、bootargs,或者某些 H8922 v30 批次硬件/Flash/RAM 有差异?另外,如果想恢复原厂,文章里的 mtdblock1/2/3 有没有正确的刷回方式,还是必须要宏电带 Header/Magic 的官方升级包?
你好,我按照你这篇 Hongdian H8922 v30 刷 OpenWrt 的文章操作,目前有一台 H8922 v30 卡住了,想请教一下。
设备信息:U-Boot 1.1.3,Ralink UBoot Version 4.2.1.0,MT7620,128MB RAM,SPI Flash。现在 U-Boot 还能进 MT7620#,HTTP recovery 也能启动,IP 是 192.168.1.1。
我按文章流程操作:
system 6 写 OpenWrt rootfs 可以成功,TFTP 能读到 r.bin,并且能看到:
update_rootfs
erase...
write...
然后回到 MT7620#。
接着执行:
setenv bootfile s.bin
system 1
文件名位置直接回车,TFTP 也能正常读到 s.bin,例如:
Bytes transferred = 6619447
Image Name: MIPS OpenWrt Linux-6.6.119
Verifying Checksum ... OK
Uncompressing Kernel Image ...
但问题是:每次到 Uncompressing Kernel Image ... 后就自动复位,然后又回到原厂 Linux-3.10.44,或者进入 HTTP recovery,提示 failed to autoboot。
我已经排查过:
TFTP 没问题,r.bin 和 s.bin 都能正常读取。文件名问题也排查过,使用 setenv bootfile r.bin/s.bin,文件名提示处直接回车。试过 OpenWrt 24.10.1、24.10.3、24.10.4、24.10.5、24.10.6、24.10.7,现象一样。试过 initramfs-kernel,也是 6.6 内核解压后自动复位。手动 tftpboot 0x80a00000 s.bin 可以读到并校验 OK,但同样解压后复位。用文章原厂包里的 factory_linux.bin 走 HTTP 或 system 4 会提示 Magic Number 不对。mtdblock2 / raw rootfs 用 system 6 会提示 The Rootfs Image size is too big !!!。现在机器 U-Boot 还活,HTTP recovery 也能启动,但正常系统后台进不去。想请教一下,这种 s.bin 能读、校验 OK,但 6.6 内核解压后自动复位的情况,可能是什么原因?是否需要修改 U-Boot 环境变量、启动地址、bootargs,或者某些 H8922 v30 批次硬件/Flash/RAM 有差异?另外,如果想恢复原厂,文章里的 mtdblock1/2/3 有没有正确的刷回方式,还是必须要宏电带 Header/Magic 的官方升级包?
你好,我按照你这篇 Hongdian H8922 v30 刷 OpenWrt 的文章操作,目前有一台 H8922 v30 卡住了,想请教一下。
设备信息:U-Boot 1.1.3,Ralink UBoot Version 4.2.1.0,MT7620,128MB RAM,SPI Flash。现在 U-Boot 还能进 MT7620#,HTTP recovery 也能启动,IP 是 192.168.1.1。
我按文章流程操作:
system 6 写 OpenWrt rootfs 可以成功,TFTP 能读到 r.bin,并且能看到:
update_rootfs
erase...
write...
然后回到 MT7620#。
接着执行:
setenv bootfile s.bin
system 1
文件名位置直接回车,TFTP 也能正常读到 s.bin,例如:
Bytes transferred = 6619447
Image Name: MIPS OpenWrt Linux-6.6.119
Verifying Checksum ... OK
Uncompressing Kernel Image ...
但问题是:每次到 Uncompressing Kernel Image ... 后就自动复位,然后又回到原厂 Linux-3.10.44,或者进入 HTTP recovery,提示 failed to autoboot。
我已经排查过:
TFTP 没问题,r.bin 和 s.bin 都能正常读取。文件名问题也排查过,使用 setenv bootfile r.bin/s.bin,文件名提示处直接回车。试过 OpenWrt 24.10.1、24.10.3、24.10.4、24.10.5、24.10.6、24.10.7,现象一样。试过 initramfs-kernel,也是 6.6 内核解压后自动复位。手动 tftpboot 0x80a00000 s.bin 可以读到并校验 OK,但同样解压后复位。用文章原厂包里的 factory_linux.bin 走 HTTP 或 system 4 会提示 Magic Number 不对。mtdblock2 / raw rootfs 用 system 6 会提示 The Rootfs Image size is too big !!!。现在机器 U-Boot 还活,HTTP recovery 也能启动,但正常系统后台进不去。想请教一下,这种 s.bin 能读、校验 OK,但 6.6 内核解压后自动复位的情况,可能是什么原因?是否需要修改 U-Boot 环境变量、启动地址、bootargs,或者某些 H8922 v30 批次硬件/Flash/RAM 有差异?另外,如果想恢复原厂,文章里的 mtdblock1/2/3 有没有正确的刷回方式,还是必须要宏电带 Header/Magic 的官方升级包?
这个刷OpenWrt SIM可以用吗
能
按照ttl接法不跑码,无显示,能不能详细讲一下怎么修改dts以及封装,最近搞了几天没有任何头绪,似乎网络中对其研究的颇少,感谢大神的无私奉献!
什么型号的
宏电h8920好像,cpu是7628nn的,ssh进去后分区都是有的,ttys默认是2,应该是没有ttys2的,我改成0想能不能封装回去看看ttl能不能跑码,可惜不会封装回去。在ssh中刷机就成砖了,我有原包,用ch340a又刷回去了,刷不死breed也是一样砖
H8922S 还是 5G 版本?