天天看点

windbg拦截驱动加载

驱动的加载有几种方式,查看CreateService就可以知道。

1、SERVICE_BOOT_START = 0x00000000,被系统loader加载,这类驱动是最早加载的。驱动文件必须放在C:\Windows\System32\drivers目录下,因为此时系统只能读注册表,不能打开文件,不能打出调试信息。看了下面的分析就清楚了。

2、SERVICE_SYSTEM_START = 0x00000001,系统初始化完成后才加载的

3、SERVICE_DEMAND_START = 0x00000003,手动加载

(本文作者附注:原文作者可能是通过sc create service的方式加载legend驱动,对于wdm类型--即支持Pnp的驱动也通过nt!MmLoadSystemImage加载驱动)

环境:win7 32bit,

目标:拦截hookport.sys

方法:

通常拦截驱动,可以在nt!MmLoadSystemImage下断点。

1、显示驱动全名并显示驱动基址:

bp nt!MmLoadSystemImage".if(1){!ustr poi(esp+4); dd poi(esp+0x18);}.else{gc;}"

poi(esp+0x18)就是保存驱动基址的指针ImageBaseAddress

2、nt!MmLoadSystemImage返回后,dd ImageBaseAddress,显示的就是驱动基址

3、给驱动起点函数下断点

bp 驱动基址+poi(poi(驱动基址+0x3c)+ 驱动基址+0x28)

4、运行,就停在驱动的起点函数

NTSTATUS
MmLoadSystemImage (
    IN PUNICODE_STRING ImageFileName,
    IN PUNICODE_STRING NamePrefix OPTIONAL,
    IN PUNICODE_STRING LoadedBaseName OPTIONAL,
    IN BOOLEAN LoadInSessionSpace,
    OUT PVOID *ImageHandle,
    OUT PVOID *ImageBaseAddress
    )      

​​​

windbg拦截驱动加载

​​​

但是hookport.sys就不能用上面的方法来,因为它的加载类型是SERVICE_BOOT_START,如下图:

​​​

windbg拦截驱动加载

​​通过研究系统,可以用下面的断点:

下断点bp nt!PnpInitializeBootStartDriver".if(1){!ustr poi(esp+8);}.else{gc;}",此时可以显示驱动的注册表信息

​​​

windbg拦截驱动加载

​​断下来后,在nt!IopInitializeBuiltinDriver里面找第一个call    dword ptr [eax],

​​​

windbg拦截驱动加载

​​下断点即可,跟进去就是驱动的入口点了

​​​

windbg拦截驱动加载

​​

kd> sxe ld:hookport.sys
kd> g
nt!DbgLoadImageSymbols+0x47:
83a55fa6 cc              int     3
kd> lmvm hookport
start    end        module name
8f263000 8f284e80   hookport (deferred)   

kd> bp 8f263000+poi(poi(8f263000+3c)+8f263000 +28)

kd> g