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