1. 程式人生 > >MacOs/Liunx主機搭建windows平臺雙機除錯環境

MacOs/Liunx主機搭建windows平臺雙機除錯環境

## 0x00 前言 本文的主要試用物件是Mac OS/Linux使用者,對於想除錯windows核心相關的一些東西時,需要搭建雙機除錯環境的一些記錄。另外對於本機是windows的使用者也完全試用,windows搭建雙機環境是會更簡單一些,但是基本是一樣的。 ## 0x01 測試環境 > * VMware 15 > * windows 7 x86 –> 除錯機 > * windows xp –> 被除錯機1 > * windws 7 x86 –> 被除錯機2 > * Ubuntu 18.04 –> 物理機 > * windbg –> 偵錯程式 ## 0x02 環境搭建 環境搭建的核心主要在虛擬機器的設定上,這塊設定好了,後面就會比較順利。 ### 1.虛擬機器的配置 虛擬機器的安裝在這裡就不在敘述,安裝好虛擬機器以後,我們開啟`virtual machine settings–>Add–>serial port–>finish`,如下圖所示
![](https://img2020.cnblogs.com/blog/1278763/202010/1278763-20201018220411865-89817536.png)
隨後我們選擇`Use socket(named pipe)`選項,這裡需要輸入一個檔案的位置來做socket連線的轉儲,相當於除錯資訊轉存的中轉站,這裡只需要指定就可以,稍後會自動在所設定目錄自動建立檔案,我這裡是`com1`檔案,這裡需要特別說明一下,在設定虛擬機器的串列埠指定`com1`還是`com2`這取決於`serial port的埠號`是幾,預設情況下虛擬機器添加了印表機 `print`,所以此處預設埠為`2`,我在測試時使用`com2`沒成功,刪除了虛擬機器的印表機後,使用的`com1埠`可以成功。這臺虛擬機器是xp,是作為被除錯機用的,所以我們選擇`server`,接著勾選`I/O Mode`,使此虛擬機器支援cpu中斷,如下圖所示
![](https://img2020.cnblogs.com/blog/1278763/202010/1278763-20201018220903538-187380177.png)
接著設定除錯機,基本和上面的設定一樣,區別是,這次是選擇`client`,不勾選`I/O Mode`選項,如下圖所示
![](https://img2020.cnblogs.com/blog/1278763/202010/1278763-20201018221004108-573136214.png)
Ok,到這裡虛擬機器的設定就完成了,接下來是被除錯機的設定,我們開啟被除錯機 ### 2.被除錯機的設定 這裡先拿xp來說一下,windows7及以上的系統設定和xp略有不同,稍後會敘述.開啟被除錯機,`win+R`鍵入`c:\boot.ini`開啟系統啟動配置.然後新增一行配置,如下 ```powershell [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional debug" /debug /debugport=com1 /baudrate=115200 /fastdetect ```
![](https://img2020.cnblogs.com/blog/1278763/202010/1278763-20201026165800211-761845107.png)
這裡的`debugport`需要和剛才設定的檔案的名字一樣,這裡也是指定我們選中的序列介面。`baudrate`預設為`115200`,然後ctrl+s儲存,再次重啟就會多出一個支援除錯的啟動選項.如圖
![](https://img2020.cnblogs.com/blog/1278763/202010/1278763-20201026223537476-1443140244.png)
Windows Vista之後的系統,不在使用`BOOT.INI`檔案,改為了使用`Coot Configuration Data`,其配置的原理也大同小異,下面以windows 7為例子,做一個示範 ```powershell C:\Windows\system32>bcdedit.exe /copy {current} /d "windows 7 Debug with Serial" #複製當前的啟動入口 已將該項成功複製到 {2bd58bb9-12d9-11eb-b328-b016eb5db92e}。 C:\Windows\system32>bcdedit.exe /debug {2bd58bb9-12d9-11eb-b328-b016eb5db92e} on #啟動入口啟動核心除錯 操作成功完成。 C:\Windows\system32>bcdedit /dbgsettings serial DEBUGPORT:1 BAUDRATE:115200 #serial表示使用串列埠,對應上面xp的com1 操作成功完成。 C:\Windows\system32>bcdedit /dbgsettings #檢查上述的設定 debugtype Serial debugport 1 baudrate 115200 操作成功完成。 C:\Windows\system32>bcdedit #檢視Windoes的啟動入口 Windows 啟動管理器 -------------------- 識別符號 {bootmgr} device partition=C: description Windows Boot Manager locale zh-CN inherit {globalsettings} default {current} resumeobject {2bd58bb5-12d9-11eb-b328-b016eb5db92e} displayorder {current} {2bd58bb9-12d9-11eb-b328-b016eb5db92e} toolsdisplayorder {memdiag} timeout 30 Windows 啟動載入器 ------------------- 識別符號 {current} device partition=C: path \Windows\system32\winload.exe description Windows 7 locale zh-CN inherit {bootloadersettings} recoverysequence {2bd58bb7-12d9-11eb-b328-b016eb5db92e} recoveryenabled Yes osdevice partition=C: systemroot \Windows resumeobject {2bd58bb5-12d9-11eb-b328-b016eb5db92e} nx OptIn Windows 啟動載入器 ------------------- 識別符號 {2bd58bb9-12d9-11eb-b328-b016eb5db92e} device partition=C: path \Windows\system32\winload.exe description windows 7 Debug with Serial locale zh-CN inherit {bootloadersettings} recoverysequence {2bd58bb7-12d9-11eb-b328-b016eb5db92e} recoveryenabled Yes osdevice partition=C: systemroot \Windows resumeobject {2bd58bb5-12d9-11eb-b328-b016eb5db92e} nx OptIn debug Yes ``` ## 0x03 除錯機的設定 開啟除錯機,安裝好windbg。隨後我們複製一個新的桌面快捷方式,改名字(為了區分原來的快捷方式),然後`右鍵-->屬性-->目標`在後面新增`-b -k com:port=1,baud=115200`圖片如下
![](https://img2020.cnblogs.com/blog/1278763/202010/1278763-20201026232050406-2064002630.png)
![](https://img2020.cnblogs.com/blog/1278763/202010/1278763-20201026232115528-1270255161.png)
這時我們需要重啟被除錯機,進入支援debug的啟動選項,這時我們觀察windbg已經連線到了目標主機,如下圖
![](https://img2020.cnblogs.com/blog/1278763/202010/1278763-20201026232148432-82298558.png)
## 0x04 設定核心除錯用的符號表 在核心除錯下,按`g`可讓目標主機繼續執行,如果想讓目標中斷可選擇偵錯程式的`debug–>Break`選項,即可把控制權交還偵錯程式,隨後我們載入核心除錯需要的符號表,首先需要除錯機聯網,隨後在偵錯程式鍵入`ctrl+s`開啟符號表路徑設定,輸入如下`SRV*c:\symbols* https://msdl.microsoft.com/download/symbols`這裡的意思是告訴偵錯程式,首先去c盤的`symbols`目錄找符號表,如果找不到就聯網到微軟的符號表伺服器遠端下載,下載的檔案同樣會存到`symbols`目錄方便下次使用.所以需要手動到c盤新建一個名字為symbols的空資料夾.隨後在偵錯程式的命令列輸入`.reload /f`重新載入符號表,一般來說第一次都會聯網下載符號表的,下載過程中由於某些檔案變化符號表已經不維護,所以會出現部分找不到的情況,但基本影響不大,如果出現完全不能下載的情況,請參考之前的[文章](https://www.cnblogs.com/Taolaw/p/13789239.html)解決。下載好以後就可以雙機除錯了
![](https://img2020.cnblogs.com/blog/1278763/202010/1278763-20201026232514195-939831734.png)