一直想写点技术文章的,但是每次想起这事的时候没时间,有时间的时候又提不起兴致J。
我们有时候需要从系统中某些驱动处理数据的方式,例如作一些过滤、对数据进行一些修改或者监视通过某个设备栈的数据等等。通常情况下是采用Filter Driver的方式实现。但是这样有种种局限性:容易暴露自己的存在、有些情况下可能不能再Detach掉,升级驱动的时候必须重启机器等等。
这里介绍两种通过HOOK方式截取数据的方法。
1、 Hook Dispatch例程。
首先通过ObReferenceObjectByName等函数拿到被Hook设备的DriverObject。有了这个之后,我们就可以用指向自己例程的指针改写MajorFunction数组里面的指针。
NTSTATUS ntStatus = STATUS_SUCCESS;
UNICODE_STRING wszDriverName;
PDRIVER_OBJECT pDriverObject = NULL;
PDRIVER_DISPATCH pOrgDispatch = NULL;
RtlInitUnicodeString( &wszDriverName, DRIVER_NAME);
ntStatus = ObReferenceObjectByName( &wszDriverName,
0,
NULL,
0,
*IoDriverObjectType,
//NULL,
KernelMode,
NULL,
(PVOID*)&pDriverObject);
if( !NT_SUCCESS(ntStatus))
{
DbgPrint( “ObReferenceObjectByName Fail.\r\n”);
return FALSE;
}
pOrgDispatch = (PDRIVER_DISPATCH) InterlockedExchange( ( PLONG)&pDriverObject->MajorFunction[IRP_MJ_READ], (LONG)&DispatchMyRead);
……
卸载的时候同样这样修改回去即可。
这种方法比较方便,由于只需要改写一个函数指针,避免了inline hook的很多不稳定因素。另外,在调用原来的Dispatch例程的时候也只需要直接call它就行了。
但是,如果有些IRP不能立即完成的,例如键盘鼠标驱动的IRP,用这种方法就拿不到完成时候的数据了。因此我们还需要第二种方式J
2、 Hook Completion Routine。
在Hook掉的Dispatch里面,我们已经拿到了发到下层驱动的IRP。想在完成时再获得控制权,很简单,只需要再Hook掉Completion Routine。
NTSTATUS DispatchMyRead ( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp)
{
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp);
//需要保存一下旧的完成例程信息
g_RecentIrpInfo.ComplettionRoutine = irpSp->CompletionRoutine;
g_RecentIrpInfo.Context = irpSp->Context;
g_RecentIrpInfo.Control = irpSp->Control;
g_RecentIrpInfo.irpSp = irpSp;
//安装自己的完成例程
irpSp->CompletionRoutine = MyIoCompletion;
irpSp->Context = NULL;
irpSp->Control = SL_INVOKE_ON_SUCCESS;
(来自:码农源库,http://www.vcclass.net/wordpress/?p=339)
分享到:
相关推荐
1. **驱动模型理解**:理解KMDF(Kernel-Mode Driver Framework)或WDM(Windows Driver Model)驱动模型,它们是Windows平台上的两种主要驱动开发框架。KMDF更现代化,简化了驱动的编写,而WDM则更灵活,但复杂度较...
简单串口过滤驱动通常由两部分组成:上滤驱动和下滤驱动。上滤驱动接收来自用户模式应用程序的I/O请求,对其进行处理(例如,添加日志、修改数据等),然后将经过处理的请求传递给下一个驱动(即系统串口驱动)。下...
总结,U盘过滤驱动是一种实用的技术,它可以用于数据保护、企业信息安全等领域。通过编写C++驱动程序,我们可以定制特定的设备行为,如将U盘设置为只读。然而,这也需要开发者具备深厚的系统编程知识和丰富的驱动...
在IT行业中,文件系统过滤驱动(File System Filter Driver)是一种特殊的驱动程序,它在操作系统内核层拦截并处理文件系统操作。这种驱动通常用于增强或修改标准文件系统的行为,例如数据备份、加密、权限控制等。...
由于文件系统过滤驱动的特殊地位,任何错误都可能导致严重的系统不稳定甚至数据丢失。因此,编写安全、可靠的驱动至关重要。教程将讨论如何遵循最佳实践,确保驱动的安全性和稳定性。 十、实战案例分析 教程可能...
文件系统过滤驱动是一种特殊类型的驱动程序,它能够拦截和控制对文件系统的输入/输出(I/O)操作,如创建、读取、写入、重命名等文件操作。通过这些能力,开发者可以实现诸如反病毒保护、数据安全增强、备份机制以及...
创建这两种过滤器驱动程序的机制基本相同,因为它们都有着与功能驱动程序类似的框架结构。过滤器驱动程序通过监视、拦截和修改IRP流的方式,可以在不改变现有驱动程序的基础上,方便地改进或增加现有驱动程序的功能...
文件系统过滤驱动(File System Filter Driver)是一种运行在操作系统内核级别的软件组件,主要用于拦截和处理通过文件系统进行的读写操作。这种类型的驱动程序位于用户应用程序与底层存储设备之间,能够对文件系统...
通过学习这两个教程,开发者可以掌握创建自定义文件系统过滤驱动和TDI过滤驱动的技术,从而能够设计出满足特定需求的解决方案,例如增强数据保护、优化文件访问性能或实现定制的网络策略。在实际应用中,这些技术...
过滤驱动则是USB驱动模型中的一种特殊类型,其主要任务是在设备与系统之间建立一个中介,实现对USB设备的特定控制或过滤。 在这个USB过滤驱动程序框架中,我们看到它基于DriverWorks生成。DriverWorks是一个专业...
2. **选择Driver Model**:Windows提供了两种模型:WDM(Windows Driver Model)和KMDF(Kernel-Mode Driver Framework)。KMDF更适合开发Filter Drivers,因为它提供了更高级别的抽象和错误处理机制。 3. **编写...
1. **驱动程序模型**:Windows驱动程序主要采用两种模型,即Windows NT驱动程序框架(WDF)和Windows驱动模型(WDM)。WDM适用于各种类型的驱动,包括磁盘过滤驱动。它允许驱动程序在系统内核模式下运行,从而可以...
文件过滤驱动(File System Filter Driver)是一种内核模式驱动程序,它可以在文件系统驱动之上,对文件系统的I/O请求进行处理。通过注册回调函数,文件过滤驱动可以拦截任何对文件或目录的操作,如打开、关闭、读取...
IFS(Installable File System)过滤驱动是Windows操作系统中用于文件系统操作的一种中间层,它允许开发者在文件系统和应用程序之间插入自定义逻辑,实现对文件系统操作的拦截和处理。本教程将详细介绍IFS过滤驱动的...
Windows提供了两种主要的文件系统过滤驱动模型:Legacy Filter Driver(传统过滤驱动)和Kernel-Mode Filter Driver(内核模式过滤驱动)。其中,Kernel-Mode Filter Driver通常使用FltMgr(Filter Manager)框架,...
透明过滤驱动是一种特殊的驱动程序,它工作在文件系统层,对文件的读写操作进行拦截和处理,而不改变应用程序的原有行为。本主题聚焦于名为“tooflat”的透明过滤驱动,这对于那些从事文件透明加解密工作的人来说,...
Windows提供两种主要的文件系统过滤驱动模型:文件系统迷你过滤驱动(Minifilter)和旧版的文件系统驱动(Filter Manager)。Minifilter模型是推荐的,因为它提供了更安全、更稳定的接口,并且有更好的扩展性。文件...
文件系统过滤驱动在Windows系统中起着至关重要的作用,它们允许开发者对文件系统操作进行拦截、修改或增强,以实现特定的功能,如数据保护、安全控制、备份和恢复等。 在Windows平台上,文件系统过滤驱动主要基于...