Дамп сбоя подразумевает изменение значения регистра между последовательными инструкциями - PullRequest
3 голосов
/ 29 октября 2011

В настоящее время я анализирую аварийный дамп клиента, полученного в результате BSOD.Я не могу предоставить аварийный дамп по соображениям конфиденциальности, но я зашел в тупик.

Сбой происходит в функции RtlSetBit в DDK.Вот контекстная запись:

rax=0000000000000000 rbx=fffff8800282da00 rcx=fffffa8007c10340
rdx=0000000000000000 rsi=0000000000000001 rdi=fffffa8007c102e0
rip=fffff8000168d0b4 rsp=fffff880057478e8 rbp=0000000000000000
 r8=0000000000000000  r9=0000000000000000 r10=fffff88001e5dca0
r11=0000000000000000 r12=0000000000000000 r13=fffffa800812feb0
r14=0000000000000001 r15=fffff88003490af0
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
nt!RtlSetBit+0x4:
fffff800`0168d0b4 0fab10          bts     dword ptr [rax],edx ds:002b:00000000`00000000=????????

Вот сборка для RtlSetBit:

fffff800`0168d0b0 488b4108        mov     rax,qword ptr [rcx+8]
fffff800`0168d0b4 0fab10          bts     dword ptr [rax],edx << Exception
fffff800`0168d0b7 c3              ret

Странно то, что, как видите, rax не содержит содержимогоиз rcx+8:

2: kd> dq rcx+8
fffffa80`07c10348  fffffa80`07c10338 0000000b`00000014

Вместо rax отображается ноль.

Как это возможно?Я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 29 октября 2011

Значение, вероятно, было 0 во время выполнения mov rax, qword ptr [rcx+8]. Прежде чем bts мог выполнить, другой поток изменил значение в памяти. Затем происходит сбой на bts, и когда вы смотрите на память, вы видите обновленное значение, а не исходное 0.

0 голосов
/ 29 октября 2011

Вы предполагаете, что инструкция перед ходом выполнена. Но только потому, что он находится в ассемблере перед ним, это не обязательно означает, что он выполняется раньше. Прыжок прямо к BTS может привести к такому плохому поведению.

Причиной этого перехода может быть либо неправильный код (не знаю, есть ли у вас рукописный / оптимизированный ассемблер), либо переполнение стека / буфера / массива, которое изменило адрес возврата в стеке и сделало bts адресом возврата и другие более неясные ошибки.

...