ello大家好,我是程序員cxuan!這篇文章我們來進行實際操作一下Debug。
我們以后將會用到很多 Debug 命令,這里我們先來熟悉一下它們。
Debug 是 Windows / Dos 操作系統提供的一種功能。使用 Debug 能讓我們方便查看 CPU 各種寄存器的值、內存情況,方便我們調試指令、跟蹤程序的運行過程。
接下來我們會用到很多 debug 命令,但是使用這些命令的前提是,你需要在電腦上安裝一下 debug,Windows/Mac 都可以安裝,獲取鏈接我已經給你找出來了。阿,忘記說了,我們這里使用的是 Dos box來模擬匯編的操作環境。
傳送門(Mac 和 Windows 都是):https://www.dosbox.com/download.php?main=1
下載完成后打開 DosBox ,打開之后是這樣的。
此時我們輸入 debug 命令應該提示的是
因為我們還沒有進行連接和掛載,此時我們執行
mount c D:\debug
執行這條命令時,你需要現在 D 盤下創建一個 debug 文件夾,然后我們掛載到 debug 下面。
并且執行 C: 切換到 C 盤路徑下。
此時我們就可以執行 debug 命令了。
這里需要注意一點,我在 Windows 10 系統下搭建 Debug 環境時,在掛載完成后輸入 debug ,還是提示 Illegal command:debug ,此時你需要再下載一個 debug.exe ,貼心的我也把下載地址給你了。
下載地址:https://pan.baidu.com/s/177arSA34plWqV-iyffWpEw#list/path=%2F 密碼:3akd
需要下載里面的 debug.exe,然后把它放在你掛載的路徑下,這里我掛載的路徑時 D 盤下的 debug 文件夾。
放置完成之后,再輸入 debug 就可以了。
因為每次打開 Dosbox 都會執行上面這些命令,真的好煩,那怎么辦呢?一個簡單的辦法是在 Dosbox 安裝路徑下找到
打開之后,在末尾鍵入
就 OK 了,下次直接打開 Dosbox ,會默認執行這三條命令,至此,就是我搭建 Dosbox 遇到的所有問題了。
玩兒匯編得學會用 Debug ,Debug 是一種調試程序,通過 Debug 能讓我們能夠看到內存值,跟蹤堆棧情況,看到寄存器所暫存的內容等,同時也能夠更好地幫助我們理解匯編代碼,所以學會 Debug ,非常重要,這是一種不可或缺的動手能力。
下面我們會用到幾種 Debug 命令,這里先簡單介紹下。
Debug 命令有很多,不過常用的一般就上面這幾個。
好了,現在我們直接進入正題,開始在 Dosbox 上正式進行 Debug 操作,首先打開 Dosbox。
嗯。。。。。。這個界面我們打開很多次了。
那我寫個命令呢?好吧,沒演示過,下面就來了!
親,用 Debug -r 就可以查看和修改 CPU 寄存器內容了呢。
查看寄存器內容。
這里需要注意一下 -r 大小寫的問題,Debug -r 是查看寄存器內容。而 -R 則是無效指令。
上圖列出來了很多寄存器,你可能覺得無從下手,不要亂,我們先從最基本的開始入手,也就是 CS 和 IP,CS(Code Segment)是代碼段寄存器,一般也被稱為段基址,可以認為是程序訪問的入口,CPU 需要從 CS 中找到從哪個位置開始取指執行,但是我們還不知道要取哪一段,這時候 IP 的作用就體現出來了,IP(Instruction Pointer)就是指令指針寄存器,也叫做偏移地址,它會告訴我們從段基址開始,取哪一段的地址。
可以使用段基址:偏移地址來確定內存中的指定地址。
這里我們只是簡單聊一下這兩個寄存器的概念,要了解這兩個寄存器的具體作用,可以看筆者的上一篇文章
使用 -r 也能夠修改寄存器的內容,如下所示
-r 一般的格式是 -r 寄存器,然后系統會進行冒號提示,后面就是你要修改的內容。
使用 -d 指令可以查看內存中的內容。
輸出的內存值默認是按照 CS:IP 的地址開始的,由于 CS 的值默認是 073F,而 IP 默認是 0100,所以 -d 的內存值是 073F:0100 。
-d 的格式很多,下面只介紹一下常用的幾種格式。
形似 -d 1000:0 這種 -d 段基址 偏移地址的格式可以產生如下輸出。
如上圖所示,Debug 會列出指定內存單元中的的內容。上圖中的每一個 00 都表示 8 位,如果是 4A,那么這八位展開來說就是 0010 1011 。每一行有 16 個 8 位,所以構成了 128 位內存地址。
為什么都是 00 呢,因為內存單元的值沒有被改寫,說白了就是這塊內存區域沒有存值,如何改寫我們后面會說。
每一行的中間都有一個 -,這個是為了便于我們閱讀來設置的,- 號前后都有 8 個內存單元,這樣便于查看。
右側幾個 ...... 表示每個內存單元可顯示的 ASCII 碼字符,因為內存沒有值,所以也沒有對應的 ASCII 碼。我們可以數一下,每行有 16 個 . ,這表示每一個 00 都對應了一個 ASCII 碼。
我們可以使用 -d 1000:9 這種 -d 段基址:起始偏移地址 格式來顯示從 1000 的第幾位開始。
Debug 從 1000:9 開始,一直到 1000:88,一共是 128 個字節,第一行中的 1000:0 ~ 1000:8 中的內容沒有顯示。
還可以使用 -d 1000:0 9 這種 -d 段基址:起始偏移地址 結尾偏移地址的格式來輸出。
還可以是使用 -d 偏移地址來在不指定段基址的情況下,查看內存值。
上面說的都是查看內存中指定位置或者區域的值,下面我們要來改寫一下內存值。
使用 -e 可以改寫內存值,比如我們想要改寫 1000:0 ~ 1000:f 中的內容,可以使用 -e 1000:0 0 1 2 3 4 5 6 7 8 9 0 a b c d e f 這種方式,如下圖所示。
這里需要注意下,在進行 -e 改寫的時候,每個值中間都有一個空格,如果沒有空格的話,會當做一個內存值來看待。
然后用 -d 1000:0 看到我們剛改寫的內存值。
還可以使用提問的方式來逐個修改從某一地址開始的內存單元的內容。
還是用 1000:100 來舉例子,輸出 -e 1000:100 后按下回車鍵。
如上圖所示,可以看到我們先輸入了一次 -e 1000:100 這個指令,然后按下了回車鍵。
注意,如果這里你按下了回車鍵,就相當于整個 -e 改寫的過程已經完成。
如果你想要繼續改寫后面內存中的值,你需要按下空格鍵。
我們改寫了 1000:100 之后的內存值,然后使用 -d 1000:100 查看我們改寫的內容是否生效。
-e 命令還可以支持寫入字符,比如我們可以向 1000:0 這個位置開始寫入數值和字符,-e 1000:0 1 'a' 2 'b' e 'c' 。
如上圖所示,當我們向內存寫入字符 'a' 'b' 'c' 的時候,會自動轉換為 ASCII 碼進行存儲,在最右側可以找到剛剛寫入的字符。
如何向內存中寫入一段機器碼呢?比如我們想要在內存中寫入一段機器碼。
我們可以使用 -e 來進行寫入,向內存中寫入 b8 01 00 b9 02 00 01 c8 這個機器碼,如下所示
我們使用 -e 寫入之后,使用 -d 查看內存值,可以發現我們剛剛寫入的值,但是卻看不到機器碼,所以機器碼該如何看呢?
別急,還有個 -u 命令,這個就是看機器碼的,如下圖所示,我們使用 -u 命令顯示我們寫入的機器碼。
可以看到 1000:0000 ~ 1000:0006 這個內存地址使我們寫入的機器碼,-u 這個命令就是將內存單元的內容翻譯為匯編指令并顯示。
-u 輸出的結果分為三部分顯示:
1000:0 處存放的是寫入的機器碼 B8 01 00 組成的機器指令,對應的匯編指令是 MOV AX,0001。
1000:0003 處存放的是寫入的機器碼 B9 02 00 組成的機器指令,對應的匯編指令是 MOV CX,0002。
1000:0006 處存放的是寫入的機器碼 C1 C8 所組成的機器指令,對應的匯編指令是 add ax,cx。
上面介紹的一系列指令包括我們上面提到的 Debug -e 機器碼都是向內存中進行寫入,那么如何執行這些指令呢?
我們可以使用 Debug -t 來執行寫入的指令。使用 Debug -t 可以執行由 CS:IP 指向的指令。
既然是 -t 能夠執行從 CS:IP 指向的命令,所以我們有必要將 CS:IP 指向 1000:0(因為我們前面將指令寫在了 1000:0 處)。
首先我們需要執行 -r cs 1000 ,-r ip 0 把 CS:IP 賦值為 1000:0。
然后執行 -t 指令,下圖是已經執行過的指令截圖。
可以看到,執行完 -t 指令之后,MOV AX,0001 這條指令被執行,當前 AX 寄存器的內容變為了 0001,這條匯編指令的意思就是把 0001 移動到 AX 寄存器中。
繼續執行 -t 之后,我們可以看到寄存器的變化。
畢竟機器指令不是那么好懂,寫入很不方便,所以有沒有辦法能夠支持我們直接寫入匯編指令呢?還真有,Debug 提供了 -a 這種方式來實現匯編指令的寫入。如下圖所示
可以看到,我們使用了 -a 命令來對 1000:0 進行寫入,分別輸入 mov ax,1 mov bx,2 mov cx,3 add ax,bx add ax,cx add ax,ax 指令,然后按回車進行確定執行。
我們使用 -d 1000:0 f 可以看到從偏移地址 0 處開始的第 f 個內存指令(因為最大寫入的地址只是 f)。
上圖中的 1000:000F 為什么有值呢,因為我們上面已經執行過這個寫入了。
另外,使用 -a 可以從一個預設的地址處開始輸入指令。
今天和大家聊了一下 Debug 的基本用法,主要包括
匯編指令的選項有很多,上面介紹的這些屬于經常用到的指令,這些指令要能夠熟練使用。
IT之家 6 月 8 日消息,根據國外科技媒體 borncity 報道,繼 OneDrive 導致 Win10、Win11 臨時文件夾出現大量 Aria-debug-xxx.log 文件之后,再次發現 Office Click-to-Run 服務導致了類似的問題。
該媒體在發布 Aria-debug-xxx.log 文件問題之后,再收到用戶反饋,稱 TEMP 系統臨時文件夾下出現了大量以計算機名稱為前綴的 yyyMMdd-hhmm.log 日志文件。
IT之家翻譯用戶反饋內容如下:
我發現 Aria-debug-xxx.log 文件之外,我還發現了大量 Computername-yyyMMdd-hhmm.log 日志文件,每天創建 25-35 個文件,基本上開機 5 分鐘后開始創建,之后每隔 30-45 分鐘創建。
該媒體深入挖掘之后,發現在 7 年前,網友就曾反饋過這個問題,并基本確認是 Microsoft Office ClickToRun Service (ClickToRunSvc) 導致的。
Click-to-Run 能夠自動下載并安裝 Office 軟件的組件及其補丁程序,可以大大縮短 Office 程序在線下載、安裝和升級的時間。