今天在除錯乙個程式時候遇到乙個問題,我下了很多的軟體斷點就是int 3,這當中有的被enable,有的被disable,因為斷點太多了,我不想乙個個手動把enable的斷點,設定成disable,然後在需要的時候,還要再還原回去太麻煩了,我想有沒有什麼快捷的手段呢,一下禁用所有的int 3斷點,而不要去改windbg裡面的斷點列表?
我想到了乙個方法。
int 3 指令是乙個單位元組的指令就是0xcc,當cpu執行到這條指令之後相對應的中斷例程,在windows中就是kitrap03。在這個例程中會去呼叫commondispatchexception,這個函式去做分發並最終通知到偵錯程式。我的做法很簡單就是直接patch這個中斷例程的處理函式讓它直接返回就可以了!
我在windbg裡面我執行如下命令:
kd> !idt -a
dumping idt:
00: 804df50e nt!kitrap00
01: 804df68d nt!kitrap01
02: task selector = 0x0058
03: 804dfaa1 nt!kitrap03 ;---> int 3的中斷處理例程
04: 804dfc24 nt!kitrap04
05: 804dfd89 nt!kitrap05
06: 804dff0a nt!kitrap06
07: 804e0583 nt!kitrap07
08: task selector = 0x0050
09: 804e0988 nt!kitrap09
0a: 804e0aa6 nt!kitrap0a
0b: 804e0be3 nt!kitrap0b
0c: 804e0e40 nt!kitrap0c
----------------------------------
kd> u 804dfaa1
nt!kitrap03:
804dfaa1 6a00 push 0
804dfaa3 66c74424020000 mov word ptr [esp+2],0
804dfaaa 55 push ebp
804dfaab 53 push ebx
804dfaac 56 push esi
----------------------------------
kd> eb 804dfaa1 cf
kd> u 804dfaa1
nt!kitrap03:
804dfaa1 cf iretd ;呵呵,我在這兒直接返回了相當於沒有斷點功能了
804dfaa2 0066c7 add byte ptr [esi-39h],ah
804dfaa5 44 inc esp
804dfaa6 2402 and al,2
804dfaa8 0000 add byte ptr [eax],al
804dfaaa 55 push ebp
----------------------------------
現在應該是沒有軟體斷點的功能了,偵錯程式不會收任何int 3發出的除錯事件了。但是事實上是不是真的這樣呢?
因此,我寫了乙個實驗的程式如下:
這個程式如果正常的情況下中斷到偵錯程式,如果沒有除錯就crash了。但是如果int 3的中斷處理的例程被乾掉了,就是順利的執行下來。
上圖中可以看到int 3斷點沒有起作用。
不過,這樣一來原先下斷點的地方得不到恢復,這種方法不行啊!
對於複雜的斷點列表只能手工匯出,再匯入了,這個方法有點拙!
不過,這樣一搞倒是有反除錯的效果了!
ring3層的偵錯程式就下了軟體斷點反而會crash,ring3層的除錯會被干擾。
嚴格的說這種方法是反下軟體斷點,而且效果還不錯!
真是無心插柳柳真蔭啊!!!
裝置樹使用 3 中斷
中斷說明符是乙個或多個資料單元 由 interrupt cells指定 用於指定裝置所連線的中斷輸入。大多數器件只有乙個中斷輸出,如下例所示,可以在器件上有多個中斷輸出。中斷說明符的含義完全取決於中斷控制器裝置的繫結。每個中斷控制器可以決定唯一定義中斷輸入所需的單元數。以下 為我們coyote s ...
S3c2440中斷學習
中斷功能在微控制器上一直在用,今天學習在2440上用外部中斷的方式,實現按鍵檢測功能。1.中斷生命週期 中斷源,中斷過濾,中斷處理 1.1 中斷源 2440有60個中斷源。1.2 中斷過濾 有兩個關卡,submask和mask,中斷方式有mode控制。1.3 中斷處理 非向量方式 2440 向量方式...
生活品質 斷捨離Day3
說明 這是乙個 斷捨離 的踐行特訓營 我們需要幾天的時間 讓自己變得更加簡單,也更加幸福 我們一日三清理,清理的 不僅是灰塵,還有心情 每一天都有新的挑戰,新的作業。day3挑戰 感受分享 以前的圖都不敢上啊,因為實在是太亂了。今天 讓自己的桌子 變得簡單 整潔 整潔 從現在開始,不再是計畫中,而是...