记录一个特别的蓝屏 0x1000007f

在windows中这个蓝屏也是常见蓝屏之一,这里记录下在工作中遇到的这个蓝屏的一个特别之处。UNEXPECTED_KERNEL_MODE_TRAP_M (1000007f)

在用户环境的产品中,隔三差五就会反馈这个蓝屏代码,完全是随机概率的,而且很容易出现在某几个特别的用户环境下,那倒了dump之后开始对这个dump进行分析,发现这个蓝屏的位置居然发生在了Minifilter的重入中,有意思的是这个重入不是常见文件操作引发的而是:

//发生在了PsLookupProcessByProcessId这里
if (NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)ProcessID, &pPep)))
    {
        uXid = (ULONG64)pPep + (ULONG64)ProcessID*2 + PsGetProcessCreateTimeQuadPart(pPep);
        ObDereferenceObject(pPep);
    }
    else
    {
        return callbackStatus;
    }

居然是在查询EPROCESS的API PsLookupProcessByProcessId中,这个API在调用的时候触发了注册的PreCall操作,而这个操作里需要执行这个查询,然后又再次循环,导致堆栈耗尽崩溃。

不是很清楚到底发生了什么,于是跟踪了下这个链路:

PsLookupProcessByProcessId -> PspReferenceCidTableEntry 

故障发生在 nt!PspReferenceCidTableEntry+0x51的位置,这里触发了nt!KiPageFault,看汇编代码:

