一直想写点技术文章的,但是每次想起这事的时候没时间,有时间的时候又提不起兴致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平台上,文件系统过滤驱动主要基于...