我正在调试一个用户模式进程**“myprocess。exe”其中有一个长时间运行的操作,不断地做系统调用内核模式,我怎么能在syscalls上中断,例如:我想中断并检查所有从“myprocess调用的ZwCreateEvent
调用。exe”?如果我只执行bp nt!ZwCreateEvent
,我会从整个系统中获得数千个断点,与“myprocess无关。exe”,并且无法捕获来自“myprocess的请求。exe”**
我知道有条件断点,但我没有一个可以绑定自己的特定参数(具有常量已知值或字符串的参数)
1条答案
按热度按时间bzzcjhmw1#
您可以使用
bp /p
命令(doc)为每个进程设置内核断点:/p EProcess(仅限内核模式)指定与此断点关联的进程。EProcess应该是EProcess结构的实际地址,而不是PID。仅当在此进程的上下文中遇到断点时才触发断点。
要获取
EPROCESS
结构(它表示内核区域中的进程对象),可以发出!process
命令:使用记事本的示例:
输出顶部的十六进制数(上面的
ffffbe8e593d3080
)是EPROCESS结构的地址。如果您有多个同名的进程,您可以使用Cid
(也称为PID,进程标识符)来区分它们。设置BP:
在内核模式下调试一个用户态进程有时候有点做作。我建议在用户模式下使用windbg调试您的进程,并在用户/内核边界(即
ntdll.dll
)设置断点,简单地:请注意,在本例中(从用户模式调试器),您正在执行syscall(转换到内核模式)的函数中设置断点:
显然,您将无法从那里进入内核模式。