軟件縱橫談學(xué)習(xí)筆記(1)軟件斷點

int 3指令:

  • 機器碼為1個字節(jié),即0xcc
  • 沒有數(shù)量限制
  • 局限:屬于代碼類斷點,可以讓CPU執(zhí)行到代碼段內(nèi)的某個地址停下來,不適用與數(shù)據(jù)段和I/o空間
  • 原理解釋:在VS中某一處按下F9,實際上是VS在那個位置插入了一條int 3指令(替換了那個字節(jié),替換為cc
一個例子:
image.png

打開掃雷:


image.png
image.png
image.png

X ntdll!*readfile*

image.png

輸入: u ntdll!NtReadFile
ntdll!NtReadFile這個命令可以在上面一個命令里面得到
image.png

在此函數(shù)地址設(shè)一個軟件斷點:


image.png

bp下軟件斷點,bl列出斷點


image.png

讓軟件跑起來:g,可以看到程序加載模塊,然后就開始讀文件了,斷點就命中


image.png

命令k:可以查看因為什么命中!


image.png

利用反匯編指令繼續(xù)查看剛才那個斷點位置:
image.png

調(diào)試器隱藏了int 3,如果非要看,怎么看??

先繼續(xù)g一次,直到:(此時程序跑起來了)


image.png

再打開另外一個WinDbg:

image.png

以非入侵方式打開的話,只能進行只讀操作!(但是這樣夠了)

image.png

反匯編同一個地址:
注意:因為有 int 3指令,故后面的指令被打亂了
Add 的機器碼 00


image.png

小結(jié):

調(diào)試器讓一個程序g(運行)起來的時候,才能 把int 3寫到內(nèi)存里面, 當(dāng)程序執(zhí)行起來碰到這個斷點斷(break)下來的時候,把int 3恢復(fù)成原來的內(nèi)容 ,斷下來的時候看不到int 3,因為調(diào)試器把int 3替換掉的內(nèi)容又恢復(fù)回去,所以我們看到的是原來的指令,g起來的時候,再把這條指令(int 3)寫下去

(我的理解:一開始在某一處下了個軟件斷點,只有在調(diào)試運行的時候才將int 3指令寫到那個剛剛下斷點的地方, 然后程序執(zhí)行起來碰到cc就會斷下來(碰到cc就會觸發(fā)異常),調(diào)試器立即int 3替換掉的內(nèi)容又恢復(fù)回去,所以我們看到的是原來的指令,g起來的時候,再把這條指令(int 3)寫下去)

值得注意的是,內(nèi)存斷點被觸發(fā)后需要將EIP減1,還原內(nèi)存數(shù)據(jù),這樣做是為了什么呢?
E912345678這是一條跳轉(zhuǎn)指令,下了0xcc斷點后變成了這樣:
CC12345678,EIP不減1,CPU會從12345678處繼續(xù)執(zhí)行,這樣下去,指令全部亂套.所以要將EIP減1
將EIP減1后,CPU重CC處執(zhí)行,會繼續(xù)觸發(fā)異常,陷入死循環(huán),所以要將內(nèi)存數(shù)據(jù)還原
但是還原內(nèi)存數(shù)據(jù)之后,這個斷點下一次就不能使用了.
解決的辦法就是恢復(fù)數(shù)據(jù)后觸發(fā)TF斷點,在TF斷點觸發(fā)時將CC重新寫入.

舉個例子:

E9 12345678 ,在這個指令地方下個int 3斷點(軟件斷點)
將int 3指令寫入下斷點的地方,調(diào)試運行的時候剛執(zhí)行完cc這個字節(jié),就觸發(fā)了這個異常,停下來,EIP-1(為什么要減1,如果不減1的話,下次執(zhí)行就從12345678這里開始執(zhí)行了,顯然這是不行的!),同時,調(diào)試器立即int 3替換掉的內(nèi)容又恢復(fù)回去,運行起來的時候,再把這條指令(int 3)寫下去

注意:int3 是陷阱異常,陷阱異常就是當(dāng)指令執(zhí)行之后才會產(chǎn)生異常,因此,int3異常產(chǎn)生之后,eip就是已經(jīng)執(zhí)行了int 3指令之后的eip了,因此收到調(diào)試事件之后,需要將EIP減1,才能得到異常真正產(chǎn)生異常的地址;
在下軟件斷點之前,先讀取一個字節(jié)的內(nèi)存保存起來,再寫入0xCC,執(zhí)行完CC字節(jié)之后,產(chǎn)生異常,引發(fā)中斷,中斷之后,需將原先的一個字節(jié)的數(shù)據(jù)寫回內(nèi)存中,再將EIP-1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評論 25 708
  • Lua 5.1 參考手冊 by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,907評論 0 38
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,981評論 19 139
  • 和最美的夕陽一起消失在世界的盡頭。
    小耳朵嬋閱讀 178評論 0 0