HOOK IDT频繁蓝屏(Window 正确 HOOK IDT)

环境 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

相关文章
相关标签/搜索