2016-04-01 4 views
1

私はカーネル モードドライバを使って別のプロセスのメモリを読み出そうとしています。それは動作していると私はそれを動作させる(またはテストモードを有効にすることができます) 別のドライバのスペースにドライバを注入しています。カーネルモードのWin10ドライバBSOD、C++でのcatch方法

しかし、間違ったアドレスを与えると、私は 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. 

私は他のドライバにドライバを注入するように、シンボルなどが を解決できません。私はに値を読み出すドライバ4つの値を与えると 書き込みにグローバルバッファを持っています:

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} 

私がやっているものに:いくつかの追加情報があります

のchar bufが[5000]; NTSTATUS DevioctlDispatch(構造体_DEVICE_OBJECTで *デバイスオブジェクト、 INOUT構造体_IRP * Irp分 )__ finallyブロックと私はちょうど間違っつかむ可能性が望んだ/除いて、私はドライバーにやっている すべてが複数の__tryに __catch/__です アウト... を読んで、私は、プロセスハンドルを取得し、それを渡す(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; 
} 

私は非常に頻繁にこれをやっていますが、私は中に取り外しを確認しましたnyの場合。

私はKeStackAttachProcessを使用する予定ですか? BSODはどこから来ていますか? エラーをキャッチしていますか?ありがとう!そして、はい、私はuserspaceアプリケーションから読んでいます。

+0

多分、アドレスがユーザ空間アプリケーションにあるかどうかをチェックする方法がありますか?ありがとう! – mutilis

答えて

0

私はまだ有効な証明書を持っていないので、vboxdrvで私のドライバを読み込むために悪用しています(テストシステムではないためです)。しかし、私はSEHをサポートしていないことを知りました。したがって、私のtry/exceptは何も修正されません...ただcertを待つか、代わりにテストモードを使用する必要があります。