文章总结: 本文详细记录了拆解WavlinkAC1200路由器并获取UARTshell的完整过程,包括从SPIFlash提取固件、识别芯片、焊接UART接口及排查连接问题。作者通过参考公开资料和工具成功提取固件并获取调试接口,发现设备存在加密系统解锁提示,为后续固件分析和漏洞挖掘奠定基础。文章提供了具体的操作步骤和工具选择建议,对硬件安全研究具有实践参考价值。 综合评分: 75 文章分类: 渗透测试,硬件安全,漏洞分析
Wavlink AC1200 拆机:从 SPI 抽固件到焊 UART 拿调试口
赛博安全攻防日记
2026年9月10日 11:22 美国
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
今天我会拆解一台 AC1200 双频 Wi-Fi 路由器(型号 vM32A3_V1410_240222),并拿到 UART shell。目标是摸清硬件、通过 SPI Flash 抽出固件,再接入 UART 调试口做更深分析。
一句话总结:我从 NOR Flash 里 dump 出了设备固件,在几个可疑口里确认了一路可用的 UART,焊上排针,拿到了 UART shell。
打开路由器
第一步是搞清楚外壳是怎么扣死的。我发现底部塑料脚垫下面藏着螺丝,先把它们卸掉,如下图。
卸完螺丝后还是很难拆开。我一度怀疑要不要先把天线拆下来——万一它们也参与了卡扣结构;网上也没找到这台机的拆机展示。
我想起两年前换手机电池时用过撬片,于是又试了一次:把撬片塞进后盖缝里轻轻撬,渐渐听到“啪啪”的开扣声,缝隙也大了一点!
撬片在前面板 LED 一带卡住了。我从 LED 灯条两侧轻轻往上发力,再把撬片往里推,后盖终于整块弹开。
看看板上的芯片
板上有一颗很显眼的神秘 SOIC,但丝印几乎看不清。
我从 Matt Brown 的 YouTube 视频里学到一招:用手电筒平行于芯片表面打光,更容易读出丝印。可我只有手机闪光灯,就改成侧角度带闪光拍照,一下子清晰多了:
板上还有几颗 MediaTek 芯片。
另外还看到两颗这样的:
我转到浏览器去查这些芯片分别是什么。
OSINT
用芯片型号搜到了 datasheet,结果汇总如下:
Chip NameDescriptionDatasheet LinkFM25Q64AI3 2350T0GNOR Flash.https://eng.fmsh.com/nvm/FM25Q64AI3_ds_eng.pdfMEDIATEK MT7628DAN 2413-AJCAL EAP4J770 01AAXAP3BU2Router-on-a-chip with an 802.11n MAC and baseband, a 2.4 GHz radio and FEM, a 580MHzMIPS® 24K™ CPU core, a 5-port 10/100 fast ethernet switch.https://files.seeedstudio.com/products/114992470/MT7628_datasheet.pdfMEDIATEK MT7612EN 2119-BMJL ETP2X287Wi‑Fi single chip.https://www.mediatek.com/products/broadband-wifi/mt7612e
我最感兴趣的是 NOR Flash——设备固件大概率就在里面,拿到它能让后续研究轻松很多。于是决定用 ch341a 烧录器和 SOIC8 夹具去抽固件。
Dump 固件
这是我第一次从芯片上抽固件,主要参考了 Black Hills 这篇 firmware dumping 文章。NOR Flash 的引脚定义在 datasheet 里:
装夹时确保 pin 1 在夹具、CH341A 座子和 NOR Flash 上对齐。
为了用 ch341a 抽固件,我从这个 Github Repository 下了驱动,在 Windows 笔记本上打开 AsProgrammer,选好芯片(IC > SPI > FIDELIX > FM25Q64A),点带箭头的读取按钮,成功读出了固件!
固件分析会放到本系列第二篇;现在先把注意力转回 UART!
拿调试口
识别 UART 接口
板上似乎有四处疑似 UART 接口,如果把某个空通孔也算上,或许还有第五处。
这也是我第一次接 UART,所以参考了 Matt Brown 的视频。我从右上角竖直那组、标号为 3 的接口开始,按下面流程认脚:
- 在板上找一个地。
- 我用的是天线那根黑色线缆黄铜接头。
- 用万用表测该地与 UART 各脚之间的导通,找出 GND。
- 第三组接口的最下面一脚与地导通。
- 给路由器上电,探测各脚:电压波动的多半是 TX,电压恒定的多半是 VCC,几乎没电压的多半是 RX。
这一步卡住了——并没有看到典型的 TX / VCC / RX 组合。我又测了通孔与 CPU 的导通,看起来是直接连着的。
其实在五个疑似口上扫了一圈,多数焊盘不是地就是 VCC……只有第四组里有一脚电压在跳。看起来正确接口找到了。
有意思的是,后来我用逻辑分析仪看了另外 4 组可疑口,完全没有数据在传。对我们来说,有一路能用就够了。
继续用万用表探测,从左到右确认了如下脚位:
Pin # (starting from the left)Label1VCC2GND3TX4RX
给 UART 做物理连接
我想接到这些 UART 脚上读调试输出,于是打算练练新学的焊接,焊上一排排针,方便对接镀通孔。问题来了:天线还焊在板上,PCB 没法从机壳里拿出来,焊起来很别扭。
直接拆焊天线不行——烙铁最高 480°F 也化不开原来的锡。后来我在接头上熔了一些 Sn99 Ag0.3 Cu0.7 焊锡(约 419°F),形成新合金后整块焊点终于化开了。
空间够用后,我掰下四根公排针,把 PCB 从 Wavlink 机壳里取出,下面垫一块开发用面包板当治具,保证排针焊得稳、焊得直。手头那块面包板的电源轨得掰掉一段,才能贴到板边而不撞到其他元件。
第一次焊排针并不成功。用 shell 去读 UART 输出,全是不可打印字符,而且按压排针时字符冒得更勤。
搞不清原因,只能继续排查。
排查失败的 UART 连接
为了看 UART 输出,我用 FTDI 线把识别出的 TX 接到接收端的 RX,再插到 Linux 机器上,确认识别为 ttyUSB0。
$ sudo dmesg | tail -n 30 [26610.245645] usb 1-8: Manufacturer: FTDI [26610.245648] usb 1-8: SerialNumber: [REDACTED] [26610.354160] usbcore: registered new interface driver usbserial_generic [26610.354180] usbserial: USB Serial support registered for generic [26610.356524] usbcore: registered new interface driver ftdi_sio [26610.356542] usbserial: USB Serial support registered for FTDI USB Serial Device [26610.356716] ftdi_sio 1-8:1.0: FTDI USB Serial Device converter detected [26610.356769] usb 1-8: Detected FT232R [26610.363780] usb 1-8: FTDI USB Serial Device converter now attached to ttyUSB0 [26610.693286] usb 1-9: reset high-speed USB device number 3 using xhci_hcd -- snip --
我搜了常见波特率,在 screen 里逐个试,直到路由器重启时能打出合法 ASCII。
9600 不行。
sudo minicom -b 9600 -D /dev/ttyUSB0
38400 好一点……
标准波特率我几乎都试过了,甚至看到 网上资料 说别的 Wavlink 路由器用 57600,但在我这台上也不行。
于是我去抽出来的固件里搜波特率相关引用。
remnux@remnux:~/Documents/wavlink-ac1200/_wavlink-ac1200.bin.extracted/_50040.extracted/_52D000.extracted/cpio-root$ rg -i --binary 'baud' Binary file bin/pppd matches (found "\u{0}" byte around offset 7) Binary file bin/comgt matches (found "\u{0}" byte around offset 7) remnux@remnux:~/Documents/wavlink-ac1200/_wavlink-ac1200.bin.extracted/_50040.extracted/_52D000.extracted/cpio-root$ strings bin/comgt | grep -i baud baud Invalid baudrate remnux@remnux:~/Documents/wavlink-ac1200/_wavlink-ac1200.bin.extracted/_50040.extracted/_52D000.extracted/cpio-root$ strings bin/pppd | grep -i baud baud_rate <speed> Set the baud rate to <speed> Baud rate for %s is 0; need explicit baud rate Baud rate for serial port
如上所示,确实找到了一些引用。bin/comgt 最有戏——里面的 Invalid baudrate 说明它在校验波特率。要是这样,说不定能挖出期望的波特率!
我在 Ghidra 里定位到该字符串,发现校验逻辑暗示合法波特率是 57600 和 38400。
if (iVar6 != 57600) { if (iVar6 < 57601) { if (iVar6 != 38400) { FUN_00402994("Invalid baudrate",1); } DAT_0041d228 = 0xf; goto LAB_00405b70; }
试 38400 还是不行,但至少说明问题多半不在波特率。这个波特率也和 这篇 writeup 里其他 Wavlink 型号一致;UART 脚顺序看起来相同,只是左右反过来。
下一个念头是:“会不会焊点虚焊,导致数据丢了?”
我拨了拨排针,左右一晃几乎没阻力。锡似乎没在通孔铜壁和针脚之间真正润开;焊的时候锡更爱粘烙铁,不爱粘铜。
另外,读 UART 时按压排针,屏幕上会突然喷出一串数据。这些迹象都指向第一次焊接不完整,造成丢数据和乱码。
修好 UART 连接
第二次焊接我做了这些调整:
-
焊锡改成 63% 锡 / 37% 铅
-
烙铁温度改到 380°F
-
用 91% 异丙醇清理 UART 孔周围的铜面,去掉氧化层,帮助润湿
-
更注意手法,确保铜焊盘吃够热
-
必要时多加点助焊剂
终于成了!
焊点不算好看,但够用。剩下就是把 FTDI 的母头杜邦线插到刚焊好的排针上,开始读数!
解读启动日志
完整启动日志在我的 GitHub 这里。因为焊接时拆了天线,日志里会有网口相关报错。
读日志时我注意到这些点:
-
U-Boot v1.1.3 (Jun 5, 2023)
-
Ralink UBoot Version: 5.0.0.0
-
有进入 boot CLI 或加载自定义固件的启动选项
-
Linux version 2.6.36
-
firmware version build time: 201511101431(多半是旧固件叠在较新 bootloader 上复用)
这几行特别扎眼:
[ 5.832000] [WAV_FLASH]FOUND_BY_ENC_FLASH [ 5.840000] Wavlink Encryption System is unlocked!
我很好奇他们的加密实现:加密了什么数据、密钥怎么存或怎么生成。
最后底部出现了登录提示。
WAVLINK login:
可惜 UART shell 似乎接不进任何键盘输入,没法试登录。我用万用表确认过焊上的 RX 排针与 CPU 导通,但看起来仍是只读 shell。这个问题以后或许再挖;眼下我更想先去啃固件。
Part 2 里会写到:我在摸索他们密钥生成逻辑时,意外找到的一个 0-day。
更多 IoT / 车联网 / 机器人 / AI 安全资料在星球里,扫码进「车联网攻防日记」。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:赛博安全攻防日记 《Wavlink AC1200 拆机:从 SPI 抽固件到焊 UART 拿调试口》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论