和 Codex 爆改 USB 上网卡:从备份固件到读出短信

目录

声明:本文包含 AI 辅助创作。

这次给 Codex 派了个硬活:把一只随手抓来的 USB 上网卡改造成无头短信收发站。主力模型用的是 GPT 6.1 Sol。

需求很简单,几张偶尔用来收验证码的卡总得有个去处,扔在手机里费电还得维护,不如搞个设备插在 Linux 主机上挂着。之前看人拿大疆 4G 模块改过类似的东西,手头正好有些闲置硬件,干脆自己动手。

本来只想问问可行性,结果聊着聊着尺度就失控了:能不能把原固件完整倒出来?能不能自己写个小程序塞进去?能不能直接编译刷机?

折腾到现在,固件通过 USB 备份出来了,自己写的 C 程序也成功跑在设备上,甚至已经从存储里抠出了短信。现在发送和接收回复也实测通过,先把这段过程记下来。

先翻出来的是一台红米 1S

最早看中的其实是抽屉里的红米 1S。这老机子早就 root 过,网上开源内核和第三方系统一抓一大把,本来打算刷个轻量 Linux 进去直接管 SIM 卡。

Codex 当时帮我把整个方案拆了一遍:Linux 内核要改哪些驱动、基带跟系统怎么通信、抛弃安卓后哪些服务必须保留。甚至连远程双向通话音频怎么从系统里捞出来、怎么送回都顺手查了。

可现实马上泼了冷水——这破手机要用的 2G 网络,本地早退网了。基带连不上网,折腾系统也是白搭,只能换方案。

翻箱倒柜,总算翻出了以前买的一只 USB 上网卡。

我拆外壳,它查芯片

这东西本来就是插电脑上靠网页后台配流量、发 Wi-Fi 的。撬开外壳,里面倒是有个标准的 SIM 卡槽,但插上自己的卡后,根本不按预想的逻辑工作。

我把 PCB 正反面的芯片丝印拍给 Codex,让它顺藤摸瓜。板子型号 CSM45L,核心是展锐 US8310AM。核对完资料凉了一半:这货跑的是厂商的定制 RTOS,网上那些把同类上网卡刷成 OpenWrt 的骚操作完全照搬不了。

调试时还发现个诡异现象:开机后反复轮询 SIM 卡状态,刚通电时能抓到卡,过一会儿状态就变了。单次查询根本看不出猫腻,必须写个循环连续打日志才抓到这个时序坑。至于底层到底是哪段代码在搞鬼,只能进固件里慢慢扒。

没 SDK?那就硬着头皮找替代品

最偷懒的法子是通过 USB 端口发 AT 指令,直接调原固件收发短信。不过我更想把控制权抓在手里,写个精简的设备端程序,直接把短信通道暴露出给主机,把原厂那套臃肿的业务逻辑替换掉。

底层蜂窝协议栈和基带驱动当然得留着,LTE 鉴权和拨号这块水太深,没必要自己去碰。我的目标很窄:搞定 SIM 卡管理、读写短信,以及和主机的通信。

麻烦在于,展锐这块芯片根本没有公开的 SDK。Codex 一直把“缺乏厂商头文件和工程源码”标为后续的大红灯。好在我没打算放弃,让它继续满世界刮地皮。

后来居然真被它翻出来一个 D-Link 同平台的官方固件包。里面除了刷机包,竟然带了符号信息和调试产物。我们直接丢给 IDA 和分析脚本,对照着手上这块板子的二进制一点点啃。

虽说没有完整的工程源码,但有了这些带函数名的参考样本,大批原本死寂的内存地址总算有了名字,函数签名和消息结构也有了线索。

刷机前,先把退路留好

谁也不想为了备份去热风枪吹 Flash 上编程器,必须想办法从 USB 把全盘倒出来。

Codex 顺藤摸瓜找出了固件里留存的诊断读取接口,先试探着读出一部分内存代码进行交叉比对。接着,它基于开源的底层加载器魔改了一个 NAND 读取工具,一口气把控制器能管到的原始 NAND 数据全倒腾了出来,顺手搞定了硬件 ECC 校验。

这中间差点踩了大坑。在参考固件里翻到原厂加载器时,我差点直接拿来用。好在 Codex 多看了一眼反汇编,发现这东西在等主机指令前,会顺手触发自动格式化或重写配置分区。

找到加载器不代表能直接用,关键得看它上电究竟会干什么。最后我们还是老实用了自己写的小程序,严格限定读写范围,才安全把全盘备份抠出来。

备份做完,回写测试也必不可少:划定应用区、擦除、写回、再读出来对比、最后重启。确认原厂固件还能正常活过来,才敢进行下一步的魔改。

头版固件:让它活着回个名字

试水的第一版极其克制,只写了个极小的 C 程序:上电后接管指定位置,通过 USB 回传一个自定义的版本字符串。

