虫趣:别动系统的奶酪——内核保护错误(CRITICAL_STRUCTURE_CORRUPTION)

欢迎转载:作者:张佩】【原文:http://www.yiiyee.cn/Blog/0x109-1/

引子

下班的时候准备关掉调试机,却遇到蓝屏。本想直接拔电源,但蓝屏总是让我好奇,于是决定多待十分钟,看看这个蓝屏是怎么回事。主机的windbg调试器已经用DML标记出了自动分析命令!analyze –v。于是点进去:

1: kd> !analyze -v
ERROR: FindPlugIns 8007007b
ERROR: Some plugins may not be available [8007007b]
*******************************************************************
*                                                                 *
*                        Bugcheck Analysis                        *
*                                                                 *
*******************************************************************

CRITICAL_STRUCTURE_CORRUPTION (109)
This bugcheck is generated when the kernel detects that critical kernel code or
data have been corrupted. There are generally three causes for a corruption:
1) A driver has inadvertently or deliberately modified critical kernel code
 or data. See http://www.microsoft.com/whdc/driver/kernel/64bitPatching.mspx
2) A developer attempted to set a normal kernel breakpoint using a kernel
 debugger that was not attached when the system was booted. Normal breakpoints,
 "bp", can only be set if the debugger is attached at boot time. Hardware
 breakpoints, "ba", can be set at any time.
3) A hardware corruption occurred, e.g. failing RAM holding kernel code or data.
Arguments:
Arg1: a3a039d89bef061c, Reserved
Arg2: b3b7465eee6c05cb, Reserved
Arg3: fffff80053b0b910, Failure type dependent information
Arg4: 0000000000000001, Type of corrupted region, can be
	0 : A generic data region
	1 : Modification of a function or .pdata
	2 : A processor IDT
	3 : A processor GDT
	4 : Type 1 process list corruption
	5 : Type 2 process list corruption
	6 : Debug routine modification
	7 : Critical MSR modification

这一段内容很丰富,原来是系统发现关键结构体被破坏了。在XP时代,我们有一个很热门的技术话题,就是各种内核Hook。比如注明的SSDT Hook。SSDT是操作系统保存各种内核服务的一张表,里面保存的是各种内核函数指针。骇客只要把这张表给偷梁换柱,换成自己写的函数地址,就可以实现其狂妄的目的了。这个技术是这么地流行,不仅Rootkit和Virus爱它,Anti-Rootkit和Anti-Virus也爱它。搜索引擎查关键字“SSDT HOOK”,能找到一大堆经典文章和讨论。

这好比操作系统有一块奶酪放在办公桌上,路过的人把它里面的东西换成了橙汁。味道也许不错, 甚至更好,但操作系统很不喜欢!万一换的是放射性有毒物质呢?

这个技术现在还能在x86平台上使用,但微软决定在64位系统上,把这个漏洞或多或少地堵住。微软在它的第一版x64系统(XP x64)上引入了一项新技术。新增了一个内核检查措施,称为Kernel Patch Protection又名PatchGuard,简称KPP,对内核本身和重要的数据结构进行保护。似乎可以把KPP用中文直译成:内核补丁保护(这个翻译其实有点不妥,需要注意,不可以理解成保护内核补丁,而应该理解成保护内核不被补丁侵害)。

KPP的保护对象有很多,比如内核文件(NT、Hal.dll、Ndis.sys、Tcpip.sys等),内核结构体(如SSDT、内核堆栈、ObjectTypes),CPU结构体或寄存器(GDT、IDT、MSR)等等。一旦发现这些被保护的对象受到不当修改,就立刻蓝屏,蓝屏号恰恰就是CRITICAL_STRUCTURE_CORRUPTION (0x109)。

KPP和反KPP技术,现在和以后,都是一个很流行的讨论话题。

分析

从自动分析的提示中可知,KPP检测到有一个系统函数被修改了。为了找出KPP引发蓝屏的那个原因,必须使用!chkimg命令:

1> CHKIMG_EXTENSION: !chkimg -lo 50 -d !nt
2>     fffff80053b0b910 - nt!DbgBreakPoint
3> [cc:90 ]
4> 1 error : !nt (fffff80053b0b910)

运行之后,它列举了一个错误,是在nt!DbgBreakPoint函数中地址0x fffff80053b0b910处发现的。第三行的[cc:90]意思是说,这个地址处的指令应该是cc,但现在是90。指明了错误原因。

