前言
最近小伙伴把某块音箱给变砖了,因为一番骚操作把mtd分区直接dd了,导致无法启动,土豪的他选择又买了一个。我缺音箱,我想试试修复一下,修好了还能用,于是就开始了自己的一番折腾。本篇文章仅作为修复音箱的教程,特此声明。
情况分析
现在文件系统已经被破坏了,但是内核和uboot都还完好,因此我们可以尝试看看能否进入uboot中的shell,然后做些事情。那么问题就来了,我们要怎么进入uboot的shell呢,一般情况下,芯片都会有支持串口的引脚,串口简单方便调试,我们可以拆开音箱板子上找找串口。
板子上找串口
串口UART,异步收发,不需要时钟,最少仅需要3根线,GND, TX, RX。如果做得比较安全的话,一般在出厂的时候会把焊点或者引脚给抹去,但是据我所知,大部分的厂商貌似都不care这些,很大方的留了很多信息,这款音箱也是。很快在板子上找到了可爱的三个测试点在电路板的边缘
用万用表测一下可以很快确定一个点是GND,另外两个可以通过观察串口是否能够正常工作判断TX和RX。
在确定了串口引脚之后,还需要外接一个USB转串口的rs232芯片,就像这样的
连接好之后,可以在终端下输入命令ls /dev/tty*
观察已经有串口ttyUSB1
设备被识别
在linux下,可以通过串口工具minicom与串口进行通信。在使用minicom之前,需要配置串口名称和波特率,名称就是ttyUSB1,而波特率一般是115200.
通过执行sudo minicom -s
进入配置串口名称和波特率的界面
除此之外,还需要修改Hardware Flow Control改为No,使得minicom允许输入。这样才能进行交互
uboot shell
很幸运,这款音箱的uboot shell没有被裁减,因此给了我们通过uboot修复分区的可能性。在重启的时候会有一段时间允许进入uboot shell中,这段时间一般都比较短,需要在重启的时候不断的按空格或者回车即可。界面如下图
在这个界面下是支持很多命令的,通过help查看
通过uboot给定的命令,我们就可以利用uboot给的shell实现将固件烧录到nand flash中
准备新固件
新的固件可以从新设备上提取,亦可以在网上下载,还可以通过抓包获取,获取的方法有很多。关键是我们要固件的格式进行分析,找到我们想要烧入到nand flash中的部分。我拿到的固件是通过OTA升级抓包拿到的,通过binwalk 可以看到包的基本结构如下
我们所需要的正是文件系统,0x380开始到0x1F5DED0,将这块内容dd下来就是包含了完整的文件系统。
我们只需要将这部分的固件发送给音箱即可。
nand flash烧写方法
确认固件烧写位置
在往nand flash中烧入固件之前,我们需要先确定nand flash是如何分区的,在启动日志中可以看到下图
可以看到有boot0 boot1 system0 system1分区,猜测有两套启动方式,一套是主要的,一套是升级或者出厂设置使用的,经过查看发现system1是空的,所以极有可能真正的文件系统是在system0分区的。
system0对应位置为0x2000000-0x4080000
但是起始位置是相同的,起始位置0x2000000
很关键,这个是我们的目标位置
从串口接收文件系统部分的固件
- 选择一块空的内存区域,我之前选的是0x5000000,有问题,后来选择的0x6000000,这个位置是试出来的,目的是接收system0分区
- 使用kermit接收执行命令
loadb 0x6000000
进入如下界面
- 按快捷键CTRL+A S 进入发送协议选择界面
选择kermit协议,并且选择要发送的文件,按空格键选中文件。
发送文件的界面
此时可以完备的将固件发送到内存中,地址为0x6000000
由于此过程是通过串口发送,因此其速度比较慢,实测耗时1个小时
将内存中接收的system0写入nand flash
首先擦除system0分区,执行如下命令
nand erase.part system0
然后往system0分区中执行烧写工作,执行如下命令
nand write 0x6000000 0x2000000 0x2000000
写入过程很快,不用等待
完成烧写
至此已经完成文件系统的修复。经过重启,发现音箱又复活了~~
结语
本文介绍了在仅有串口的情况下如何利用uboot的shell完成对Nand flash的固件写入流程,虽然可能不同的设备细节上不尽相同,但是基本流程本文已经介绍的较为清晰,当然除了串口还有别的方式实现救砖的工作,比如USB启动或者JTAG等方式,这些方式速度较快,但是对硬件电路的逆向水平也更高,所以我最爱的还是串口。