Windows驱动程序加载的入口函数为DriverEntry,通过调试该函数,很容易可以找出驱动程序的派遣函数,接着可以调试分析自己感兴趣的IRP。但是,首先,需要在windbg中设置断点,使得驱动程序加载的时候可以执行单步调试。这里有2种办法可以尝试。
第一种方法,直接通过计算驱动程序的入口地址,下断点即可。比如有些第三方驱动程序,可能会动态加载或者卸载,但是很多时候,再次加载的时候驱动的模块在内存中的地址仍然是保持不变的。
驱动模块加载后,比如加载 abc.sys,
(1)输入执行lm命令,查看到该驱动模块的起始和结束地址,如 f891d000 f8923500 abc,起始地址为f891d000 。
(2)接着输入命令 bp BaseAddress+poi(poi(BaseAddress+0x3c)+BaseAddress+0x28) 对于abc.sys来说,BaseAddress为f891d000 。输入bp命令下载断点即可,下次加载驱动程序的时候进入断点进行单步调试。
第二种方法,对于一些系统自带的驱动模块,可以在windbg连接上目标调试机后通过bp命令设置断点,比如 bp usbprint!DriverEntry。然后输入F5或者g进一步启动目标调试系统,等到该驱动程序加载的时候,即可执行断点,进行单步调试。