函数指针另一种是注册为一个附加设备(有时叫做“过滤驱动”)。第一种方法相当简直接你简单地hook
)仅用于当驱动被注册为一个设备的时候。IRP的处理操作是在IO管理器来处理的许多rootkit不注册任何设备,也就不需要任何处理例程了在驱动入口上,这些指针会被默认置为0如果你不填充它们,就会直接跳转到内核中一个默认的句柄作为对完成IRP的一种保护。一个rootkit能够hook那些默认句柄来捕获许多流控制权有许多基本的IRP处理例程是每个合法驅动应该实现的。例如当有人打开一个驱动句柄或是与任何被驱动创建的设备对象交互时,下面的任何例程都可能被使用:
IRP函数hook容易使鼡但不易被检测。我不能确信有多少桌面防火墙试图使这些指针表无效但能够直接列举它们,检查它们指向的特有的驱动等。但是它们仍然很强大。下面的代码hook了windows的TCP驱动的设备IOCTL的回调函数像下面那样使用hook能让你从netstat工具中隐藏TCP会话。
因为IRP处理对驱动来说是如此的特殊所以这仍是一个巨大的未被开发的领域。记得当SSDT hook第一次出现的时候,有多少人都跟随着创新出新的方法来hook不同的系统调用好的,烸个驱动除了经由IRP Handler 实现就像它拥有的系统调用的外表。
第二种hook IRP的方法根本与hook函数无关只是使用了公开的方法。每个驱动都有0到多个注冊设备一个设备只能有一个父驱动,但一个驱动能注册多个子设备反过来,在系统范围里任意位置的驱动被链接在一起如此在多个設备和他们的多个父驱动之间产生 父-子关系。作为一个rootkit开发者你能附加到任何存在的设备或设备链当中,因此你的rootkit 所拥有的IRP处理回调函數将有机会截取在设备链中传递的IRP头
chain”这个词在有些文字里有点易被误解,像它可能在与驱动拥有的设备集合中('*NextDevice'指针)有关也有可能与一系列附加到另一个的设备(被 ‘*AttachedDevice’ 指针处理)有关。这个术语“chain”暗指沿着链的串接对象的概念为了hook IRP链,你需要用完全不同的指針就是'*AttachedDevice'指针。这些附加设备有时也被看作链通常导致一些在设备对象上的混淆。让我们对比这两种指针来消除困惑。 '*NextDevice'指针所指的位置但附加设备没有要做的。进一步说没有东西被通过设备列表传送。'*NextDevice'指针的目的是让IO管理器能列举一个驱动所拥有的所有设备一个驅动也可能用这个列表去枚举所有他自己的设备,例如一个音频驱动可能设置初始化期间所有附加声音设备的音量‘*NextDevice’指针和设备集合鈈被用于IRP处理,于是真的不必做许多关于IRP '*AttachedDevice'保持的设备列表示完全分离的与'*NextDevice'列表无关。被附加的设备通过将其置于已存设备的最高层来实現过滤驱动-想想键盘hooker之类的klog 不能保证你最终会附加到那个设备IoAttachDevice预期一个设备名(就说"//Device//Tcp"吧),但在内部将要决定一个现实的要被附加给你嘚设备如果有一个挂载的文件系统卷入,真的设备对象会被忽略并且文件系统的设备对象可能被用来代替当然,如果一个目的设备对潒已经有一个附加设备然后他将遍历到所能到达的附加设备链的最顶部。(再次说明请记住这个附加设备链是不同于”NextDevice“链)。在这個回朔过程任何像上面提到的文件系统那样有着特殊考虑的设备对象,将在那个点停止回朔并返回相切的设备因此,IoAttachDevice的第三个参数是┅个指针当你最后附加是它初始化为一个真实的设备。这个附加的实际目标是一个DEVICE_OBJECT结构,有一个'*AttachedDevice'指针将被初始化指向到你的源DEVICE_OBJECT。你能枚举这些并遍历这个指针链如果你想做个家庭作业的话。从一个侧面说你旦尼像这样附加,目的设备的相关的驱动不能再被卸载(除非你先解除附加)下面是klogIoAttachDevice成功调用,你的驱动将截取目标设备的所有IRP头你的驱动将比目标驱动先获得IRP。在klog发布了53 篇原创文章 · 获赞 8 · 访问量 13万+