我到底做过什么了,就动了系统的奶酪了?还是来看看这个函数吧:

1: kd> uf nt!DbgBreakPoint
nt!DbgBreakPoint [d:\w8rtm\minkernel\ntos\rtl\amd64\debugstb.asm]:
   51 fffff800`53b0b910 90              nop
   54 fffff800`53b0b911 c3              ret

再看看未修改的代码:

2: kd> uf nt!DbgBreakPoint
nt!DbgBreakPoint [d:\w8rtm\minkernel\ntos\rtl\amd64\debugstb.asm]:
   51 fffff801`e4d06910 cc              int     3
   54 fffff801`e4d06911 c3              ret

哈哈,原来是公司的代码中滥用了太多的DbgBreak函数,调试的时候必须不断地按F5过滤掉这些int 3断点。于是大家都忍不住把这个本是断点指令的cc改成了无操作指令90。这就是原因所在了。

后来,我把这个patch改在了公司自己的驱动文件中,只要不影响系统文件,就避免了KPP检查的问题。

到这里真相大白了。系统的KPP一直在系统中运行着,它不保证当问题发生的时候,马上就抓到它。但它保证,只要问题存在足够长的时间(可能要经过几个小时,也可能只需几分钟),KPP就一定能够抓到它。这一点很重要,足以制止Patch技术的商业运用,甚至技术体验也都变得毫无价值。

37,923 total views, 33 views today

