Kernel 在模块调用的所有函数上设置条件断点?(WINDBG x64)

Kernel 在模块调用的所有函数上设置条件断点?(WINDBG x64),kernel,conditional,windbg,breakpoints,callstack,Kernel,Conditional,Windbg,Breakpoints,Callstack,我想做的是在我指定的模块调用的nt中的所有函数上设置一个条件断点 我这样做的目的是每次X模块调用X nt函数时都编写callstack,从而能够“映射”出对象化代码内部的情况 在entrypoint上中断后,我在xnt函数上设置了一个断点。恢复后,我的断点被命中,调用堆栈看起来像 新界!作用 模块指定!0x123 我当时的想法是,我可以用它来为条件断点编写代码,类似于:“如果调用方是x模块,并且模块在y模块内调用函数,则记录调用堆栈。” 值得注意的是,x64内核模式不支持监视和跟踪。 还值得一

我想做的是在我指定的模块调用的nt中的所有函数上设置一个条件断点

我这样做的目的是每次X模块调用X nt函数时都编写callstack,从而能够“映射”出对象化代码内部的情况

在entrypoint上中断后,我在xnt函数上设置了一个断点。恢复后,我的断点被命中,调用堆栈看起来像

新界!作用

模块指定!0x123

我当时的想法是,我可以用它来为条件断点编写代码,类似于:“如果调用方是x模块,并且模块在y模块内调用函数,则记录调用堆栈。

值得注意的是,x64内核模式不支持监视和跟踪。 还值得一提的是,我决定使用这种方法,因为我无法通过静态分析来确定调用,而通过步进分析也不可能

还有:是否有更好/理想的方法来实现这一点?


关于

你不能精确地做到这一点,但是你可以考虑一些替代方案。

首先-为什么不简单地使用或可能

如果你执意自己去做,你面临的第一个问题是,内核调试器可以设置的断点数量有一个很小的限制(32是我记得的最后一个数字)。此限制不是由于主机WinDbg/kd造成的,而是由于目标计算机中的内核调试器组件造成的。你可以在WRK中看到这一点。但即使你可以,它也会非常缓慢

第一种选择是在
syscall
/
sysenter
例程(
nt!KiFastCallEntry
nt!KisystemCall64
,或今天的任何程序)中只保留一个断点,然后将您的命令放在那里。正如我所说,这将是非常缓慢的。如果您不相信我,欢迎您自己尝试(即使没有聪明的条件,也只需在那里输入任何命令,即使只是一个简单的
gc
,更不用说
.echo
…)

我能想到的第二种选择是编写一个驱动程序,用于钩住您感兴趣的系统调用(或
syscall
例程)。这样可以节省主机和目标计算机之间的往返时间。请注意,仍然需要附加调试器才能禁用KPP(PatchGuard)或使用32位计算机。它可能比使用ProcMon、API监视器或xperf/WPT更复杂

我建议先使用简单明了的东西(ProcMon/API监视器),然后再使用过于复杂的东西