2016-04-01 25 views
1

Ich versuche, den Speicher eines anderen Prozesses über Kernel Modustreiber auszulesen. Es funktioniert und ich injiziere den Treiber in den Raum von einen anderen Treiber, damit es funktioniert (oder könnte nur Testmodus aktivieren).Kernel-Modus Win10-Treiber BSOD, wie in C++ zu fangen?

Allerdings funktioniert es gut, aber wenn ich eine falsche Adresse gebe, ergebe ich eine BSOD.

ist hier Informationen über ein Beispiel 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. 

Als ich den Treiber in den anderen Fahrer injiziert, die Symbole usw. können nicht aufgelöst werden. Es gibt einige zusätzliche Informationen:

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} 

Nun zu dem, was ich tue: ich den Treiber 4 Werte geben und haben einen globalen Puffer zu Schreibwerte ausgelesen:

char buf [5000]; NTSTATUS DevioctlDispatch ( In struct _DEVICE_OBJECT * Device, Inout struct _IRP * Irp ) alles, was ich im Treiber tue, ist in mehreren __try __catch/__ außer/__ schließlich Blöcke und ich hoffte, konnte ich nur falsch greifen lesen outs ... I der Prozess handle ich immer und es dann passieren (nach ProbeForRead) zu 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; 
} 

ich dies sehr oft tue, aber ich sicher, dass ich in ein Trennen In jedem Fall.

Soll ich KeStackAttachProcess verwenden? Woher kommt der BSOD? Fange ich Fehler falsch? Vielen Dank! Und ja, ich lese von einer Userspace-Anwendung.

+0

vielleicht gibt es eine Art von Methode zu überprüfen, ob die Adresse in der Userspace-Anwendung ist? Vielen Dank! – mutilis

Antwort

0

Da ich noch kein gültiges Zertifikat habe, verwende ich einen Exploit in der vboxdrv, um meinen Treiber zu laden (um nicht auf einem Testsystem zu sein). Aber ich habe gerade herausgefunden, dass es SEH nicht unterstützt. Deshalb versuche ich/außer nichts zu korrigieren ... Warte nur auf mein Zertifikat oder benutze stattdessen den Testmodus.