2012-07-22 54 views
0

我有一個程序在運行時修改自己的代碼。 當我試圖在代碼中設置斷點時,它從不中斷,因爲 代碼的修改會以某種方式刪除斷點。Gdb在自修改代碼中切換斷點

我聽說過硬件斷點,但它寫在gdb中,他們不支持我的硬件。有沒有其他的方式來打破自修改代碼?

+0

您可以更改您的代碼生成器,以便生成破解指令。 – 2012-07-22 15:30:11

回答

1

GDB有兩種放置斷點的方式。一種是通過設置特定的特殊寄存器來指示CPU執行中斷時產生中斷(內核然後轉換爲調試器的信號)。這些就是GDB所說的「硬件斷點」。如果您的硬件不支持它們,則不支持它們。

另一種方法是實際修改代碼,並用提升中斷的命令替換要中斷的行的第一條指令。例如,在Intel X86下,引發中斷的命令(例如「int 5」)是兩個字節長,但引發中斷3的命令只有一個字節長。這是爲了達到這個目的。

調試器將指令替換爲中斷指令,一旦中斷點被觸發,將代碼替換爲調試器干擾之前的代碼。是的,這種技術不適用於自我修改代碼(也不適用於只讀存儲器中的代碼,例如寫入閃存)。

如果你的代碼是有序的(顯然它不是特別有序),你可以在代碼寫入內存後立即中斷一次,然後在正確的位置放置第二個中斷點。如果您足夠努力地學習GDB的腳本功能,您甚至可以自動完成這一功能,這樣您就不會爲第一個中斷點而煩惱。總而言之,如果你正在編寫自我修改代碼,那麼你已經走過了一條走不通的道路。祝你好運。你將需要它。

Shachar