環境 win7x64 Microsoft Windows [版本 6.1.7601]
也是一個朋友 HOOK IDT 測試 問我IDT爲啥總是藍屏。結果是由於swapgs問題。 若是你知道swapgs做用。或者 在IDT swapgs起到的做用 就不用往下看了。函數
給我朋友解釋了 結果他仍是不理解。。。因此寫個文章吧。 但願能夠幫到其餘朋友測試
咱們先來分析下IDT的函數開發spa
圖1blog
圖2開發
圖3class
圖1 是 KiDebugTrapOrFault 函數頭內容 IDT 0x1test
圖2 是 KiBreakpointTrap 函數頭內容 IDT 0x3原理
圖3 是 KiPageFault 函數頭內容 IDT 0x0Ebug
咱們經過對比能夠發現 函數頭是同樣的。im
nt!KiPageFault:
fffff800`03e77a00 55 push rbp
fffff800`03e77a01 4881ec58010000 sub rsp,158h
fffff800`03e77a08 488dac2480000000 lea rbp,[rsp+80h]
fffff800`03e77a10 c645ab01 mov byte ptr [rbp-55h],1
fffff800`03e77a14 488945b0 mov qword ptr [rbp-50h],rax
fffff800`03e77a18 48894db8 mov qword ptr [rbp-48h],rcx
fffff800`03e77a1c 488955c0 mov qword ptr [rbp-40h],rdx
fffff800`03e77a20 4c8945c8 mov qword ptr [rbp-38h],r8
fffff800`03e77a24 4c894dd0 mov qword ptr [rbp-30h],r9
fffff800`03e77a28 4c8955d8 mov qword ptr [rbp-28h],r10
fffff800`03e77a2c 4c895de0 mov qword ptr [rbp-20h],r11
fffff800`03e77a30 f685f000000001 test byte ptr [rbp+0F0h],1 這裏進行了判斷 若是等於1 則跳轉 不須要執行swapgs
fffff800`03e77a37 7474 je nt!KiPageFault+0xad (fffff800`03e77aad)
fffff800`03e77a39 0f01f8 swapgs
swapgs的做用是交換gs段基址 咱們知道。在R3下 GS指向的是 TEB環境塊(x86 是fs) 在R0下 GS指向 _KPCRB 當前CPU結構.
所以當R3觸發了IDT中斷的時候須要切換gs 才能繼續執行。不然就會致使咱們親愛的 藍大媽。 原理就是這樣。
那麼咱們HOOK IDT的時候。聰明的人應該已經想到 咱們也須要使用函數頭 下面是一個簡單的 HOOK PageFault例子(IDT 0xE)
CODE DebugTrap proc push rbp sub rsp,158h lea rbp,[rsp+80h] test byte ptr [rbp+0F0h],1 je LabelKernel swapgs LabelKernel: .......... //這裏就是你自定義的一些代碼 test byte ptr [rbp+0F0h],1 je LabelKernelEnd swapgs LabelKernelEnd: add rsp,158h pop rbp DebugTrap endp END
好了。到此結束。。祝你們好運 Good Luck.
狂客原創,轉載請註明。侵權必究 做者:狂客 QQ:214109721