Режим ядра Win10 Driver BSOD, как поймать в c ++?

Я пытаюсь прочитать память другого процесса через драйвер режима ядра. Он работает, и я вставляю драйвер в пространство другого драйвера, чтобы он работал (или могу просто включить тестовый режим).

Тем не менее, он работает хорошо, но когда я даю неправильный адрес, я получаю BSOD.

Вот информация об одном примере BSOD:

SYSTEM_SERVICE_EXCEPTION (3b)
An exception happened while executing a system service routine.
Arguments:
Arg1: 00000000c0000005, Exception code that caused the bugcheck
Arg2: ffffe000d509c720, Address of the instruction which caused the bugcheck
Arg3: ffffd00026053db0, Address of the context record for the exception that 
caused the bugcheck
Arg4: 0000000000000000, zero.

Поскольку я ввел драйвер в другой драйвер, символы и т. Д. Не могут быть разрешены. Дополнительная информация:

ADDITIONAL_DEBUG_TEXT:  
You can run '.symfix; .reload' to try to fix the symbol path and load symbols.

MODULE_NAME: nt

FAULTING_MODULE: fffff80043604000 nt

DEBUG_FLR_IMAGE_TIMESTAMP:  56cd4410

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%p referenced 
memory at 0x%p. The memory could not be %s.

FAULTING_IP: 
+8c0
ffffe000`d509c720 8a440aff        mov     al,byte ptr [rdx+rcx-1]

CONTEXT:  ffffd00026053db0 -- (.cxr 0xffffd00026053db0;r)
rax=00000000df000008 rbx=00000000df000004 rcx=ffffe000d509e004
rdx=0000200009f62004 rsi=ffffe000d391c2a0 rdi=ffffe000d818f000
rip=ffffe000d509c720 rsp=ffffd000260547d8 rbp=ffffd00026054b80
 r8=0000000000000004  r9=0000000000000000 r10=ffffe000d69eb8d8
r11=ffffe000d509e000 r12=00000000c0000900 r13=0000000000000000
r14=ffffe000d391c1d0 r15=0000000000000000
iopl=0         nv up ei pl nz na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
ffffe000`d509c720 8a440aff        mov     al,byte ptr [rdx+rcx-1] 
ds:002b:00000000`df000007=??
Last set context:
rax=00000000df000008 rbx=00000000df000004 rcx=ffffe000d509e004
rdx=0000200009f62004 rsi=ffffe000d391c2a0 rdi=ffffe000d818f000
rip=ffffe000d509c720 rsp=ffffd000260547d8 rbp=ffffd00026054b80
 r8=0000000000000004  r9=0000000000000000 r10=ffffe000d69eb8d8
r11=ffffe000d509e000 r12=00000000c0000900 r13=0000000000000000
r14=ffffe000d391c1d0 r15=0000000000000000
iopl=0         nv up ei pl nz na pe nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
ffffe000`d509c720 8a440aff        mov     al,byte ptr [rdx+rcx-1] 
ds:002b:00000000`df000007=??
Resetting default scope

DEFAULT_BUCKET_ID:  WIN8_DRIVER_FAULT

BUGCHECK_STR:  0x3B

CURRENT_IRQL:  0

ANALYSIS_VERSION: 6.3.9600.17237 (debuggers(dbg).140716-0327) amd64fre

LAST_CONTROL_TRANSFER:  from ffffe000d509c233 to ffffe000d509c720

STACK_TEXT:  
ffffd000`260547d8 ffffe000`d509c233 : ffffe000`d2b32700 00000000`df000004 
ffffe000`d818f000 fffff800`43a167f5 : 0xffffe000`d509c720
ffffd000`260547e0 ffffe000`d2b32700 : 00000000`df000004 ffffe000`d818f000 
fffff800`43a167f5 00000000`00000001 : 0xffffe000`d509c233
ffffd000`260547e8 00000000`df000004 : ffffe000`d818f000 fffff800`43a167f5 
00000000`00000001 df000004`00000000 : 0xffffe000`d2b32700
ffffd000`260547f0 ffffe000`d818f000 : fffff800`43a167f5 00000000`00000001 
df000004`00000000 ffffe000`d818f000 : 0xdf000004
ffffd000`260547f8 fffff800`43a167f5 : 00000000`00000001 df000004`00000000 
ffffe000`d818f000 ffffe000`d818f000 : 0xffffe000`d818f000
ffffd000`26054800 fffff800`43a0eac2 : ffffe000`d2b327e0 ffffd000`26054b80 
00000000`00000001 ffffe000`d65c0080 : nt!ObReferenceObjectByHandle+0x25
ffffd000`26054850 fffff800`43a0d956 : fffff800`21ef4020 00000000`00000000 
00000000`00000000 00000000`00000000 : nt!NtDeviceIoControlFile+0x11c2
ffffd000`26054a20 fffff800`43750fa3 : ffffe000`d69eb840 00000000`00000000 
00000000`00000000 00000000`00000000 : nt!NtDeviceIoControlFile+0x56
ffffd000`26054a90 00000000`587221bc : 00000000`00000000 00000000`00000000 
00000000`00000000 00000000`00000000 : nt!setjmpex+0x3963
00000000`00bbf0f8 00000000`00000000 : 00000000`00000000 00000000`00000000 
00000000`00000000 00000000`00000000 : 0x587221bc


FOLLOWUP_IP: 
nt!NtDeviceIoControlFile+11c2
fffff800`43a0eac2 448be0          mov     r12d,eax

SYMBOL_STACK_INDEX:  6

SYMBOL_NAME:  nt!NtDeviceIoControlFile+11c2

FOLLOWUP_NAME:  MachineOwner

IMAGE_NAME:  ntkrnlmp.exe

STACK_COMMAND:  .cxr 0xffffd00026053db0 ; kb

BUCKET_ID:  WRONG_SYMBOLS

FAILURE_BUCKET_ID:  WRONG_SYMBOLS

ANALYSIS_SOURCE:  KM

FAILURE_ID_HASH_STRING:  km:wrong_symbols

FAILURE_ID_HASH:  {70b057e8-2462-896f-28e7-ac72d4d365f8}

Теперь о том, что я делаю: я даю драйверу 4 значения и имею глобальный буфер для записи считываемых значений:

char buf [5000]; NTSTATUS DevioctlDispatch (In struct _DEVICE_OBJECT * DeviceObject, Inout struct _IRP * Irp) все, что я делаю в драйвере, находится в нескольких блоках __try __catch / __ except / __ finally, и я надеялся, что мог просто захватить неверные данные ... Я получаю дескриптор процесса и затем передаю его (после ProbeForRead) в RtlCopyMemory:

__try
{
    KeAttachProcess(myprocess);
    ProbeForRead((void*)address, len, 1);
    RtlCopyMemory((void*)buf, (void*)address, len);
    KeDetachProcess();
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
    DbgPrint("Exception.\n");
    status = STATUS_INVALID_PARAMETER;
    KeDetachProcess();
    return status;
}

Я делаю это очень часто, но в любом случае убедился, что отключаюсь.

Я должен использовать KeStackAttachProcess? Откуда взялся BSOD? Я неправильно улавливаю ошибки? Спасибо! И да, я читаю из пользовательского приложения.


person mutilis    schedule 01.04.2016    source источник
comment
может быть, есть какой-то способ проверить, находится ли адрес в приложении пользовательского пространства? Благодарность!   -  person mutilis    schedule 01.04.2016


Ответы (1)


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

person mutilis    schedule 02.04.2016