《虫趣:别动系统的奶酪——内核保护错误(CRITICAL_STRUCTURE_CORRUPTION)》有65个想法

  1. 我很想学习驱动调试的技术,但是不知道如何去入手,本身我也是写设备驱动的,遇到一些蓝屏的问题,只能大致的分析错误的原因,然后再从自己的代码中去找解决方法,像您这样一步一步的分析,真的难以想象,可以请您指导一下吗?

    1. 首先掌握一般的调试技巧,能够从dump文件中找到有用信息。然后要有一定的分析能力,根据调试信息定位问题。我不知道你需要什么样的指导?

      1. 不知道这个调试的流程是什么样的,每次我遇到一些问题的是,我会根据 !analyze -v 去获取这个错误的相关信息,然后看到这个信息之后就知道大致问题出在什么地方了,但是如果这个错误出现的地方不是我自己的代码,那我就不懂该怎么去处理了,因为在Windows系统上我会跟其它的一些程序进行关联,其它的程序有可能也会出问题,我就不能像您那样去分析它们的内容,有时候想分析,但是不知道从哪里下手,没有一个调试的思路,这个让我很困惑。

        1. 调试就是个案分析,想用一个或一些例子套用到其它大部分案例的情况,是不可能的。所以,一般就是上下而求索,寻找破案的证据和痕迹。熟悉windbg命令,可以帮助找到更多的线索。如果对证据不确定,有疑惑的话,就要临时查阅、或网上搜索资料了。

          1. 非常感谢您的回复。
            对上下求索是最糊涂的,知道错误的地方,然后该查什么呢?看堆栈,看irp,还是看其它的?对这个没有一个整体的思路,不知道该如何进行下一步操作了,在这方面我该怎么去学习和调整呢?

          2. 堆栈一般都看看看,用k命令,有时还要用上dps @esp;是否看irp要看情况,如果断在分发函数里面,需要看看;如果是电源请求错误,如9f的bsod,也需要看对应的irp,并找到hung的命令;其它的,如果怀疑锁的问题,要找到这个锁,看锁的状态,用!object命令。指针的问题,当然要看内存,用d。还有栈溢出的,用!thred看栈的开始、结束地址。等等。这些经验需要慢慢积累。

  2. 嗯,看来还是要多分析一些错误文件才可以。请问一下,因为我平时的调试过程中遇到的错误不是很多,那有没有什么网站可以找到很多错误的dump和symbol,然后进行分析学习的?

    1. I give it 2 squares.With “Tie my hands” Wayne bodies his whole album. On that cut, he shows us what he could be if he do8s&n#e217;t settle on who he has become. He could be a very powerful voice interperting the world for the youth while being respected as a brilliant mind, witty and relevant. For the most part, I hear rambling.Mrs. Officer is dope, I just turn it down over bobby v’s whooting.

  3. 你好。你分析的很有道理,能看明白,可是我是系统的门外汉,不会操作。我的笔记本是华硕S300CA,也是出现这个问题,总是自动关机。不停的自动关机重启,希望得到你的帮助,谢谢你。张

  4. 我的是WINS8,不知道哪里出问题了,谢谢你啊。张帅哥。critical structure corruption,这是什么问题关机

      1. 我不是研究驅動或者語言的,就是使用系統的時候遇到這個問題了。critical_structure_corruption(Ntfs.sys),然後是說收集錯誤信息,百分之百值后幫我重啓,結果等到低電量自動關機了,,,怎麼辦

    1. ntfs.sys是NTFS文件系统驱动文件。很可能是由文件过滤驱动程序引起的,最近有没有安装什么杀毒或desktop管理软件?

      1. 卸载过百度杀毒软件,前天百度了一下,照着一个大神的说法在管理代码中输入了一些编码,现在倒是没有再出现那种情况了,不过不知道以后还会不会在出现

  5. 出现 CRITICAL_STRUCTURE_CORRUPTION(TSDefenseBT64.sys)到底是什么问题?我从昨晚到现在都没找到解决方案 网上的大家的错误又跟我不同,很苦恼 平均十分钟就重启一次了。求解答

    1. TSDefenseBT64是QQ电脑管家的驱动模块,可能不小心修改了一些受保护的系统数据。建议你更新QQ电脑管家到最新版本,或卸载。

  6. CRITICAL_STRUCTURE_CORRUPTION(TSDefenseBT64.sys)大哥我这个什么问题,是不是只要把括号里的东西删除就好了

  7. 不好意思我看了你的评论回复 了。我试试。你是怎么知道他是电脑管家的驱动程序的。。。。求指教

  8. CRITICAL_STRUCTURE_CORRUPTION(TSDefenseBT64.sys)我的提示是这样的然后就重启了 好郁闷啊 亲可以帮我看看嘛 而且还是买的新电脑

      1. Maya, thanks for sharing Ty’s story. Poor baby. It breaks my heart when I read what he had to go through. It’s so sad that I am in tears as I type this message. I mean, 27 surgeries and 45 rounds of radiation? and unable to walk due to all the poison that he had to receive. I’ve been to Ty’s website and have wished him Happy Birthday, what a fighter he is and an inspiration. Anyway, thanks for sharing! I didn’t know anything about pediatric cancer before I read about Ronan. It’s so fucking sad and unfair. I hope someday we see gold ribbons in September, just as we see pink everywhere this month.

  9. 求助,我也出现了CRITICAL_STRUCTURE_CORRUPTION。用Windows自带的内存扫描扫过了,排除内存问题。用SFC /SCANNOW指令也没有检测出问题。更奇怪的是,虽然MSDN新装系统默认写入日志是打开的,却找不到MEMORY.DMP文件。

    非常感谢您的帮助

  10. 我的电脑最近老师说遇到问题需要重启然后平均每10分钟就要重启一次,CRITICAL_STRUCTURE_CORRUPTION

  11. 我的是华硕win8系统 这两天也经常出现错误CRITICAL STRUCTURE CORRUPTION 然后就经常重启 请问该怎么解决呢 急求帮忙 谢谢~~

      1. I used to visit Faithfreedom forum a few years ago. Found a friend there, who documented alotta the hate that was going on. He forwarded me some stuff. Lotsa incriminating stuff on Ali Sina and his genocidal hate mongering. He’s a total nutter…its very telling that Rob Spencer is best buddies with that sociopath.

  12. CRITICAL STRUCTURE CORRUPTION(Ntfs.sys)我的这样,怎么回事啊,平均15分钟蓝屏一下求大神解答?????

  13. 你好!我的笔记本从win7升级win10后,经常自动重启,时间不等,最长1小时,最短十几分钟(win7时没有此现象)。显示:“你的电脑遇到问题,需要重新启动。我们只收集某些错误信息,然后为你重新启动” 数字从 0%到100%时自动关机重启。下面让在线查询:critical structure corruption 请问:是win10的问题?是华硕笔记本的问题(上面有人提到华硕)?还是AMD显卡CPU的问题(网上说AMD不兼容win10)?还是

    1. 此前,有数人给我报过类似的因升级win10而导致的critical structure corruption的问题,我看过大概3个dump文件,发现都是因为安装第三方桌面管理或杀毒软件所引起的修改系统模块某处内存而被系统侦测到,触发崩溃。你可以就这方面具体看一下你自己升级后的系统的情况。

  14. OACR monitor running already ‘doskey’不是内部或外部命令,也不是可运行的程序或批处理文件。为什么会有这样的提示呢运行x64 Checked Build Environment的时候

  15. 请问,怎样把cc改成90呢?直接修改系统的二进制文件吗?
    另外 “后来,我把这个patch改在了公司自己的驱动文件中,只要不影响系统文件,就避免了KPP检查的问题。” 请问您的patch是又把这个二进制文件从90到cc改回来吗?
    谢谢!

  16. 我的也是遇到了这个问题,但是我不知道改怎么用chek语句来检索出是哪个函数错了,您能帮一下我么?
    Dump文件:
    CRITICAL_STRUCTURE_CORRUPTION (109)
    This bugcheck is generated when the kernel detects that critical kernel code or
    data have been corrupted. There are generally three causes for a corruption:
    1) A driver has inadvertently or deliberately modified critical kernel code
    or data. See http://www.microsoft.com/whdc/driver/kernel/64bitPatching.mspx
    2) A developer attempted to set a normal kernel breakpoint using a kernel
    debugger that was not attached when the system was booted. Normal breakpoints,
    “bp”, can only be set if the debugger is attached at boot time. Hardware
    breakpoints, “ba”, can be set at any time.
    3) A hardware corruption occurred, e.g. failing RAM holding kernel code or data.
    Arguments:
    Arg1: a3a00bd93b8275c1, Reserved
    Arg2: b3b7185f8e035b7f, Reserved
    Arg3: 0000000000000002, Failure type dependent information
    Arg4: 0000000000000018, Type of corrupted region, can be
    0 : A generic data region
    1 : Modification of a function or .pdata
    2 : A processor IDT
    3 : A processor GDT
    4 : Type 1 process list corruption
    5 : Type 2 process list corruption
    6 : Debug routine modification
    7 : Critical MSR modification
    8 : Object type
    9 : A processor IVT
    a : Modification of a system service function
    b : A generic session data region
    c : Modification of a session function or .pdata
    d : Modification of an import table
    e : Modification of a session import table
    f : Ps Win32 callout modification
    10 : Debug switch routine modification
    11 : IRP allocator modification
    12 : Driver call dispatcher modification
    13 : IRP completion dispatcher modification
    14 : IRP deallocator modification
    15 : A processor control register
    16 : Critical floating point control register modification
    17 : Local APIC modification
    18 : Kernel notification callout modification
    19 : Loaded module list modification
    1a : Type 3 process list corruption
    1b : Type 4 process list corruption
    1c : Driver object corruption
    1d : Executive callback object modification
    1e : Modification of module padding
    1f : Modification of a protected process
    20 : A generic data region
    21 : A page hash mismatch
    22 : A session page hash mismatch
    23 : Load config directory modification
    24 : Inverted function table modification
    25 : Session configuration modification
    26 : An extended processor control register
    27 : Type 1 pool corruption
    28 : Type 2 pool corruption
    29 : Type 3 pool corruption
    101 : General pool corruption
    102 : Modification of win32k.sys

    Debugging Details:

  17. 我的也是遇到了这个问题,但是我不知道改怎么用chek语句来检索出是哪个函数错了,您能帮一下我么?如果需要的话dump文件我可以发给您。

  18. 最近身边有人也碰到蓝屏问题,不过我用WinDbg打开后,感觉很奇怪。
    Bugcheck 109,Arg1看上去像随机数(据说是PatchGuard Context+一个值,所以看上去像随机数)
    Arg2、Arg3都是0,好像也比较奇怪,因为据说Arg3多数情况是被篡改对象的地址。
    Arg4是108,Arg4不是应该表示篡改类型么?但微软的列表里没有108!

  19. 最近身边有人也碰到蓝屏问题,不过我用WinDbg打开后,感觉很奇怪。
    Bugcheck 109,Arg1看上去像随机数(据说是PatchGuard Context+一个值,所以看上去像随机数)
    Arg2、Arg3都是0,好像也比较奇怪,因为据说Arg3多数情况是被篡改对象的地址。
    Arg4是108,Arg4不是应该表示篡改类型么?但微软的列表里没有108!

发表评论

电子邮件地址不会被公开。