一直想写点技术文章的,但是每次想起这事的时候没时间,有时间的时候又提不起兴致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)
分享到:
相关推荐
这是书的光盘。共分为两个部分,这是第一部分。 本书由浅入深、循序渐进地... 本章总结了在内核模式下的四种等待方法,读者可以利用这些方法灵活地用在自己的驱动程序中。最 后本章还介绍了如何对IRP的超时情况进行...
本章总结了在内核模式下的四种等待方法,读者可以利用这些方法灵活地用在自己的驱动程序中。最后本章还介绍了如何对IRP的超时情况进行处理。 10.1 定时器实现方式一 10.1.1 I/O定时器 10.1.2 示例代码 ...
8.5.7 打开两种键盘端口驱动寻找设备 131 8.5.8 搜索在KbdClass类驱动中的地址 133 8.6 Hook键盘中断反过滤 135 8.6.1 中断:IRQ和INT 136 8.6.2 如何修改IDT 136 8.6.3 替换IDT中的跳转地址 137 8.6.4 QQ的PS...
8.5.7 打开两种键盘端口驱动寻找设备 131 8.5.8 搜索在KbdClass类驱动中的地址 133 8.6 Hook键盘中断反过滤 135 8.6.1 中断:IRQ和INT 136 8.6.2 如何修改IDT 136 8.6.3 替换IDT中的跳转地址 137 8.6.4 QQ的PS...
教程下载地址获取方法: 第一步:打开下方链接,填写QQ邮箱,系统会往QQ邮箱发一封确认订阅邮件 第二步:打开QQ邮箱查看邮件,确认订阅,订阅成功后系统会自动把下载地址和解压密码一起发送到你QQ邮箱...
pcf8563_i2c1_r8_ruoge_ov2640通过给RTC驱动增加设备节点读取秒钟成功+直接读取I2C1获取秒钟值20160626_2201.7z http://blog.csdn.net/21cnbao/article/details/7919055 在Android源码树中添加userspace I2C读写...
4.5.7 打开两种键盘端口驱动寻找设备 81 4.5.8 搜索在kbdClass类驱动中的地址 83 4.6 Hook键盘中断反过滤 86 4.6.1 中断:IRQ和INT 86 4.6.2 如何修改IDT 87 4.6.3 替换IDT中的跳转地址 88 4.6.4 QQ的PS/2反过滤措施...
主要知识重点包括:Windows串口与键盘过滤驱动、Windows虚拟存储设备与存储设备过滤驱动、Windows文件系统过滤驱动、文件系统透明加密/解密驱动、Windows各类网络驱动(包括TDI过滤驱动及三类NDIS驱动),以及最新的...
4.5.7 打开两种键盘端口驱动寻找设备 81 4.5.8 搜索在kbdClass类驱动中的地址 83 4.6 Hook键盘中断反过滤 86 4.6.1 中断:IRQ和INT 86 4.6.2 如何修改IDT 87 4.6.3 替换IDT中的跳转地址 88 4.6.4 QQ的PS/2反过滤措施...
主要知识重点包括:Windows串口与键盘过滤驱动、Windows虚拟存储设备与存储设备过滤驱动、Windows文件系统过滤驱动、文件系统透明加密/解密驱动、Windows各类网络驱动(包括TDI过滤驱动及三类NDIS驱动),以及最新的...
4.5.7 打开两种键盘端口驱动寻找设备 81 4.5.8 搜索在kbdClass类驱动中的地址 83 4.6 Hook键盘中断反过滤 86 4.6.1 中断:IRQ和INT 86 4.6.2 如何修改IDT 87 4.6.3 替换IDT中的跳转地址 88 4.6.4 QQ的PS/2反过滤措施...
4.5.7 打开两种键盘端口驱动寻找设备 81 4.5.8 搜索在kbdClass类驱动中的地址 83 4.6 Hook键盘中断反过滤 86 4.6.1 中断:IRQ和INT 86 4.6.2 如何修改IDT 87 4.6.3 替换IDT中的跳转地址 88 4.6.4 QQ的PS/2反过滤措施...
4.5.7 打开两种键盘端口驱动寻找设备 81 4.5.8 搜索在kbdClass类驱动中的地址 83 4.6 Hook键盘中断反过滤 86 4.6.1 中断:IRQ和INT 86 4.6.2 如何修改IDT 87 4.6.3 替换IDT中的跳转地址 88 4.6.4 QQ的PS/2反过滤措施...
数据中心节能方案全文共3页,当前为第1页。数据中心节能方案全文共3...直接风侧节能冷却模式 当室外空气条件在设定值范围内时,直接风侧节能冷却模式利用风机和百叶从室外经过过滤器抽取冷风直接送入数据中心。百叶和风
当前协议逆向分析的方法主要有两种:基于网络报文序列采样匹配的静态分析方法和基于协议数据在应用程序执行时监控其指令序列轨迹的动态分析方法。其中,静态分析方法是以未知协议的网络报文序列为分析对象,釆样其...
8.4.3 使用两种数据绑定表达式 247 8.5 SQL Server 2005 Express 概述 248 8.5.1 SQL Server Express 特性 248 8.5.2 SQL Server 2005 Express管理工具 249 8.5.3 服务器端数据库与本地数据库 250 8.6 数据库驱动的...
该工具最好的功能之一是它会自动执行两种类型的扫描,即快速扫描和深度扫描。更好的是,即使扫描过程没有完成,您也可以轻松地管理和分析发现的文件。 就像大多数此类现代应用程序一样,Apeaksoft Data Recovery 为...
使用者可以通过该软件在计算机、数码相机、SD/存储卡、USB闪存驱动器或其他存储媒体上只需三步即可恢复各种类型的已删除文件,且软件支持通过过滤文件类型或直接搜索文件名称快速查找已删除的文件,并拥有强大的扫描...