BSOD调试:注册表值无法解释的变化

时间:2016-12-04 22:38:43

标签: debugging assembly x86-64 bsod

我有一个BSOD的崩溃转储,我正在尝试分析。 WinDbg说这是一个游泳池腐败,但我想深入挖掘一下以提高我的调试技巧。这些是导致崩溃的线路:

fffff800`0300a998 498bf5          mov     rsi,r13
fffff800`0300a99b 8bee            mov     ebp,esi
fffff800`0300a99d 498b842400010000 mov     rax,qword ptr [r12+100h]
fffff800`0300a9a5 4885c0          test    rax,rax
fffff800`0300a9a8 0f8443030000    je      nt!ExDeferredFreePool+0x435 (fffff800`0300acf1)
fffff800`0300a9ae 498b942400010000 mov     rdx,qword ptr [r12+100h]
fffff800`0300a9b6 488bfa          mov     rdi,rdx
fffff800`0300a9b9 0f1f00          nop     dword ptr [rax]
fffff800`0300a9bc 4c8b02          mov     r8,qword ptr [rdx] ds:002b:fbfffa80`2d3db3a0=????????????????

最后一行导致崩溃,因为它试图取消引用保存无效内存地址的rdx的值(fbfffa802d3db3a0不是规范形式)。但是......这个价值是如何被破坏的?如果我上升3行,r12 + 100h的地址将被移动到rdx:

fffff800`0300a9ae 498b942400010000 mov     rdx,qword ptr [r12+100h]

此内存位置包含有效地址:

0: kd> dq r12+100h l1 
fffff800`03065680  fffffa80`2f7c5870

在下一行中,rdx被复制到rdi:

fffff800`0300a9b6 488bfa          mov     rdi,rdx

此时,两个寄存器应保持相同的值。

这个与崩溃之间唯一的另一条线是:

fffff800`0300a9b9 0f1f00          nop     dword ptr [rax]

在崩溃的那一刻,rdi保存了正确的地址,但rdx中的地址已损坏:

0: kd> .cxr fffff80000b90930
rax=fffffa8030f0a870 rbx=0000000000000000 rcx=fffff80003065e50
rdx=fbfffa802d3db3a0 rsi=fffffa803f0c0000 rdi=fffffa802f7c5870

NOP指令能否导致地址在rdx中发生变化?任何解释都将不胜感激。

谢谢!

0 个答案:

没有答案
相关问题