Debug指令完整教學

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,觀看其執行的狀況。



參考資料

http://thestarman.pcministry.com/asm/debug/debug.htm#9x

0%