0x01 背景
Debug是DOS和Windows裡面專門調試程序以及讓你在電腦上編寫匯編語言一種工具。一般上,我們可以使用它,來查看CPU各種寄存器中的內容、內存的情況和在機器碼級跟蹤程序的運行。而Debug指令只能在這些版本的Windows內使用:Windows® 9x/Me,Windows® NT/2000/XP/2003。而在之後版本的Windows就再也無法使用這個指令了。Debug最初的設計是用來處理.最大容量可達到65280 (6xx1024-256)bytes或少於此大小的.COM文件。而至於少過多少,那就得取決於程序必須在堆棧上同時放置的最大字節數。為什麼一定要減掉256字節呢?那是因為DEBUG經常使用從00到FF十六進制偏移量的區域來存儲一些內部數據,例如加載的文件的名字。所以.COM程序應該只能是用在單個內存段裡面(只有64 KiB)。
這裡先簡單介紹會用到的Debug指令的Option。
-r
查看、改變CPU寄存器的內容-d
查看內存中的內容-e
改寫內存中的內容-u
將內存中的機器指令翻譯成匯編指令-t
執行一條機器指令-a
以匯編指令的格式在內存中寫入一條機器指令。
0x02 Debug指令的使用。
P/s:本教程會以Windows2000作為例子。
要使用Debug這個指令,你需要在CMD中輸入debug,之後你就可以開始使用各種Debug相關的指令。先用-r
來查看各個寄存器的當前情況吧。
然後我們試試看用-r 寄存器
來修改他們的值吧。輸入-r ax
,在出現:
後輸入1111,你的AX就會等於1111。
現在的CS:IP為0AD8:0100。而你也可以看到機器碼顯示的位址為D3990075。輸入-r ip
,再把IP修改成200。
最後輸入-r cs
把CS修改成ff00。
現在我們要用-d
指令來看內存中的內容。以下例子為0AD8H處的內容。輸入後,你可見到這個指令列出了0AD8:0200到0AD8:027F的完整內容。
格式為-d 段地址:偏移地址
從圖來看左邊顯示的是每行的起始地址。最右邊對應的就是顯示的ASCII碼字符。現在我們再看另一個例子,這次我們會使用-e
改寫內存中的內容。輸入後看到的結果如下:
現在,我們來學一下怎樣用-e
指令來寫入機械碼。假設我們要輸入以下的機械碼。然後再使用-u
查看你刚刚輸入的機械碼和對應的匯編指令。
機械碼 | 所對應的匯編指令 |
---|---|
b8 01 00 | mov ax,0001 |
b9 02 00 | mov cx,0002 |
01 c8 | add ax,cx |
在使用-t
去執行我們剛剛寫入的指令前我們必須先確認CS:IP已經指向了1000:0。你們可以看到下圖所示,我用了-r
把CS:IP指到我要的位址去。
現在可以輸入-t
指令,你可以看到指令mov ax,0001
被執行了,而此時ax也變成了1,IP變成了0003,因為這個指令共用了3個字節。
繼續用-t
指令看看接下去的變化吧。
由於使用-e
一個一個輸入機器代碼實在太麻煩了,所以你可以用-a
這個Option来讓你直接輸入匯編指令,而不是機械代碼。比如說下面我就從CS:IP=1000:0那邊開始輸入我的匯編指令。要結束你的輸入只需要在給出的起始地址後按Enter鍵就行了。
0x03 Debug指令的功課
Task A
请用-e
和-a
输入下表提供的機械碼和匯編語言
機械碼 | 所對應的匯編指令 |
---|---|
b8 20 4e | mov ax,4E20H |
05 16 14 | add ax,1416H |
bb 00 20 | mov bx,2000H |
01 d8 | add ax,bx |
89 c3 | mov bx,ax |
01 d8 | add ax,bx |
b8 1a 00 | mov ax,001AH |
bb 26 00 | mov bx,0026H |
00 d8 | add al,bl |
00 dc | add ah,bl |
00 c7 | add bh,al |
b4 00 | mov ah,0 |
00 d8 | add al,bl |
04 9c | add al,9CH |
-e
指令的執行
再用-t
,觀看其執行的狀況。
-a
指令的執行
再用-t
,觀看其執行的狀況。