kd> u nt!PspReferenceCidTableEntry l+50
nt!PspReferenceCidTableEntry:
fffff802`6d4bf410 48895c2408      mov     qword ptr [rsp+8],rbx
fffff802`6d4bf415 48896c2410      mov     qword ptr [rsp+10h],rbp
fffff802`6d4bf41a 4889742418      mov     qword ptr [rsp+18h],rsi
fffff802`6d4bf41f 48897c2420      mov     qword ptr [rsp+20h],rdi
fffff802`6d4bf424 4156            push    r14
fffff802`6d4bf426 4883ec40        sub     rsp,40h
fffff802`6d4bf42a 488b0527766400  mov     rax,qword ptr [nt!PspCidTable (fffff802`6db06a58)]
fffff802`6d4bf431 0fb6ea          movzx   ebp,dl
fffff802`6d4bf434 f7c1fc030000    test    ecx,3FCh
fffff802`6d4bf43a 0f8461010000    je      nt!PspReferenceCidTableEntry+0x191 (fffff802`6d4bf5a1)
fffff802`6d4bf440 488bd1          mov     rdx,rcx
fffff802`6d4bf443 488bc8          mov     rcx,rax
fffff802`6d4bf446 e855730b00      call    nt!ExpLookupHandleTableEntry (fffff802`6d5767a0)
fffff802`6d4bf44b 488bf0          mov     rsi,rax
fffff802`6d4bf44e 4885c0          test    rax,rax
fffff802`6d4bf451 0f844a010000    je      nt!PspReferenceCidTableEntry+0x191 (fffff802`6d4bf5a1)
fffff802`6d4bf457 4c8b35fa756400  mov     r14,qword ptr [nt!PspCidTable (fffff802`6db06a58)]
fffff802`6d4bf45e 0f0d08          prefetchw [rax]
fffff802`6d4bf461 488b08          mov     rcx,qword ptr [rax]    //这里引发了分页故障
fffff802`6d4bf464 48894c2420      mov     qword ptr [rsp+20h],rcx
fffff802`6d4bf469 488b4808        mov     rcx,qword ptr [rax+8]
fffff802`6d4bf46d 48894c2428      mov     qword ptr [rsp+28h],rcx
fffff802`6d4bf472 488b7c2420      mov     rdi,qword ptr [rsp+20h]
fffff802`6d4bf477 48f7c7feff0100  test    rdi,1FFFEh
fffff802`6d4bf47e 7474            je      nt!PspReferenceCidTableEntry+0xe4 (fffff802`6d4bf4f4)
fffff802`6d4bf480 40f6c701        test    dil,1
fffff802`6d4bf484 0f8498a51c00    je      nt!PspReferenceCidTableEntry+0x1ca612 (fffff802`6d689a22)
fffff802`6d4bf48a 488d5ffe        lea     rbx,[rdi-2]
fffff802`6d4bf48e 488bc7          mov     rax,rdi
fffff802`6d4bf491 488bd1          mov     rdx,rcx
fffff802`6d4bf494 f0480fc70e      lock cmpxchg16b oword ptr [rsi]
fffff802`6d4bf499 488bf8          mov     rdi,rax
fffff802`6d4bf49c 4889442420      mov     qword ptr [rsp+20h],rax
fffff802`6d4bf4a1 488bca          mov     rcx,rdx
fffff802`6d4bf4a4 4889542428      mov     qword ptr [rsp+28h],rdx
fffff802`6d4bf4a9 0f852b010000    jne     nt!PspReferenceCidTableEntry+0x1ca (fffff802`6d4bf5da)
fffff802`6d4bf4af 488bc8          mov     rcx,rax
fffff802`6d4bf4b2 48d1e9          shr     rcx,1
fffff802`6d4bf4b5 6683f910        cmp     cx,10h
fffff802`6d4bf4b9 0f842d010000    je      nt!PspReferenceCidTableEntry+0x1dc (fffff802`6d4bf5ec)
fffff802`6d4bf4bf 48c1ff10        sar     rdi,10h
fffff802`6d4bf4c3 4883e7f0        and     rdi,0FFFFFFFFFFFFFFF0h
fffff802`6d4bf4c7 0fb607          movzx   eax,byte ptr [rdi]
fffff802`6d4bf4ca 247f            and     al,7Fh
fffff802`6d4bf4cc 403ac5          cmp     al,bpl
fffff802`6d4bf4cf 0f85c4000000    jne     nt!PspReferenceCidTableEntry+0x189 (fffff802`6d4bf599)
fffff802`6d4bf4d5 488bc7          mov     rax,rdi
fffff802`6d4bf4d8 488b5c2450      mov     rbx,qword ptr [rsp+50h]
fffff802`6d4bf4dd 488b6c2458      mov     rbp,qword ptr [rsp+58h]
fffff802`6d4bf4e2 488b742460      mov     rsi,qword ptr [rsp+60h]
fffff802`6d4bf4e7 488b7c2468      mov     rdi,qword ptr [rsp+68h]
fffff802`6d4bf4ec 4883c440        add     rsp,40h
fffff802`6d4bf4f0 415e            pop     r14
fffff802`6d4bf4f2 c3              ret
fffff802`6d4bf4f3 cc              int     3
fffff802`6d4bf4f4 488b0d5d756400  mov     rcx,qword ptr [nt!PspCidTable (fffff802`6db06a58)]
fffff802`6d4bf4fb 488bd6          mov     rdx,rsi
fffff802`6d4bf4fe 33db            xor     ebx,ebx
fffff802`6d4bf500 e8ffd1c9ff      call    nt!ExLockHandleTableEntry (fffff802`6d15c704)
fffff802`6d4bf505 84c0            test    al,al
fffff802`6d4bf507 0f8494000000    je      nt!PspReferenceCidTableEntry+0x191 (fffff802`6d4bf5a1)
fffff802`6d4bf50d 488b3e          mov     rdi,qword ptr [rsi]
fffff802`6d4bf510 48c1ff10        sar     rdi,10h
fffff802`6d4bf514 4883e7f0        and     rdi,0FFFFFFFFFFFFFFF0h
fffff802`6d4bf518 0fb607          movzx   eax,byte ptr [rdi]
fffff802`6d4bf51b 247f            and     al,7Fh
fffff802`6d4bf51d 403ac5          cmp     al,bpl
fffff802`6d4bf520 0f85b0000000    jne     nt!PspReferenceCidTableEntry+0x1c6 (fffff802`6d4bf5d6)
fffff802`6d4bf526 4080fd03        cmp     bpl,3
fffff802`6d4bf52a 747c            je      nt!PspReferenceCidTableEntry+0x198 (fffff802`6d4bf5a8)
fffff802`6d4bf52c 8b8760050000    mov     eax,dword ptr [rdi+560h]
fffff802`6d4bf532 2403            and     al,3
fffff802`6d4bf534 3c02            cmp     al,2
fffff802`6d4bf536 750a            jne     nt!PspReferenceCidTableEntry+0x132 (fffff802`6d4bf542)
fffff802`6d4bf538 488bce          mov     rcx,rsi
fffff802`6d4bf53b e87057c4ff      call    nt!ExSlowReplenishHandleTableEntry (fffff802`6d104cb0)
fffff802`6d4bf540 8bd8            mov     ebx,eax
fffff802`6d4bf542 448d4301        lea     r8d,[rbx+1]
fffff802`6d4bf546 0f0d4fd0        prefetchw [rdi-30h]
fffff802`6d4bf54a 488b47d0        mov     rax,qword ptr [rdi-30h]

发生故障的位置就在:

fffff802`6d4bf457 4c8b35fa756400  mov     r14,qword ptr [nt!PspCidTable]
fffff802`6d4bf45e 0f0d08          prefetchw [rax]
fffff802`6d4bf461 488b08          mov     rcx,qword ptr [rax]    //这里引发了分页故障

看一下prefetchw汇编指令的说明:

汇编指令prefetch的作用是预取数据或指令到缓存中,以提高程序的执行效率,减少内存访问的延迟。prefetch指令主要是提示处理器提前将指定地址的数据或指令加载到缓存中,它只是发起一个预取请求,并不实际访问数据。

 如果[rax]指向地址没有在当前的内存中,而是在分页文件上,那么这个预取操作就会触发分页故障,接下来就去进入到PageFile的读取流程中,如果没有过滤掉 FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO ,那么就会引起上面的问题。

分析的过程受限于本人知识与经验,如有错误希望广大网友及时指出,感激不尽。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值