[DOS/Windows] 使用 debug 指令產生簡單的二進位檔案
今天臨時在 Windows 上面需要產生一個小的二進位 (binary) 檔案,
當然如果手上有 HexEdit 或 UltraEdit 的話會很容易,
不過問題是那台 Windows 虛擬機器很陽春,
幾乎什麼都沒有,有什麼比較簡單的方法呢?
這時想到了很久以前學組合語言時用過的 debug 指令~
debug 指令在每台 DOS/Windows 機器上都有,因此一定可以用~
1. 在命令列視窗中執行 debug
執行之後會進到 debug 程式的畫面中,鍵入 ? 可以看一下支援的指令:
C:\>debug -? assemble A [address] compare C range address dump D [range] enter E address [list] fill F range list go G [=address] [addresses] hex H value1 value2 input I port load L [address] [drive] [firstsector] [number] move M range address name N [pathname] [arglist] output O port byte proceed P [=address] [number] quit Q register R [register] search S range list trace T [=address] [value] unassemble U [range] write W [address] [drive] [firstsector] [number] allocate expanded memory XA [#pages] deallocate expanded memory XD [handle] map expanded memory pages XM [Lpage] [Ppage] [handle] display expanded memory status XS
2. 填入資料
執行 e 100 就可以在位址 100h 的地方開始填入資料…
這邊的 100h 其實是很久以前的 MS-DOS 時代,.COM 檔的起始位址。
.COM 檔算是沒有檔頭的執行檔,因此我們現在就是把想填的值,
填到 100h 開始的地方,最後再把填好的部分儲存成檔案就行了~
-e 100 0B20:0100 31.41 32.42 33.43 34.44 35.45
當執行 e 100 之後,debug 程式會跳出目前在 100h 位址的值 (本例中是 31),
不要管它是什麼,只要輸入想要的值 (以十六進位表示) 就行了,
像我想輸入 ABCDE 五個字元,相對應的十六進位是 41 42 43 44 45,
在輸入 41 之後按空白鍵,就會跳到下一個位址 (101h),
再輸入 42 後再按空白鍵,依此類推,將所有的值都填好~
3. 儲存成檔案
要儲存檔案時,需要用指令 n 先指定檔案名稱:
-n test.bin
接著設定檔案的長度,debug 會用 cx 這個暫存器儲存的值當作要寫入的長度,
執行 r cx 可以看目前的設定,也可以修改,
本例中因為輸入了五個字元,因此將 cx 暫存器設定成 5:
-r cx CX 0000 :5 -r cx CX 0005
再執行 w 指令寫入,後面的參數代表要從哪個位址開始讀資料,
寫入的長度就是 cx 設定的值~
都成功的話,執行 q 就可以離開:
-w 100 Writing 00005 bytes -q
4. 檢查剛寫好的二進位檔案
用 dir 可以看到剛剛寫出來的檔案,大小確實是 5 bytes,
而內容也的確是我們寫入的 ABCDE:
C:\>dir test.bin Volume in drive C has no label. Volume Serial Number is 3A53-E7A7 Directory of C:\ 02/02/2015 10:33 PM 5 TEST.BIN 1 File(s) 5 bytes 0 Dir(s) 5,944,954,880 bytes free C:\>type test.bin ABCDE
這個例子只是為了 demo 方便,因此寫入了一個可見的字串 ABCDE…
要用 debug 寫出一個包含不可見字元的二進位檔是可以的喔~~
手上沒有好用工具的話,湊和著還是可以用的啦 ^^