这是关于三星 NX mini(M7MU)固件逆向工程系列的后续内容,主要研究三星 NX mini、NX3000/NX3300 和 Galaxy K Zoom 固件中代码部分使用的专有 LZSS 压缩。
- Layer 1:.bin 文件:Part 1确定可分析的.bin 文件,推导容器格式并创建固件容器内节文件的提取工具[m7mu.py]。本文分析基于从 NX mini 固件版本 1.10 中提取的
chunk-05.bin
节文件。 - Layer 2:节:七个节文件大小在 16 字节到 5.2MB 之间,较大的文件包含压缩数据。节 1、2、4 和 5 都在各自开头包含调试字符串,表明每个节文件单独压缩。发现字符串中 16 个字符后被两个零字节中断的模式是 LZSS 的变体,其每个压缩流的块以位掩码开始,标识后续字节是直接插入输出流的“字面量”还是表示对先前解压缩数据的查找的“令牌”,令牌是偏移量和长度的元组。
- Layer 4:块:通过比较压缩流和预期的纯文本流来理解 LZSS 变体的参数,找到已知纯文本参考(如 wpa_supplicant 许可证),分析块结构和位掩码格式,确定块开头的 16 位位掩码中“0”表示“字面量”,位掩码是大端的,从 MSB 到 LSB 处理,令牌用两个字节编码。
- Layer 5:令牌:了解令牌的编码方式以实现窗口查找,通过分析最后一个块的令牌值“00 0b”,确定偏移量可能存储在第二个字节,长度编码在第一个字节的低位,为了更高效,令牌表示至少三个字节的数据,需要添加 3 进行解压缩。还发现变量长度令牌的使用,通过假设第一个字节是令牌的可变长度扩展,解决了解码中的不匹配问题。
- Back to layer 3:子节:假设文件开头的两个字节不是有效压缩数据,而是某种头或计数,发现“0x0000”标识子节的结束,后面的字是下一节的开始,还发现子节大小在解压缩后似乎是随机的,但有一定模式,如大多数后续子节为 24576 字节,一些略有不同,且 uncompressed subsections 也需要输入到查找窗口中,最后添加了特殊处理来处理“32768 未压缩字节”的情况。
- Fujitsu RELC 历史:关于 Fujitsu RELC 的细节大多在日语中,有 2014 年的 Arcmanager 软件库手册提到 ESLC 和 RELC,2011 年的 ARM Cortex 设计支持手册概述了 RELC 硬件块,Arcmanager 门户提供了一些更多的见解,原始提交已使用 13 位偏移和 3 + N * 8 位偏移编码,且可从固件文件中的 RELC 相关字符串确认使用了 RELC 硬件块。
- Summary:通过分析不同层的固件文件,发现了嵌入在为三星相机供电的 Fujitsu CPU 中的硬件加速器,最终的文件结构包括 1024 字节的 M7MU 头、七个(压缩/未压缩)节文件和一个“SF_RESOURCE”文件系统,还提供了提取工具[m7mu.py]和最终版本的解压器[m7mu-decompress.py],可用于理解这些相机上实际运行的代码。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。