从音频文件中提取封闭格式元数据

逆向工程 苹果系统
2021-06-10 06:55:16

我正在编写一个应用程序来分析 .wav 音频文件并提取元数据。元数据适用于基于 RIFF 的文件的方式如下图所示:

在此处输入图片说明

您需要有“格式”和“数据”子块,但是您可以在文件中拥有任意数量的子块。要提取特定的子块,请转到第一个子块,读取它的 ID,如果它不是您要查找的 ID,则获取子块大小,然后跳到下一个子块 ID。

“开放”子块的其他示例是 iXML 和 ID3。我特别希望阅读的是 Soundminer,这是一个可搜索的数据库程序。它们的子块 ID 是“SMED”,因此我能够找到它并复制其元数据的内容。由于它是一个封闭的子块,我很难将这些数据转换成可读的格式。

话虽如此,我可以访问 Soundminer,因此我可以在 SMED 元数据中写入特定字符串,希望稍后在数据转储中解密。

由于我对此完全陌生,因此我正在寻找有关对该元数据进行逆向工程的最佳策略的建议。它是一个巨大的子块,能够存储图像和波形缓存。我希望获得一些更简单的数据,例如“描述”和“麦克风”。

我在 macOS 上,因此可能会限制我的方法。此外,该应用程序正在 swift 中编写,但我目前的方法是将该数据的十六进制值转储到文本文件中并手动查找模式,我已经能够看到一些模式。例如,如果我在描述中写入字母“a”,然后分析文件,我将得到相同的重复 16 位值09 14 c2 0c c3 0f 9f 8c,但如果我只输入一个“a”,则该值不存在。似乎需要“aaaaaaaa”才能给我09 14 c2 0c c3 0f 9f 8c. 显然,这是一个有缺陷的策略,不太可能产生结果。

2个回答
  1. 在 IDA Pro 中打开二进制文件。
  2. 搜索0x534D4544,这是SMED标签的 32 位编码
  3. 有五个结果;其中三个是mov指令,其中两个是cmp指令。后两个是有趣的;这是比较子块 ID 标签的地方。它们都在一个名为-[SMMDScanner getSMMetadata:signature:].
  4. 您立即发现它在 ECB 模式下使用 Blowfish 解密数据,使用固定密钥“u7w58he4746”。(在解密之前丢弃并且不要处理前四个字节,因为它们只是以下加密数据的(大端)长度。)
  5. 您立即还会看到解密的数据以 返回NSString,它显然包含通过查看周围代码中的字符串而得到的 XML 数据。例如,它确保解密的数据以 开头<MAGIC>和结尾</MAGIC>

由于您可以访问生成数据的程序,因此您可以将其用作预言机:

  1. 制作一个带有空描述字符串的文件

  2. 用一个字母描述制作另一个

转储这两个文件并查找差异。然后开始添加更长的描述并检查它如何影响输出。继续下去,直到你弄清楚你能想到的所有变体的格式。