硬核HACK-从蓝牙音箱的固件提取和修改说起(1)

0x01 起因

手里闲置了几个音箱单元,但是没有功放。在淘宝上买了两个蓝牙功放模块,集成蓝牙3.0,模块使用D类放大器,驱动效率高音质也可以,放在两个卧室里用。但是遇到了两个小问题:

  • 蓝牙设备名称无法修改,手机里显示两个同样名字的蓝牙设备,无法区别连接哪个
  • 开机时和蓝牙连接时会分别播放一段十秒左右的大音量提示音乐,这个真的没法忍,太吵了,只是静静地做一个蓝牙音箱不好么……

0x02 拆机分析和提取固件

  • 既然无法接受,那就自己动手。拆开看看,拆机过程不表,直接说PCB。布线规范,基本能推测到每个部分的功能:

Jietu20181225-233856

  • 嵌入式设备逆向过程中比较重要的是分析各模块的功能,一般是根据芯片的丝印代码和封装来查找芯片的型号,确定了型号后结合各模块布局基本能分析出每一块的功能。常用的芯片的丝印代码和封装一般一看都知道,例如常用的电源芯片7805、lm1117丝印N05A封装SOT-223,总线电平转换485、2232。但是遇到小众芯片时,就需要查询丝印代码了。给出一个查询网站 alldatasheet ,结合这个和百度谷歌可以查到大部分电子元件的datasheet。也会遇到一些保密性强的设备,芯片丝印被打磨掉了,防止被逆向分析,当然这是一场矛和盾的博弈,也是有办法分析的,以后开一篇文章(mark,标记下以后填坑)专门说这个,快跑题了。

  • 但是,显然这里我被打脸了,这个蓝牙SOC查询不到型号和datasheet。解释下可能的原因,据我了解到的是,部分射频芯片包括蓝牙芯片在内,芯片厂家不公开发布开发资料,只有合作的研发厂家签署NDA保密协议以后,芯片厂家才会把datasheet和开发demo提供给研发厂家。因此这类芯片的可参考资料很少。说白了是厂家为了控制市场,这方面国内的芯片厂商还要加油,国内的乐鑫出的ESP8266这个WIFI SOC就是正面典型,国内外知名,资料丰富,又跑题了……

  • 小型嵌入式系统中固件数据一般保存在ROM(read only memory)中,保存方式一般分为两种:

    • 主控SOC片内存储
    • 主控SOC片内存储加上外部存储
  • 存储数据的介质一般有两种:

    • EEPROM(Electrically Erasable Programmable Read-Only Memory)
    • Flash,其中又分为nor falsh和nand flash

EEPROM可以可以随机访问和修改任何一个字节。
而 flash属于广义的EEPROM,因为它也是电擦除的rom。但是为了区别于一般的按字节为单位的擦写的EEPROM,我们都叫它flash。flash做的改进就是擦除时不再以字节为单位,而是以块为单位,一次简化了电路,数据密度更高,降低了成本。上M的rom一般都是flash。
nor flash数据线和地址线分开,可以实现ram一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块来擦。
nand flash同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。读取只能按页来读取。
因为nor flash可以进行字节寻址,所以程序可以在nor flash中运行。嵌入式系统多用一个小容量的nor flash存储引导代码,用一个大容量的nand flash存放文件系统和内核。

  • 这里的sop8封装芯片丝印型号为p25q40h,典型的flash芯片。一般的sop8封装芯片,丝印为24xxx的是eeprom,丝印为25xxx的为flash。

Jietu20181226-002737

  • 分析这么多了该提取固件了,片内固件的提取一般需要芯片专用的编程器,arm主控一般是JTAG设备,而且还要看是否设置了熔丝位防止读写;这次不知道主控型号,显然只能先提取片外flash的固件了。关于固件的提取后面会专门开一篇(mark,标记下以后填坑)文章。我是用设备是CH341芯片的编程器,兼容大部分24和25芯片。使用mac的同学注意下,我测试的是这个编程器不兼容在mac的vmware虚拟机下使用,无法读取和写入,原因未知。最后是用另一台win系统主机来读写的。编程器如下:

Jietu20181226-004255

  • 编程器的使用一般需要拆下来芯片,把flash插入到编程底座来读写,这样需要拆芯片显然比较麻烦。我是用了上面的夹子,叫芯片夹或者在线编程夹,可以不拆芯片的情况下直接将触点固定在芯片上对芯片操作,这个方法比较tricky and dirty。大部分情况下是可以直接用的,当然这里我又被打脸了,测试以后发现读取不出来。推测原因可能是蓝牙SOC操作flash使用的是推挽工作模式(PP,push & pull)模式的GPIO,在主板上电SOC读取完flash后把总线电平拉低,导致在线编程夹无法拉高总线电平,导致无法读取数据。说真的这是第一次遇到在线方式无法使用的。关于GPIO工作模式和信号电平以后专门开一篇来讲(mark,标记下以后填坑)。

  • 那接下来就需要拆芯片了,flash芯片SOP8封装有8个引脚,使用电烙铁拆芯片显然是不现实的,无法同时对8个引脚加热。这就需要另外一个设备了,热风枪。关于硬件研究中使用设备和工具会后专门开一篇(mark,标记下以后填坑)。热风枪一般使用300度就可以了,等管脚焊锡融化后即可拆下芯片,高温,注意用镊子,别问我为啥知道,烫一次就记住了。设备如下:

Jietu20181226-011026

  • 拆下芯片后夹上编程夹:

Jietu20181226-011710

  • 打开程序配置下芯片参数,即可读取到flash中的二进制文件,保存为f900s.bin后面接着分析:

Jietu20181226-011916