debugging 在内核windbg调试中仅从目标进程中断系统调用

x0fgdtte  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在调试一个用户模式进程**“myprocess。exe”其中有一个长时间运行的操作,不断地做系统调用内核模式,我怎么能在syscalls上中断,例如:我想中断并检查所有从“myprocess调用的ZwCreateEvent调用。exe”?如果我只执行bp nt!ZwCreateEvent,我会从整个系统中获得数千个断点,与“myprocess无关。exe”,并且无法捕获来自“myprocess的请求。exe”**
我知道有条件断点,但我没有一个可以绑定自己的特定参数(具有常量已知值或字符串的参数)

bzzcjhmw

bzzcjhmw1#

您可以使用bp /p命令(doc)为每个进程设置内核断点:
/p EProcess(仅限内核模式)指定与此断点关联的进程。EProcess应该是EProcess结构的实际地址,而不是PID。仅当在此进程的上下文中遇到断点时才触发断点。
要获取EPROCESS结构(它表示内核区域中的进程对象),可以发出!process命令:
使用记事本的示例:

0: kd> !process 0 0 notepad.exe
PROCESS ffffbe8e593d3080
    SessionId: 14  Cid: 74bc    Peb: 2d7c91c000  ParentCid: 8a94
    DirBase: a2faeb002  ObjectTable: ffffa981f4ce3a40  HandleCount: 246.
    Image: notepad.exe

输出顶部的十六进制数(上面的ffffbe8e593d3080)是EPROCESS结构的地址。如果您有多个同名的进程,您可以使用Cid(也称为PID,进程标识符)来区分它们。
设置BP:

0: kd> bp /p ffffbe8e593d3080 nt!ZwCreateEvent

在内核模式下调试一个用户态进程有时候有点做作。我建议在用户模式下使用windbg调试您的进程,并在用户/内核边界(即ntdll.dll)设置断点,简单地:

0:004> bp ntdll!ZwCreateEvent

请注意,在本例中(从用户模式调试器),您正在执行syscall(转换到内核模式)的函数中设置断点:

0:004> u ntdll!ZwCreateEvent
ntdll!NtCreateEvent:
00007ffa`d1d8d950 4c8bd1          mov     r10,rcx
00007ffa`d1d8d953 b848000000      mov     eax,48h
00007ffa`d1d8d958 f604250803fe7f01 test    byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1
00007ffa`d1d8d960 7503            jne     ntdll!NtCreateEvent+0x15 (00007ffa`d1d8d965)
00007ffa`d1d8d962 0f05            syscall
00007ffa`d1d8d964 c3              ret

显然,您将无法从那里进入内核模式。

相关问题