Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging BSOD调试:注册表值发生无法解释的更改_Debugging_Assembly_X86 64_Bsod - Fatal编程技术网

Debugging BSOD调试:注册表值发生无法解释的更改

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

我正试图分析一个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中的地址发生更改?如有任何解释,将不胜感激


谢谢

执行可能通过跳转从其他地方到达该指令。它可能是一个循环的一部分,再往下看有没有跳回。事实上,在它之前有一条NOP指令,这强烈地表明该指令是Jester建议的循环分支目标,插入NOP是为了使指令对齐以获得更好的性能。