关于物联网或者车机固件的解包,主要围绕两个问题:固件压缩算法和固件文件系统
常见的固件压缩算法有:LZMA、Gzip、Zlib、Zip、ARJ等。
常见的文件系统有:squashfs、jffs2、ext2、cramfs、yaffs2等。

文件系统

常见的文件系统,使用binwalk就可以很容易的识别出来,同时binwalk支持主流的压缩格式的解压缩。

AXFS

AXFS件系统是一个Linux内核文件系统驱动程序,它使文件能够直接从闪存或ROM内存中执行,而不是复制到RAM中。
这个项目是由在英特尔的工程师发起的。从那以后,主要的开发人员已经转移到Numonyx。AXFS旨在取代线性XIP CRAMFS,并结合了CRAMFS和SquashFS的功能。与现有解决方案相比的优势在于,它可以提供更少的内存和更少的闪存,因为可以只压缩那些有助于节省内存的页面。它包括用于识别应解压缩的页面的工具。它的测试版于2006年7月推出。

SquashFS

SquashFS 是一套基于Linux内核使用的压缩只读文件系统。该文件系统能够压缩系统内的文档,inode以及目录,文件最大支持2^64字节。它是嵌入式设备中最常见的文件系统之一。
SquashFS是基于GPL协议的开源软件。初始的版本使用gzip压缩,2.6.34版本Linux内核增加了支持LZMA和LZO压缩,并且在2.6.38内核版本上增加支持XZ压缩。

F2FS

F2FS (Flash Friendly File System) 是专门为基于 NAND 的存储设备设计的新型开源 flash 文件系统。特别针对NAND 闪存存储介质做了友好设计。F2FS 于2012年12月进入Linux 3.8 内核。F2FS仅支持Linux操作系统。

JFFS2

JFFS2的全名为Journalling Flash File System Version2(闪存日志型文件系统第2版),其功能就是管理在MTD设备上实现的日志型文件系统。与其他的存储设备存储方案相比,JFFS2并不准备提供让传统文件系统也可以使用此类设备的转换层。它只会直接在MTD设备上实现日志结构的文件系统。JFFS2会在安装的时候,扫描MTD设备的日志内容,并在RAM中重新建立文件系统结构本身。

EXT2

EXT2第二代扩展文件系统(second extended filesystem,缩写为 ext2),是LINUX内核所用的文件系统。它开始由Rémy Card设计,用以代替ext,于1993年1月加入linux核心支持之中。ext2 的经典实现为LINUX内核中的ext2fs文件系统驱动,最大可支持2TB的文件系统,至linux核心2.6版时,扩展到可支持32TB。其他的实现包括GNU Hurd,Mac OS X (第3方),Darwin (第3方),BSD。ext2为数个LINUX发行版的默认文件系统,如Debian、Red Hat Linux等。

CRAMFS

Cramfs是Linux的创始人 Linus Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。
在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本。另外,它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。由于以上特性,Cramfs在嵌入式系统中应用广泛。

YAFFS2

YAFFS2 是Aleph1的工程师Charles Manning 开发的NAND Flash 文件系统。YAFFS1和YAFFS2 主要差异还是在于PAGE 读写 size的大小,YAFFS2可支持到2K per page, 远高于YAFFS的512 Bytes, 因此对大容量NAND flash更具优势。其他与YAFFS1不同的是, YAFFS2不再写spare area, sequenceNumber 用29 bits 表示。Yaffs2还拥有YAFFS1所缺乏的SuperBlock, 因此YAFFS1严重依赖文件系统的read_super。

压缩算法

LZMA

LZMA(Lempel-Ziv-Markov chain-Algorithm),是一个Deflate和LZ77算法改良和优化后的压缩算法,开发者是Igor Pavlov,2001年被首次应用于7-Zip压缩工具中,是 2001年以来得到发展的一个数据压缩算法。它使用类似于 LZ77 的字典编码机制,在一般的情况下压缩率比 bzip2 为高,用于压缩的可变字典最大可达4GB。

