HOOK IDT频繁蓝屏(Window 正确 HOOK IDT)
环境 win7x64 Microsoft Windows [版本 6.1.7601]
也是一个朋友 HOOK IDT 测试 问我IDT为啥老是蓝屏。结果是因为swapgs问题。 如果你知道swapgs作用。或者 在IDT swapgs起到的作用 就不用往下看了。
给我朋友解释了 结果他还是不理解。。。所以写个文章吧。 希望可以帮到其他朋友
我们先来分析下IDT的函数开发
图1

图2

图3

图1 是 KiDebugTrapOrFault 函数头内容 IDT 0x1
图2 是 KiBreakpointTrap 函数头内容 IDT 0x3
图3 是 KiPageFault 函数头内容 IDT 0x0E
我们通过对比可以发现 函数头是一样的。
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
HOOK IDT频繁蓝屏(Window 正确 HOOK IDT)的更多相关文章
- Windows Server 2012 R2蓝屏
最近发现某个医院客户Windows Server 2012 R2 DataCenter的系统频繁蓝屏重启,重启没过一天再一次出现,反反复复折腾好几天,提示信息ntoskrnl.exe.mssmbios ...
- 【转载】Window服务器开机后一直处于蓝色屏幕(非蓝屏 crash)状态
阿里云Windows系统服务器运维的过程中,有时候会遇到实例开机后一直处于蓝色背景屏幕(非蓝屏 crash )状态.此时你发现鼠标可以任意正常移动,但是屏幕上却没有任何的图标可以供操作,这种情况可能是 ...
- 分析Windows的死亡蓝屏(BSOD)机制
这篇文章本来是投Freebuf的,结果没过.就贴到博客里吧,图懒得发上来了 对于Windows系统来说,被人们视为洪水猛兽的蓝屏也是一种有利于系统稳定的机制.蓝屏其实是Windows系 统的一种自查机 ...
- windows蓝屏错误小全
作者:siyizhu 日期:2005-11-27 字体大小: 小 中 大 引用内容 0 0x00000000 作业完成. 1 0x00000001 不正确的函数. 2 0x00000002 系统 ...
- TsFltMgr.sys系统蓝屏的原因就在于QQ电脑管家!
同事一WindowsXP系统,正常执行,关闭后,第二天无法启动,详细症状为: (1)安全模式以及带网络功能的安全模式都能够进入: (2)正常模式,还没出现WindowXP滚动栏就開始重新启动: (3) ...
- TsFltMgr.sys其原因是,该系统蓝屏QQ计算机管理器!
同事一WindowsXP系统,正常执行,关闭后,第二天无法启动.详细症状为: (1)安全模式以及带网络功能的安全模式都能够进入. (2)正常模式.还没出现WindowXP滚动栏就開始重新启动: (3) ...
- map 后 PE 蓝屏原因专题讨论(e820cycles参数)
map 后 PE 蓝屏原因专题讨论(e820cycles参数)http://bbs.znpc.net/thread-6182-1-5.html不点发表于 2011-12-8 11:42:31 大家知道 ...
- windows蓝屏代码大全及常见蓝屏解决方案
对于以下的代码查询建议使用ctrl+F查询,而且很多蓝屏与黑屏的问题多是最近操作引起的,例如更新驱动,安装新的硬件.软件--把相关的配置调到最近的正常状况大多可以解决,确实不行时方可考虑重装系统,解决 ...
- Windows常见蓝屏故障分析
转自Windows常见蓝屏故障分析 症状描述: 当您在运行Microsoft Windows 2000/XP/Server 2003.Microsoft Windows Vista/Server 20 ...
随机推荐
- Seaborn入门
Seaborn入门 Seaborn是基于matplotlib的python数据可视化库,提供更高层次的API封装,使用起来更加方便快捷. displot displot()集成了hist直方图和kde ...
- jmeter接口测试实例7-关联
Jmeter实例7:关联(牛刀小试中登录.金币充值接口) 必须从网上下载这个插件放在lib的ext目录下才可以用,在登录接口添加此插件 Sign是变量名,其实就是下一步充值金币要取的值:路径是从哪里取 ...
- 【二维树状数组】计数问题 @JSOI2009/upcexam5911
时间限制: 1 Sec 内存限制: 128 MB 题目描述 一个n*m的方格,初始时每个格子有一个整数权值.接下来每次有2种操作: 改变一个格子的权值: 求一个子矩阵中某种特定权值出现的个数. 输入 ...
- Lua模块的加载与内存释放
今天早上听说一件事情让我觉得很诡异的事情:公司线上的一款游戏,加载一份配置资源后,内存涨了几十M,然后内存再也下不来了.因为好奇,所以要来了最大的一个配置文件(4.5M,去除空格与换行后的大小),进行 ...
- HRD Emulator in HTML5
Posted on March 21, 2012 by Moto Just like MPEG-2 video uses VBV (Video Buffer Verifier), H.264 stan ...
- java使用httpclient封装post请求和get的请求
在我们程序员生涯中,经常要复用代码,所以我们应该养成时常整理代码的好习惯,以下是我之前封装的httpclient的post和get请求所用的代码: package com.marco.common; ...
- linux中查看软件文件安装路径
在linux中文件与软件一般都是安装在到/usr/share和/usr/local中了,如果我们需要查看软件安装路径linux为我们提供了查看命令,whereis 就可以帮我查找文件安装路径在哪里了 ...
- C# MemoryCache GCHandle
MemoryCache在项目中用了很久,感觉比较简单,以前也看过里面的源代码,主要借用MemoryCacheStore来完成数据的存储,里面是线程安全的,MemoryCacheStore借用Hasht ...
- double compare 0
因为double类型或float类型都是有精度的,其实都是取的近似值,所以有个误差.和一个很小的数比如0.00000001(1e-8)比较就是为了在这个误差范围内进行比较. 举个例子如double b ...
- mysql YEARWEEK(date[,mode]) 函数 查询上周数据 以及本周数据
通常使用下边sql即可(如果数据库设置了周一为一周起始的话): 查询上周数据(addtime为datetime格式) SELECT id,addtime FROM mall_order WHERE ...