這裡介紹如何使用 Vim 結合 xxd
指令,將資料以 16 進位的方式表示,編輯二進位檔案。
Vim 編輯器除了可以編輯文字檔之外,也可以作為 16 進位編輯器(hex editor),編輯二進位(binary)的檔案,只不過在編輯二進位檔案時,要配合 xxd
這個外部指令將資料轉換為 16 進位的排版格式,以下是利用 Vim 編輯一個二進位執行檔的操作步驟。
a.out
執行檔作為示範。
Step 2
在 Vim 中輸入 :%! xxd
,然後按下 Enter 鍵。
這裡的冒號 :
是進入 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 進位的排版格式,這時候就可以查看或編輯二進位檔案的內容了。
Step 4
若要將編輯過後的內容轉換回二進位格式,則在 Vim 中輸入 %! xxd -r
,原理跟前面的轉換大同小異,只不過現在是乎叫 xxd -r
將 16 進位的排版格式轉換回二進位的原始資料。
Step 5
轉換回二進位的資料之後,若要存檔的話,就按照一般的 Vim 操作輸入 :w
即可。
以上就是最簡單的 Vim 16 進位編輯器操作,這個方法對於 Linux 或 Mac OS X 都適用。
事實上我們也可以直接從終端機執行 xxd
指令,直接輸出 a.out
的 16 進位資料:
xxd 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 做的事情其實就是使用將資料導給 xxd
指令,靠 xxd
把資料轉換成 16 進位的排版之後,再把資料讀回來,顯示在 Vim 中而已。
參考資料:StackExchange、wikia