我有一个蓝牙扬声器,它会宣布诸如“已连接”、“关闭电源”之类的界面事件。我想让这些公告保持沉默。我想这样做的方法是获取扬声器使用的声音文件,并替换/删除该数据。
我早些时候问过一个关于提取这些数据的问题,并使用收到的建议,我成功地提取了这个演讲者的记忆。
我现在正在尝试分析提取的二进制文件并找到声音文件。但我没有成功。
提取的二进制文件在这里:https : //drive.google.com/file/d/1e9yG8xMkZ331C2TOTOzo9Y93L4abxX9F/view?usp=sharing
芯片为XT25F08B。这是一个 1 MB 的内存。我多次通过 SPI0 和 SPI3 接口提取数据(使用我为此目的编程的 Arduino),并diff
比较输出以确保我拥有正确的数据。
还在strings
二进制文件上运行命令显示了设备名称的悠久历史,我认为这些设备名称是我用来连接扬声器的各种手机/计算机。这增加了我对提取的数据没有损坏的信心。
查看 binvis.io 中的二进制文件显示:
似乎有三个块被未写的内存隔开。
根据binwalk( binwalk --disasm data.bin
),中间块(从偏移991232 开始的43KB)是ARM 拇指代码。
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
991232 0xF2000 ARM executable code, 16-bit (Thumb), little endian, at least 2500 valid instructions
该块实际上填充了设备名称历史记录。我不确定为什么这会是 ARM 代码,因为扬声器的处理器是 ATS2815,它是一个集成的蓝牙音频处理器,它的数据表似乎没有表明与 ARM 架构的任何类型的关系,但我不是当然。
Binwalk 还认为最后一个块(从 1044480 开始到最终二进制地址结束的 4KB)包含大约一半的 ARM 代码。
第一个块对我来说完全不透明。看熵图(也是binvis):
显然,第一个块是加密的或压缩的。这只是一个蓝牙音箱,你会通过加密来保护什么?此外,熵不是完全随机的,有一些细微的变化,表明它可能被压缩了。但我不确定。
运行binwalk -X data.bin
似乎表明几乎每个第二个字节都是一个原始的 deflate 压缩流!
...
41834 0xA36A Raw deflate compression stream
41837 0xA36D Raw deflate compression stream
41986 0xA402 Raw deflate compression stream
42290 0xA532 Raw deflate compression stream
42291 0xA533 Raw deflate compression stream
42300 0xA53C Raw deflate compression stream
42510 0xA60E Raw deflate compression stream
42543 0xA62F Raw deflate compression stream
42758 0xA706 Raw deflate compression stream
42789 0xA725 Raw deflate compression stream
42920 0xA7A8 Raw deflate compression stream
42948 0xA7C4 Raw deflate compression stream
42967 0xA7D7 Raw deflate compression stream
43867 0xAB5B Raw deflate compression stream
44226 0xACC2 Raw deflate compression stream
...
这一直持续到最后一个地址。这是否意味着整个文件都被压缩了?当然不是,二进制文件中有原始字符串,所以这不可能是真的。
那么也许只是第一个块被压缩了?但是我也解压不了。我已经尝试了多种方法来做到这一点。gunzip、unlzma、zlib-flate、unxz 在 data.bin 和一个提取的第一个块的 bin 上。但我最终遇到了“文件格式无法识别”或“无效的标题检查”等错误。
我也尝试拆卸中间和最后的块。 https://onlinedisassembler.com/odaweb/K2AmuJIN https://onlinedisassembler.com/odaweb/TcU2x8ZR
我选择arm作为架构只是为了看看,你可以看到反汇编中充斥着“指令:0x ...”。这可能意味着它不是正确的架构,因此不是正确的反汇编。
我从这里去哪里?我如何穿透二进制文件的大块不透明块。这个怎么解压啊 假设其他块是主处理器加载的代码,我如何反汇编它们。
我错过了一些明显的东西吗?
尽管我想获得扬声器使用的声音文件,但最重要的是。我确定它们在这里的二进制数据中,因为设备中没有其他内存芯片,而且处理器本身没有足够的 ROM 来保存这些数据。