张老师:
你好!
上次在上海的openparty上请教了一下softice下bpload在windbg下的实现。你回答是通过Event Filter来实现。我现在按照如下步骤来做,但去无法实现,请教了。步骤如下:
1、在host机器上,选择Debugging-->event filter的Load module,设置 Argument为“Kernel32.dll”或者是我自己的一个“1.dll”;设置Execution为enable,continue为Handled.
2、在虚拟机上,随便启动一个进程,因为一般会加载Kernel32.dll,但我始终无法中断到host的debugger上。
3、查看启动的进程,肯定加载了Kernel32.dll或1.dll,而且肯定1.dll一定是整个操作系统里第一次加载的dll。因为kernel32.dll一般不会是第一次,我排除了这种可能性。
我的环境是:host:vista64+windbg amd64
debuggee :xp 32 sp2
你描述的是内核调试会话,而Kernel32.dll是个用户态模块,所以没有如你所期望的中断到调试器。如果想继续在内核会话试验,那么可以试验一个驱动模块。如果想监视用户态DLL加载,那么可以调试一个应用程序,在用户态会话中做实验。
多谢客气(很多人问问题很凶的:-))
event filter可以用于内核事件,也可以用于用户态,但是内核会话通常不处理用户态事件,这是为了防止频繁的用户态事件影响内核调试,要知道内核调试是依赖双机通信的,每次中断到调试器至少要花毫秒级的时间,因此这是by design。
对于你的问题,如果你真想通过内核调试来解决这个问题,那么可以在nt!DbgkMapViewOfSection(《软件调试》P199)设个条件断点。
其实,不知道你要解决什么问题:
如果是DLL在某个进程中崩溃,那么可以用JIT调试;
如果只在某个进程中有问题,那么可以在启动这个进程时自动启动调试器;
如果在所有进程中都有问题,那么可以使用用户态会话随便调试一个进程;
如果想挑战一下WinDBG的功能到底有多强,那么它就这个样...... :-)