這裡介紹如何使用 Vim 結合 xxd 指令,將資料以 16 進位的方式表示,編輯二進位檔案。

Vim 編輯器除了可以編輯文字檔之外,也可以作為 16 進位編輯器(hex editor),編輯二進位(binary)的檔案,只不過在編輯二進位檔案時,要配合 xxd 這個外部指令將資料轉換為 16 進位的排版格式,以下是利用 Vim 編輯一個二進位執行檔的操作步驟。


Step 1
使用 Vim 編輯器直接開啟要編輯的二進位檔案,這裡我拿一個 C 語言編譯出來的的 a.out 執行檔作為示範。

Vim 開啟二進位檔

Step 2
在 Vim 中輸入 :%! xdd,然後按下 Enter 鍵。

Vim 使用 xxd 轉換為 16 進位格式

這裡的冒號 : 是進入 Vim 的 command-line mode,跟一般的 Vim 指令相同,例如存檔(:w)等。

百分比符號 % 是指定 ex command-line ranges,代表整個檔案,也就是說將整個檔案內容都進行轉換。

驚嘆號 ! 是指定 filter commands,filter command 是一個可從標準輸入讀取資料,經過一些處理之後,輸出至標準輸出的外部指令,而這裡我們使用 xxd 這一個傾印 16 進位資料的小工具作為 filter command。

Step 3
呼叫 xxd 這一個 filter command 之後,Vim 的內容就會變成 16 進位的排版格式,這時候就可以查看或編輯二進位檔案的內容了。

Vim 16 進位編輯器

Step 4
若要將編輯過後的內容轉換回二進位格式,則在 Vim 中輸入 %! xxd -r,原理跟前面的轉換大同小異,只不過現在是乎叫 xxd -r 將 16 進位的排版格式轉換回二進位的原始資料。

Vim 使用 xxd -r 轉換為二進位資料

Step 5
轉換回二進位的資料之後,若要存檔的話,就按照一般的 Vim 操作輸入 :w 即可。

以上就是最簡單的 Vim 16 進位編輯器操作,這個方法對於 Linux 或 Mac OS X 都適用。

事實上我們也可以直接從終端機執行 xxd 指令,直接輸出 a.out 的 16 進位資料:

xdd a.out
00000000: cffa edfe 0700 0001 0300 0080 0200 0000  ................
00000010: 0e00 0000 d802 0000 8500 2000 0000 0000  .......... .....
00000020: 1900 0000 4800 0000 5f5f 5041 4745 5a45  ....H...__PAGEZE
00000030: 524f 0000 0000 0000 0000 0000 0000 0000  RO..............
00000040: 0000 0000 0100 0000 0000 0000 0000 0000  ................
[略]

上面 Vim 做的事情其實就是使用將資料導給 xdd 指令,靠 xxd 把資料轉換成 16 進位的排版之後,再把資料讀回來,顯示在 Vim 中而已。

參考資料:StackExchangewikia