2012-12-06 108 views
2

我目前就讀調試器。我讀過的調試器具有軟件斷點(apparently這些是最常用的斷點)。這些工作通過INT 3(操作碼的0xCC)替換操作碼的第一個字節。調試器:軟斷點

我讀過一個程序的文本(/代碼)段是隻讀的(如果這部分不必只讀什麼是停止代碼來修改自己的指令,自修改代碼)。我的問題是調試器在只讀時如何修改指令。我在這裏錯過了什麼。對此的任何評論或對此理論的指向都會受到讚賞。

謝謝。

+1

有一些調試器,其能夠在調試期間修改代碼。例如Visual Studio。我會懷疑你沒有修改指令,但是這些指令所引用的值 – 2012-12-06 15:43:54

回答

1

在Windows臺式機和服務器平臺上,內存頁面保護可以通過由kernel32.dll導出的函數VirtualProtect的改變。因此,例如,如果調試器想要在某個地址寫入0xcc,但該地址駐留在標記爲只讀的頁面中,那麼調試器可以將該頁面的保護設置爲讀寫(假設它具有足夠的權限),然後寫入值。

這樣做的一個副作用是它會導致該頁內​​存中的寫入時複製(COW)錯誤,現在惡意進程將擁有它自己的頁面實際副本。這可以防止在共享該物理頁面的所有進程中設置斷點。