x64内核:过滤驱动
Hook驱动的方法
1. 将驱动的回调替换掉——Hook驱动的IRP
缺点:如果是异步操作,那么Hook的时候很大概率是拿不到数据的
2. 分层驱动 —— 给需要Hook的驱动加一层驱动(即过滤驱动)
IoAttachDevice 附加到设备上,不管同步还是异步都可以收到数据
如果在本层驱动完成了请求,那么下层驱动就收不到了
需要设置一样的通信方式、跳过当前IRP堆栈 IoSkipCurrentIrpStackLocation 、调下层驱
动 IoCallDriver
拿信息需要注册请求完成的回调 IoSetCompletionRoutine ,请求完成了会调用此回调,且
在回调用要有引用计数,在驱动卸载的时候注销回调(先取消Hook驱动、判断所有派遣都没
人调用之后,在返回)
如果下层有的派遣函数,上层也必须实现派遣(实现全部派遣,派发给下层,感兴趣的单独
实现)
关于IRP:http://www.cppblog.com/momoxiao/archive/2009/12/30/104470.html
过滤驱动
相关API
IoAttachDevice
将调用方的设备对象附加到一个命名的目标设备对象,以便为目标设备绑定的I/O请求首先路由到调用
方
IoDetachDevice
在调用方的设备对象和下一个驱动程序的设备对象之间释放一个附加设备
NTSTATUS IoAttachDevice(
PDEVICE_OBJECT SourceDevice, // 指向调用者创建的设备对象的指针
PUNICODE_STRING TargetDevice, // 指向缓冲区的指针,该缓冲区包含要附加指定
SourceDevice的设备对象的名称
PDEVICE_OBJECT *AttachedDevice // 指向指针的调用者分配存储的指针。返回时,如果附加
成功,则包含指向目标设备对象的指针
);
void IoDetachDevice(
PDEVICE_OBJECT TargetDevice // 指向下层驱动程序的设备对象的指针。调用方先前成功调用了
IoAttachDevice或IoAttachDeviceToDeviceStack以获取此指针
);
评论0