Gzip

Gzip是若干种文件压缩程序的简称,通常指GNU计划的实现,此处的gzip代表GNU zip。
GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

Zlib

zlib是提供数据压缩用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表。zlib使用DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。
zlib同时又是一种数据格式,使用zlib库压缩后的数据会在deflate数据的头和尾添加信息,形成zlib格式的数据。gzip数据头比zlib数据头要大,因为它保存了文件名和其他文件系统信息,事实上这是广泛使用的gzip文件的数据头格式。gzip是在zlib之上,包了一层,在头和尾添加了一些额外的信息。

ZIP

ZIP文件格式是一种数据压缩和文档储存的文件格式,原名Deflate,发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为application/zip。
当前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7z格式。从性能上比较,RAR及7z格式较ZIP格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。

ARJ

ARJ(Archived byRobertJung),是一个由Robert K. Jung所设计的高效率档案压缩工具。ARJ现在的版本是2.85(DOS版)与3.15(Windows版),只支持Intel的16-bit与32-bit的CPU。

RAR

RAR是一种文件压缩与归档的私有文件格式,用于数据压缩与归档打包,简单的说就是将原有的文件数据经过压缩处理之后保存为RAR文件格式后缀名,通常Windows用户比较常见的压缩软件WinRAR,通过使用WinRAR对文件数据进行压缩后默认保存的文件格式就是RAR格式。

固件解包

熵分析

熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在信息论里面,熵是对不确定性的测量。但是在信息世界,熵越高,则能传输越多的信息,熵越低,则意味着传输的信息越少。 英语文本数据流的熵比较低,因为英语很容易读懂,也就是说很容易被预测。即便我们不知道下一段英语文字是什么内容,但是我们能很容易地预测,比如,字母e总是比字母z多,或者qu字母组合的可能性总是超过q与任何其它字母的组合。如果未经压缩,一段英文文本的每个字母需要8个比特来编码,但是实际上英文文本的熵大概只有4.7比特。这是由于英文的编码包含了各式符号,如逗号、引号等。因此英文输入法使用了8个比特来表达一共256个字母及符号。 如果压缩是无损的,即通过解压缩可以百分之百地恢复初始的消息内容,那么压缩后的消息携带的信息和未压缩的原始消息是一样的多。而压缩后的消息可以通过较少的比特传递,因此压缩消息的每个比特能携带更多的信息,也就是说压缩信息的熵更加高。熵更高意味着比较难于预测压缩消息携带的信息,原因在于压缩消息里面没有冗余,即每个比特的消息携带了一个比特的信息。香农的信源编码定理揭示了,任何无损压缩技术不可能让一比特的消息携带超过一比特的信息。消息的熵乘以消息的长度决定了消息可以携带多少信息。 香农的信源编码定理同时揭示了,任何无损压缩技术不可能缩短任何消息。根据鸽笼原理,如果有一些消息变短,则至少有一条消息变长。在实际使用中,由于我们通常只关注于压缩特定的某一类消息,所以这通常不是问题。例如英语文档和随机文字,数字照片和噪音,都是不同类型的。所以如果一个压缩算法会将某些不太可能出现的,或者非目标类型的消息变得更大,通常是无关紧要的。但是,在我们的日常使用中,如果去压缩已经压缩过的数据,仍会出现问题。例如,将一个已经是FLAC格式的音乐文件压缩为ZIP文件很难使它占用的空间变小。

