概述

binwalk 是简单易用的工具,kali系统已经自带,可以用于分析嵌入式文件和可执行文件,通常用来分析固件镜像。

Github

软件已经被作者devttys0迁移到组织ReFirmLabs中

https://github.com/ReFirmLabs/binwalk

安装

binwalk由于使用的是python编写,可以直接方便的用python标准安装方式

1
$ sudo python setup.py install

详细安装信息,可以参考这篇文章

使用方法

1.扫描文件

1
2
3
4
5
6
7
$ binwalk firmware.bin

DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 TRX firmware header, little endian, header size: 28 bytes, image size: 14766080 bytes, CRC32: 0x6980E553 flags: 0x0, version: 1
28 0x1C LZMA compressed data, properties: 0x5D, dictionary size: 65536 bytes, uncompressed size: 5494368 bytes
2319004 0x23629C Squashfs filesystem, little endian, version 4.0, compression: xz, size: 12442471 bytes, 3158 inodes, blocksize: 131072 bytes, blocksize: 131072 bytes, created: 2014-05-21 22:38:47

2.提取文件

1
$ binwalk -e fireware.bin

3.指令系统分析

1
$ binwalk -A xxx | more

源码分析

binwalk主要是libmagic的python封装

Binwalk的扫描实现方法,就是把重复而复杂的手工分析方法通过程序实现。但是Binwalk并不是简单地使用file命令识别文件类型,原因在于file命令占用了太多的磁盘来读写I/O,效率太低,而且file命令识别文件类型是从文件的第一个字节开始,且只能把磁盘上的一个文件识别成一种文件格式,所以会占用很多磁盘空间来保存文件,此外,使用file命令,就需要逐字节把路由器文件分割成多个文件,文件的I/O也必然会极大影响扫描效率。

  libmagic动态库为文件扫描提供了更好的解决方案。识别libmagic库函数,可以直接扫描文件的内存镜像,从而提高扫描效率。libmagic库识别文件系统和文件类型依然依赖magic签名文件。

  在binwalk中,主要使用来自libmagic库的4个函数,分别为magic_open、magic_close、magic_buffer、magic_load。

  • magic_t magic_open(int flags); —–> 创建并返回一个magic_cookie指针。
  • void magic_close(magic_t cookie); —–> 关闭magic签名数据库并释放所有使用过的资源。
  • const char *magic_buffer(magic_t cookie, const void *buffer, size_t len); ——-> 读取buffer中指定长度的数据并与magic签名数据库进行对比,返回对比结果描述。
  • int magic_load(magic_t cookie, const char *filename); ———> 从filename指定文件加载magic签名数据库,binwalk把多个magic签名文件组合到一个临时文件中用于加载。

  binwalk是使用python编写的,它通过python调用libmagic库中的导出函数并使用面向对象的方式进行封装,封装文件在binwalk/src/binwalk/core/magic.py中。Magic类包含两个成员函数:

  • Magic.buffer(data)函数,读取内存缓冲区数据,判断是否符合某一文件类型。
  • Magic.close()函数:关闭magic签名数据库,释放所有使用的资源。

更多信息参考

wiki


转载请注明来源,https://blog.vicyu.com
由于水平有限,行文难免出错,恳请读者批评指正。