我想要做的是在我指定的模块调用的nt中的所有函数上设置一个条件断点。
我这样做的目的是每次X模块调用x nt函数时编写callstack,从而能够“映射”obfusicated代码内部的内容。
在输入点断开后,我在x nt函数上设置了一个断点。恢复后我的断点被击中,并且callstack看起来像
NT!功能
moduleIspecified!为0x123
...
我的想法是,我可以使用它来编写条件断点的代码,例如:“ IF调用者是x模块,模块调用y模块中的函数THEN日志调用堆栈。 ”
值得注意的是x64内核模式不支持监视和跟踪。 还值得一提的是我决定使用这种方法的这种方法,因为我无法通过静态分析来确定调用,并且通过步进来分析它也是不可能的。
而且:是否有更好/理想的方法来实现这一目标?
此致
答案 0 :(得分:1)
你不能准确地做到这一点,但你可以考虑一些替代方案。
首先 - 为什么不简单地使用Sysinternals' Process Monitor或Rohitab's API Monitor?
如果您一直在自己这样做,那么您面临的第一个问题是内核调试器可以设置的断点数量有少量限制(32是我记得的最后一个数字)。此限制不是由主机WinDbg / kd引起的,而是由目标计算机中的内核调试器组件引起的。你可以在WRK中看到这一点。但即使你可以,也会非常缓慢。
您拥有的第一个替代方案是syscall
/ sysenter
例程(nt!KiFastCallEntry
,nt!KisystemCall64
,或今天的任何内容)中的断点,然后放置你的命令。正如我所说的那样,非常缓慢。如果你不相信我,欢迎你自己尝试(即使没有聪明的条件,只要在那里放任何命令,即使只是一个简单的gc
,更不用说.echo
...... )。
我能想到的第二个选择是编写一个挂钩你感兴趣的系统调用的驱动程序(或syscall
例程)。这样可以节省主机和目标机器之间的往返。请注意,您仍需要附加调试器以禁用KPP(PatchGuard)或使用32位计算机。它可能比使用ProcMon,API Monitor或者xperf / WPT更复杂。
我建议在使用过于复杂的东西之前使用简单明了的东西(ProcMon / API Monitor)。