熵是用于表达混乱程度的名词,熵值可以表达系统中蕴含的能量,也可用于表达信息中的不确定性。针对某个特定固件镜像进行熵分析,该操作能够帮助判断固件镜像是否进行了压缩或者加密,当然这种判断不一定是准确的。使用信息熵判断固件是否是同一厂商同一系列的产品具有较高的参考价值。
binwalk的-E参数提供熵分析,其实现了两种方式计算固件的熵,

  1. if use_zlib:
  2. algorithm = gzip #gzip信息熵分析方法
  3. else:
  4. algorithm = shannon #Shannon香侬熵分析方法
  5. def str2bytes(string):
  6. '''
  7. 用于Python2和Python3字符串之间的交叉兼容性。
  8. '''
  9. if isinstance(string, type('')) and PY_MAJOR_VERSION > 2:
  10. return bytes(string, 'latin1')
  11. else:
  12. return string
  13. def gzip(self, data, truncate=True):
  14. '''
  15. 基于zlib压缩比进行信息熵分析。
  16. 这比shannon分析更快,但是不是很准确。
  17. '''
  18. # 求信息熵的方法:zlib压缩大小/原始大小
  19. e = float(float(len(zlib.compress(str2bytes(data), 9))) / float(len(data)))
  20. if truncate and e > 1.0:
  21. e = 1.0
  22. return e
  23. def shannon(self, data):
  24. '''
  25. 对给定的数据块执行香农熵分析。
  26. '''
  27. entropy = 0
  28. if data:
  29. length = len(data)
  30. seen = dict(((chr(x), 0) for x in range(0, 256))) # ascii码(含后128个扩展码)
  31. for byte in data:
  32. seen[byte] += 1
  33. for x in range(0, 256):
  34. p_x = float(seen[chr(x)]) / length # 每个ascii字符占总长度的比率
  35. if p_x > 0:
  36. entropy -= p_x * math.log(p_x, 2)
  37. return (entropy / 8)

我们可以自己创建一些文件进行熵分析,以此来理解熵分析的作用。
如下图所示,test文件由较为无序的26个字母组成,test1文件由相同的字母a组成,分别对两者进行熵分析,可以看到较为无序的文件的熵分析结果为0.572,重复度较大的文本的熵分析结果为0.015,这在一定程度上反映了文件内容的无序程度。熵分析结果越大,文件越难理解。
image.png
接下来我们采用相关压缩算法和加密算法,来探究对熵分析结果的影响。
zip压缩test1.txt文件(0.5177):
image.png
使用gzip压缩test1.txt文件(0.7283):
image.png
使用bzip2压缩test1.txt文件(0.7916):
image.png
使用xz压缩test1.txt文件(0.8166):
image.png
使用lzma压缩test1.txt(0.4671):
image.png
使用des-cbc模式加密test1.txt(0.7301):
image.png

算法 熵分析
0.0150
gzip 0.7283
bzip2 0.7916
zip 0.5177
xz 0.8166
des 0.7301
lzma 0.4671

由于文件太小,不能很好的体现不同压缩算法对文件的熵分析结果的影响,但也可以看出加密和压缩方式会对文件熵由很大影响。

TOTOLINK V4.1.2cu.5050_B20200504

binwalk分析,可以看到识别出的文件系统有JFFS2、Squashfs。
image.png
熵分析结果如下:
image.png
binwalk -Me解包,会发现解包失败,因为默认binwalk是使用外部提取器jefferson提取jffs2文件系统的,默认的binwalk是未安装该组件的。
image.png

  1. # Install jefferson to extract JFFS2 file systems
  2. $ sudo pip install cstruct
  3. $ git clone https://github.com/sviehb/jefferson
  4. $ (cd jefferson && sudo python setup.py install)

image.png
image.png

DWR-932_B1_FW_v.02.02EU

解压,存在密码,可使用爆破zip压缩包密码的工具进行爆破。
image.png
使用linux的unzip解压失败,放在windows上进行解压,其中2K-mdm-image-mdm9625.yaffs2文件系统。
image.png
使用binwalk解包,解包数据很混乱。
image.png
使用unyaffs解包,目录很清晰。
image.png

参考

https://blog.csdn.net/Homewm/article/details/98055965