binwalk 固件分析 逆向工程
概述
binwalk 是简单易用的工具,kali系统已经自带,可以用于分析嵌入式文件和可执行文件,通常用来分析固件镜像。
Github
软件已经被作者devttys0迁移到组织ReFirmLabs中
https://github.com/ReFirmLabs/binwalk
安装
binwalk由于使用的是python编写,可以直接方便的用python标准安装方式
1 | $ sudo python setup.py install |
详细安装信息,可以参考这篇文章
使用方法
1.扫描文件
1 | $ binwalk firmware.bin |
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签名数据库,释放所有使用的资源。
更多信息参考
转载请注明来源,https://blog.vicyu.com
由于水平有限,行文难免出错,恳请读者批评指正。