无符号文件的驱动中断DriverEntry方法
当我们调试有符号的windows驱动时,通常可以使用bu module!DriverEntry
, 在模块的DriverEntry位置打上断点。
那么对于无符号驱动,应该如何找到DriverEntry函数的位置呢?
从正常的DriverEntry的调用栈栈中可以看到驱动加载的调用路径基本上如下所示。
nt!IopLoadDriver->nt!PnpCallDriverEntry->module!DriverEntry
虽然每个系统的实现可能存在差异,但是基本上都会调用到IopLoadDriver函数。
因此,我们可以使用uf nt!IopLoadDriver
命令查找 nt!IopLoadDriver
的下层调用。
上图中可以看到在pe文件后,又通过nt!PnpCallDriverEntry
进入了下层函数。
然后在反汇编窗口中可以发现,这里通过CFG的派遣调用方式执行了RAX指向的函数。
因此,我们在上图红色位置打下断点,等待内核执行到这里,查看RAX的地址。即驱动的DriverEntry入口点。
_guard_dispatch_icall
描述:_guard_dispatch_icall是CFG机制的派遣函数。在内核中,许多函数都需要进行间接调用,出于安全性考虑,避免目标地址被控制,因此不会直接CALL目标地址,而是先通过_guard_dispatch_icall检查地址合法性,并由其进行调用,如果地址合法,它的作用相当于「CALL RAX」。