没有 SDK 的后果就是硬编码地址:保留原厂的底层和驱动,把编译好的二进制硬塞进分析好的空闲函数区,重新算校验和打包。

第一次刷完满怀期待地重启——好家伙,USB 直接没响应了,拔插好几次毫无反应。得,变砖了。好在 PCB 上留了复位短接点,按住按键重新上电,Codex 迅速在终端守株待兔,用下载模式把原厂固件捞了回来。

失败原因没法在纸面上完全理清,调整了内存重定位和启动标记后,第二版总算过了。插上电脑,终端甩回来一行字:

sim-pool app/0.1

把内存读出来核对无误,再刷回原厂固件确认硬件没废。到这里,编译、刷入、执行这条闭环算是跑通了。

终于把短信抠出来了

到了最核心的短信环节,不出意外又卡了一道。

Codex 找到了平台层处理短信的回调函数,写好了注册逻辑。结果满怀期待地发了条测试短信,终端死活没反应。排查了半天才发现,回调拿到的只是底层裸事件,部分关键消息头要在后续的分发流程里才会被填充。我们拦截得太早,把消息当垃圾过滤掉了。

修正逻辑后,自研的固件终于通过 USB 往外吐出了两条真实的短信内容。Mac 上跑个脚本一解:一条是测试用的英文,一条是中文短信,反复读很多次,数据非常稳定。

读出旧短信后,继续把 SIM 和短信初始化补上,LTE 注册也正常了。接着从 Mac 通过自己的 USB 接口发了一条测试短信,手机确实收到了;用手机回一条,设备也读到了,发送人、时间和正文都能解析。到这里,短信的一发一回算是跑通了。

原厂那些臃肿的业务逻辑还没全清掉,目前只是接管了一部分初始化和 USB 交互。离做成一个真正稳定托管的设备还有段距离。

这次折腾的几点体会

必须承认,这次和 Codex(配合 GPT 6.1 Sol)的搭档效率高得惊人。面对一块完全不公开资料、没有 SDK 的上网卡,它一路硬生生通过查芯片、扒同类固件符号、写 USB 诊断加载器,把自定义 C 代码跑通并完成了短信收发实测。

整个过程最管用的策略就是“小步快跑、随时验证”:先确认能不能读,再看能不能救;先弹个版本号,再调短信接口。任何一步翻车,都得把终端日志和代码逻辑拍给 AI 一起对。像消息头拦截太早、首版刷入变砖这种问题,只靠纯理论推演根本无解。

这只上网卡现在已经能跑我们自己的代码,通过 USB 完成短信一发一回了。下一步补上长短信、自动到达通知,再继续清理剩余的厂商臃肿业务。等真正稳定运行了,再来写下篇。

型号、丝印和原厂版本

把这次查到的型号和版本号集中贴一下,方便拿着同款板子的朋友搜到。

包装生产企业:深圳前海聚火科技有限公司
销售型号:UX21
入网型号:JH-MW-B1
PCB 丝印:CSM45L_MB_V2.0_20211029
屏蔽罩标签:CSM45L-33A / YYC20230329-01 / 20230404

主芯片丝印:UNISOC US8310AM RGRW01.00A MPL795000E AGABB06206
Wi-Fi 芯片丝印:SV6158 THC2246 01H38M
存储芯片丝印(完整料号仍待核对):1405KLE ZP1205 CHINA TC58NY G1S8H BA16
平台相关名称:UIS8310 / UMS9117 / Cortex-A7 / ThreadX / MOCOR
PCB 测试点:RXD / TXD / VBAT / VBUS / DM / DP / GND / KEY / PBINT
NAND ID:98 BA 90 55 76 16
芯片 ID:0x98180001
USB VID:PID(正常模式):1782:000b
USB VID:PID(下载模式):1782:4d00
BootROM 握手:SPRD3

原厂 AT+CGMI:Spreadtrum Communication CO.
原厂 AT+CGMM:V1.0.1-B7
Platform Version: STONEOIM_uis8310vs_csm45l-03-34a_jh_pl_ssv_cc_64mb_lte_4m-cs_vsim-oldbase_user_20230415113142_Release
Software Version: 0.1902.16.00
Hardware Version: vsim-csm45l-jh
Modem Model: modem_csm45l-03a
Flash type: P
Platform OEM: stoneoim
FOTA Version: V1.0
Platform Name: vsim-csm45l-jh
BASE Version: FM_BASE_THIN_MODEM_TRUNK_W21.05.3
HW Version: UMS9117
buildtime: 04-15-2023 11:34:23

同平台参考资料(另一块板子):
D-Link DWR-930M / CSM18-01 / FW 2.07ME
UMS9117_uis8310_128MB_M2_halo_rel.axf
UMS9117_uis8310_128MB_M2_halo_rel.map
UMS9117_uis8310_128MB_M2_halo_rel.pac
uis8310_csm18-01_weijia_m1c_pl_cc_64mb_lte_4m-cs_halo-stable_user_20230216211708
评论区加载中…