Debugging BSOD调试:注册表值发生无法解释的更改
我正试图分析一个BSOD的崩溃转储。WinDbg说这是一个池损坏,但我想进一步挖掘以提高我的调试技能。以下是导致坠机的原因:Debugging BSOD调试:注册表值发生无法解释的更改,debugging,assembly,x86-64,bsod,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 4
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中的地址发生更改?如有任何解释,将不胜感激
谢谢 执行可能通过跳转从其他地方到达该指令。它可能是一个循环的一部分,再往下看有没有跳回。事实上,在它之前有一条NOP指令,这强烈地表明该指令是Jester建议的循环分支目标,插入NOP是为了使指令对齐以获得更好的性能。