1. 程式人生 > >自動提取文件系統---binwalk(一)

自動提取文件系統---binwalk(一)

程序實現 影響 buffer 但是 結果 src c庫 占用 oid

Binwalk是路由器固件分析的必備工具,該工具最大的優點就是可以自動完成指定文件的掃描,智能發掘潛藏在文件中所有可疑的文件類型及文件系統。

1、Binwalk和libmagic

  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。

  1. magic_t magic_open(int flags); -----> 創建並返回一個magic_cookie指針。
  2. void magic_close(magic_t cookie); -----> 關閉magic簽名數據庫並釋放所有使用過的資源。
  3. const char *magic_buffer(magic_t cookie, const void *buffer, size_t len); -------> 讀取buffer中指定長度的數據並與magic簽名數據庫進行對比,返回對比結果描述。
  4. int magic_load(magic_t cookie, const char *filename); ---------> 從filename指定文件加載magic簽名數據庫,binwalk把多個magic簽名文件組合到一個臨時文件中用於加載。

  binwalk是使用python編寫的,它通過python調用libmagic庫中的導出函數並使用面向對象的方式進行封裝,封裝文件在binwalk/src/binwalk/core/magic.py中。Magic類包含兩個成員函數:

  1. Magic.buffer(data)函數,讀取內存緩沖區數據,判斷是否符合某一文件類型。
  2. Magic.close()函數:關閉magic簽名數據庫,釋放所有使用的資源。

2、Binwalk的提取與分析

2.1、固件掃描

  命令:binwalk firmware.bin -----> 通過掃描能夠智能地發現目標文件中包含的所有可識別的文件類型。

2.2、提取文件

  命令:binwalk -e firmware.bin ------> 選項“-e"和“--extract"用於按照定義的配置文件中的提取方法從固件中提取探測到的文件系統。

  命令:binwalk -Me firmware.bin -----> 選項“-M"和“--matryoshka"用於根據magic簽名掃描結果進行遞歸提取,僅對"-e"和“--dd"選項有效。

  命令:binwalk -Me -d 5 firmware.bin ----> 選項“-d"和“--depth=<int>"用於限制遞歸提取深度,默認深度為8,僅當“-M"選項存在時有效。

2.3、顯示完整的掃描結果

  命令:binwalk -I firmware.bin ------> 選項"-I"和“--invalid"用於顯示掃描的所有結果(即使是掃描過程中被定義為“invalid“的項)。

      當我們認為binwalk錯把有效的文件當成無效文件時,可以通過該選項來檢查。

2.4、指令系統分析

  選項“A"和“--opcodes"用於掃描指定文件中通用CPU架構的可執行代碼。

  由於某些操作碼簽名比較短,所以比較容易造成誤判。如果我們需要確定一個可執行文件的CPU架構,可以使用該命令。

  命令:命令:binwalk -A 70|more

  使用Binwalk掃描從firmware.bin中提取的文件的文件“70”中的可執行代碼,在該文件中可以發現CPU的架構(大端或者小端也會給出)。

自動提取文件系統---binwalk(一)