导航:首页 > 净水问答 > 文件过滤驱动取消irp

文件过滤驱动取消irp

发布时间:2022-09-13 00:41:41

『壹』 遇到流氓软件应该怎么解决

预防 防范流氓软件第一步,就是要有安全的上网意识,不要轻易登陆不了解的网站,因为这样很有可能会中网页脚本病毒,从而使系统中上流氓软件。不要随便下载不熟悉的软件,如果用户不了解这些软件,当这些软件中捆绑一些流氓软件时,用户也无法察觉。安装软件时应仔细阅读软件附带的用户协议及使用说明,有些软件在安装的过程中会以不引起用户注意的方式提示用户要安装流氓软件,这时如果用户不认真看提示的话,就会安装上流氓软件,由于这是用户自己选择的,因此,用户不会受到保护。 在安装操作系统后,应该先上网给系统打补丁,补住一些已知漏洞,这样能够避免利用已知漏洞的流氓软件的驻留。如果用户使用IE浏览器上网,则应该将浏览器的安全级别调到中高级别,或者在自定义里,将ACTIVEX控件、脚本程序都禁止执行,这样能够防止一些隐藏在网页中的流氓软件的入侵。判断 第二步,判断自己是否已经中了流氓软件。这要根据流氓软件的中招症状来看。一般地,浏览器首页被无故修改、总是弹出广告窗口、CPU的资源被大量占用、系统变得很慢、浏览器经常崩溃、或出现找不到某个DLL文件的提示框,这些是流氓软件最常见的现象,如果发现计算机中出现这些现象,则很有可能是中了流氓软件,就要采取相应的措施,而如果出现CPU的资源被大量占用,系统变得很慢这样的情况,则很有可能是中了多种流氓软件的原因,更应该尽快进行相应处理。 确诊自己中了流氓软件 氓软件无论多么复杂,它们的传播流程几乎是一样的,都是会通过软件捆绑或网页下载先进入到计算机的一个临时目录里,一般是是系统的根目录或者系统默认的临时目录,然后将自己激活,这时流氓软件进入内存中正常运行。当流氓软件正常运行时,为了下一次能够自动运行,它们往往会修改注册表的自启动项,从而达到自动启动的目的。然后流氓软件会将自己拷贝到系统目录隐藏起来,然后将临时的安装文件删除,最后jian听系统端口,进行各种各样的流氓行为。 如果用户喜欢下载安装一些小的工具软件,或者去一些小的网站上浏览网页,虽然计算机没有出现上述现象,但是也有可能中流氓软件,这时也应该关注一下计算机,看是否真正中招,这时就可以按照流氓软件的这个传播链去一一排查。首先利用一些第三方的内存查看工具,看看内存中是否有一些可疑的进程或线程,这需要用户对系统中的进程或一些常用软件的进程有所了解,这样才有可能看出问题。其次,用户在查看进程的过程中应该看看这些进程的路径,如果有一些进程的路径不是正常的安装目录,而是系统的临时目录,那八成是流氓软件。 另外,用户还要看看注册表里(开始菜单的运行框里键入REGEDIT)的自启动项(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run)里是否有一些用户不认识的程序键值,这些很可能就是流氓软件建立的。行动 确诊自己中了流氓软件,清除就相对比较简单了。对于已知的流氓软件,建议用户用专门的清除工具进行清除。 在这里不建议用 户自己手工清除流氓软件,因为流氓软件越来越复杂,已经不再是那种简单的删除多个文件就能解决的了,很多流氓软件在进入系统之前,就对系统进行了修改和关联,当用户擅自删除流氓软件文件时,系统无法回复到最初的那个状态,而导致流氓软件虽然清除了,但系统也总是出现各种错误。而专业的清除工具往往已经考虑到这一点,能够帮助用户完全恢复系统。 如果在一些特殊场合用户需要手动清除流氓软件时,则按照流氓软件的传播链条,按照先删除内存的进程,再删除注册表中的键值,最后再删除流氓软件体,将系统配置修改为默认属性 这样一个过程进行处理。

『贰』 Trojan/Rootkit.o 是什么病毒,有什么危害

键盘记录器Rootkit”

此病毒是一个Rootkit病毒,由C语言编写的过滤驱动程序,提供键盘按键记录功能。

该Rootkit病毒近期多次被Trojan.PSW.Win32.GameOnline型的病毒释放使用,在该病毒体内可以看到“C:\new-gamehack\GameHack\Driver\bin\i386\mssock.pdb”的字样,从编译路径可以看出该Rootkit显然是作者特意为盗取游戏密码病毒所写。

1、该病毒驱动程序入口函数执行如下操作:

(1) 检查系统是否存在USB键盘设备:病毒首先通过调用ObReferenceObjectByName函数得到\Driver\hisb的驱动对象,然后遍历该驱动对象创建的功能设备的设备链。对设备链上的每个设备对象,遍历其所在的设备栈,对设备栈上的每个设备对象,通过 DEVICE_OBJECT->DriverObject->DriverName获取每个设备的驱动名称,比较是否是Driver\kbdhid,如果找到表示有USB键盘设备,得到USB键盘设备对象的指针。

(2)对键盘设备挂接过滤驱动:建立名称为“\Device\mssock”、符号链接名为“\??\mssock”、类型为“FILE_DEVICE_UNKNOWN”的设备,然后通过调用函数IoAttachDeviceToDeviceStack将该设备挂接到键盘设备所在的设备栈。

对于USB键盘设备,挂接的目标设备为通过前面搜索得到的USB设备对象。对于没有USB键盘设备的情况,通过调用IoGetDeviceObjectPointer获取名称为“\Device\KeyboardClass0”的PS/2 键盘设备作为目标设备。

(3)填写功能函数地址:填充卸载例程及各个IRP处理例程回调。

2、病毒的IRP_MJ_READ处理例程:设置完成例程后直接调用IofCallDriver向下一设备传递IRP

3、病毒驱动设立的对键盘读的irp包的完成例程:在该完成例程中,病毒驱动实现了获取并记录键盘按键的功能。病毒将读到的按键记录到缓冲区(通过DEVICE_OBJECT.DeviceExtension传递地址)。同时病毒作者在这里和IRP_MJ_DEVICE_CONTROL例程中通过写0x60端口发送命令控制键盘NumLock灯的开闭,可能是作者为了调试时能够方便的知道其过滤驱动的工作情况。

4、病毒驱动的IRP_MJ_DEVICE_CONTROL处理例程:在这个处理例程中,病毒对值为“0x 80102180”和“80102184”的IOCTL进行了处理。对于IOCTL = 0x 80102180 , 进行初始化处理,如清空记录缓冲区、计数器等。对于IOCTL = 0x 80102180 ,病毒将把在缓冲区中记录的按键扫描码返回给调用者。使用这个rootkit的程序可以调用DeviceIoContro函数进行控制和读取按键记录。

5、卸载例程:

调用IoDetachDevice摘除过滤设备

调用IoDeleteSymbolicLink删除符号链接

检查是否有IRP未完成且IRP有效则调用IoCancelIrp尝试取消这个IRP,如果取消IRP失败则等待直到有下一次IRP然后取消。

调用IoDeleteDevice删除设备。

由于该驱动在卸载例程中安全地删除了过滤设备并尝试取消未完成的IRP,所以该Rootkit可以被安全地卸载。不过一般的病毒作者很少会给用户留下安全的卸载例程,所以怀疑该Rootkit是作者从网上抄来的代码,作者有可能甚至不了解该驱动真正的工作原理。

“幻影后门”

这是一个具有感染功能、提供多种连接方式、可配置的后门病毒。

病毒作者在病毒体(客户端控制程序)内留下了明确的签名:
作者:dream2fly 作者网址: www.dream2fly.net 作者邮箱:[email protected]
作者的网址(论坛)中提供了多个自己编写的软件,包括本后门病毒。
作者的论坛中称本病毒为UAM (Universal Access Manager),中文名称“幻影远程控制”,提供收费注册使用。

病毒分为5个部分:服务端安装程序(ctfime.exe)、服务端核心程序(SysIdt00.dll)、服务端启动程序(被感染的explorer.exe)、客户端控制程序(UAManager.exe)、隐藏端口的Rootkit (uamanger.sys)。

服务端安装程序由C/C++语言编写,UPX加壳保护。其它部分由C/C++或汇编语言编写。

1、 服务端安装程序
服务端安装程序执行如下操作:

(1) 服务端安装程序运行后从程序资源中释放如下文件:

"%windir%\system32\SysIdt00.dll"、"%windir%\system32\DRIVERS\uamanger.sys"

(2) 然后将自己复制为"%windir%\system32\ctfime.exe"并启动,同时删除原文件。

(3) 将SysIdt00.dll、ctfime.exe、uamanger.sys的文件时间修改为同系统的cmd.exe相同,并将属性设置为“系统+隐藏”。

(4) 修改系统的文件保护,然后感染系统的explorer.exe。

(5) 以隐藏窗口方式启动被感染的explorer.exe。

2、 服务端启动程序(被感染的explorer.exe)

服务端安装程序在感染explorer.exe时,在其最后增加一个大小为0x1000的节写入病毒代码,并将入口点改为指向新的节的开始。被感染的病毒代码执行时通过调用LoadLibraryA装载SysIdt00.dll,然后返回原入口点。病毒感染explorer.exe的目的是为了在系统启动时都能运行SysIdt00.dll,达到自启动的目的。

3、服务端核心程序(SysIdt00.dll)

SysIdt00.dll中是远端监控的核心代码。
SysIdt00.dll通过被感染的explorer.exe被装载后执行如下功能:

(1) 通过调用SeDebugPrivilege等函数提升权限。

(2) 遍历进程对找到的第一个”svchost”进程,将自己将注入其内存,然后通过CreateRemoteThread启动其导出函数”Entry”。

SysIdt00.dll被注入svchost进程后执行如下功能:

(1) 通过尝试打开名为"UAM_4803"的互斥量来检查驱动是否加载,如加载则不做其它操作。

(2) 如果驱动没有加载,根据设置(可在生成服务端时设置是否加载驱动)加载驱动"%windir%\system32\DRIVERS\uamanger.sys"。

(3) 启动工作线程,实现远程监控功能。

(4) 在实现连接时,通过写文件"\\.\UAM"将连接的端口传给驱动,实现隐藏端口。

(5) 根据设置的连接方式和密码连接客户端(控制端)

生成服务端时可以设置三种连接方式:
直接连接方式(设置监听,由控制端来连接服务端)
反弹连接方式1 (设置ip地址和端口,服务端去连接控制端)
反弹连接方式2 (设置网页地址,服务端从这个地址下载ip.txt,按照其内容去连接控制端)

(6) 远程控制可以接受如下命令执行操作:

远程shell (cmd.exe命令操作)
进程管理
文件管理
远程桌面
视频监控
日志管理(查看、删除系统日志)
从任意网址下载、执行文件
远程更新、卸载服务端

4、客户端控制程序(UAManager.exe)

客户端控制程序提供远程连接控制功能,并且可以生成服务端程序。
在生成服务端程序时,可以进行如下设置:

连接方式和地址、连接密码、是否加载驱动、服务端运行时间。

5、隐藏端口的Rootkit (uamanger.sys)

病毒名称为Rootkit.Win32.PortHide.a,该驱动加载后首先创建一个名为\Device\hypy的设备和一个名为\??\hypy的符号链接用来和3环程序交互。这个设备名与3环程序所使用的符号链接(\\.\UAM)不同,所以显然我们所截获的样本是无法正常工作的。

之后该驱动注册IRP处理回调,在IRP_MJ_WRITE处理例程中,该驱动接受3环传入的需要隐藏的端口号,并保存在一个全局变量中。不过该Rootkit作者显然对驱动编写很不熟悉,所有的IRP处理例程均没有通过IofCompleteRequest完成,而是直接返回到I/O管理器。所以该驱动是无法正常地完成所希望实现的功能的。

该驱动通过替换KeServiceDescriptorTable中的函数地址来挂钩ZwDeviceIoControlFile,该Rootkit通过挂钩该API来隐藏指定端口。

“代理Rootkit变种XD”

此程序为rootkit类型程序
1.在驱动初始化时,对设备名和设备符号链接字符串进行解码,并创建设备和相应的符号链接来与用户态程序通信;
2.去除CR0寄存器中的WP位,以防止写只读页出现页异常,然后将内存中的加密字符串解码并写回,此解密字符串将用来与IOCTL传递的参数比较,从而判断是否响应该用户程序的IOCTRL;
3.获取进程的EPROCESS地址,在此结构体中搜索"system"字符串偏移,然后根据此偏移计算进程名在EPROCESS中的偏移,以备比较进程时使用;
4.注册IRP处理例程
支持:创建文件、设置注册表键值、关闭线程和卸载驱动
5.创建系统线程,每隔指定的时间后,尝试写入驱动程序对应的注册表项
6.注册进程创建通知例程,每当创建新进程时,该驱动做如下操作:
1)获取创建进程的EPROCESS,根据计算的偏移获取当前进程名称
2)判断当前创建进程是否为userinit.exe或者是explorer.exe,
如果是则创建系统线程,写入注册表项
\registry\machine\software\microsoft\windows\currentversion\runonce
键值:
%systemroot%\system32\Rundll32.exe %systemroot%\system32\%s.dll,DllUnregisterServer
3)映射ntoskrnl.exe到内存中,获取ntoskrnl.exe的服务表中指定服务函数的地址并保存,利用获取的服务函数地址枚举注册表,试图绕过其他软件的拦截;
4)记录 Winlogon.exe 的启动,但没有做其它操作,可能在以后的版本中会进行相关处理

“哈希信息窃取器”

这是一个C/C++编写的黑客工具。

该工具主要用来获取当前主机用户的LM/NTLM散列,使用者可以通过该散列对主机用户密码进行暴力破解.

支持用法:pwmp2 <pid of lsass.exe>

主程序行为:
1.若没有指定lsass.exe/pid参数,则执行如下操作:
[1].加载ntdll.dll,获取导出函数
NtQuerySystemInformation
RtlCompareUnicodeString
[2].调用NtQuerySystemInformation,InformationClass=5,获取进程信息列表
[3].遍历列表查找LSASS.EXE,获取该进程ID

2.打开自身进程,添加SeDebugPrivilege权限,以允许当前进程对LSASS.EXE等进程进行内存操作和线程操作

3.打开查找到的进程LSASS.EXE,获取该进程句柄

4.创建一事件,用于与通信线程同步

5.创建通信线程,执行如下操作:
[1]. 根据当前进程ID创建命名管道\\.\pipe\pwmp2-%ID%
[2]. 设置事件为有状态,通知主线程管道创建成功
[3]. 连接到管道并从中读取数据直到关闭

6.在创建的事件上等待,与之前创建的管道通信线程同步

7.向LSASS.EXE进程空间中写入创建的管道名和辅助动态库SamDump.dll导出函数名(DumpSam)作为参数,创建远程线程.
在远程线程中,根据传递的API地址,加载DLL,获取DLL导出函数(DumpSam)并调用

8.等待远程线程返回,释放资源。

动态库SamDump.dll导出函数DumpSam(char *)执行如下操作:

1.根据传入参数打开通信管道

2.加载samsrv.dll,获取如下函数地址
SamIConnect
SamrOpenDomain
SamrOpenUser
SamrQueryInformationUser
SamrEnumerateUsersInDomain
SamIFree_SAMPR_USER_INFO_BUFFER
SamIFree_SAMPR_ENUMERATION_BUFFER
SamrCloseHandle

3.依次调用如下函数
LsaOpenPolicy打开NT工作站
LsaQueryInformationPolicy获取工作站域SID
SamIConnect连接到SAM数据库
SamrOpenDomain根据域SID打开域
SamrEnumerateUsersInDomain枚举域内用户
SamrOpenUser打开域内指定用户,获取句柄
SamrQueryInformationUser枚举域用户信息
SamIFree_SAMPR_USER_INFO_BUFFER
SamrCloseHandle

『叁』 怎样才能关闭电脑的过滤器驱动程序啊

以下为复制成分 WDM(Windows Driver Mode)是微软公司为Windows的驱动程序设计的一种通用的驱动程序模型。相比以前的KDM和VXD来说,他的性能更高、系统之间移植更加方便。所以,随着系统的升级,WDM已经成为Windows 2000系统下驱动程序开发的主流。作为WDM模型之中一类特殊的驱动程序,过滤器驱动程序(Filter driver)可以在不更改现有驱动程序的情况下,方便地修改、增加现有驱动程序的功能。特别是对于Windows 2000已经提供了通用驱动程序的硬件设备,通过编写过滤器驱动程序,可以以较小的代价扩展硬件现有的功能。因此具有很强的实际应用价值。 1 Windows 2000 I/O请求处理结构如图1所示,Windows 2000是分态的操作系统。用户应用程序运行在用户态,操作系统代码(如系统服务和设备驱动程序)在核心态下运行。用户态程序只能调用Win32子系统提供的API来同设备交互,当请求传递到I/O管理器时,他进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的IRP(IO Request Package,I/O请求包),并把此IRP传递到适当的驱动程序去,并给应用程序一个消息,通知这次I/O操作还没完成。驱动程序一般通过硬件抽象层来和硬件交互,从而完成I/O请求工作。驱动程序完成I/O操作后,他将调用一个特殊的内核服务例程来完成IRP。这时,I/O管理器把数据和结果返回给Win32和用户应用程序。2 WDM驱动程序模型体系结构Windows驱动程序模型重新定义驱动程序分层使用了如图2的层次结构。图中左边是一个设备对象堆栈。设备对象是系统为帮助软件管理硬件而创建的数据结构。一个物理硬件可以有多个这样的数据结构。处于堆栈最底层的设备对象称为物理设备对象PDO(Physical Device Object),代表了设备和总线之间的连接。在设备对象堆栈的中间的对象称为功能设备对象FDO(Functional Device Object),代表了设备的功能。在FDO的上面和下面还会有一些过滤器设备对象FIDO(Filter Device Object)。位于FDO上面的过滤器设备对象称为上层过滤器,位于FDO下面(但仍在PDO之上)的过滤器设备对象称为下层过滤器。总线驱动程序负责枚举他的总线,这意味着发现总线上的全部设备和检测设备何时被添加或删除并为每个设备创建一个PDO。功能驱动程序知道如何控制设备的主要功能,他分层在总线驱动程序的上面。功能驱动程序创建一个功能设备对象,放在设备栈中。对总线上的所有设备,总线过滤驱动程序被加在总线驱动程序之上;设备过滤驱动程序仅对特定的设备添加。上层的过滤驱动程序在功能驱动程序之上,而下层过滤驱动程序在功能驱动程序之下。这种层次结构可以使I/O请求过程更加明了。I/O管理器发送的IRP,先被送到设备堆栈的上层过滤器驱动程序(FIDO),他可以根据要求决定IRP的处理方式,是沿着设备栈继续向下传,或者是做一些额外的处理。依次,每一层驱动程序都可以决定如何处理IRP。高层的驱动程序可以把请求划分成更简单的请求并传递给下层驱动程序。中间层次的驱动程序进一步处理请求,将一个IRP中的请求划分为若干个小的请求并传给下层驱动程序。最后,最低层的驱动程序与硬件打交道。因此一些IRP在到达总线程序之前,在设备栈传递过程中可能就被过滤掉了。 3 过滤器驱动程序过滤驱动程序是一种中间驱动程序,他位于其他的驱动程序层次之间。过滤驱动程序可以监视、拦截和修改IRP流,在不影响其他驱动程序的前提下提供一些附加的功能。他的功能可分为:(1)利用过滤器驱动程序修改现有功能驱动程序的行为而不必重新编写功能驱动程序。(2)上层过滤器驱动程序在功能驱动程序之前看到IRP,可以很方便地为用户提供额外的特征。还可以修正功能驱动程序或硬件存在的毛病或缺陷。(3)下层过滤器驱动程序在功能驱动程序要向总线驱动程序发送IRP时看到IRP。可以监视、拦截、修改功能驱动程序要执行的总线操作流,截获数据,进行必要的数据处理,再将处理过的数据传递下去,实现一定的数据处理功能。 (4)下层过滤器驱动程序可以实现驱动程序的总线无关性,使功能驱动程序完全独立于总线结构而不直接与设备对话。针对不同的总线编写不同的下层过滤器,每个下层过滤器对应一个总线类型。当功能驱动程序需要与硬件对话时,他只需向相应的下层过滤器驱动程序发送IRP即可。4 过滤器驱动程序设计过滤器驱动程序设计与功能驱动程序相似。这里限于篇幅主要讨论一下过滤器驱动程序设计中与功能驱动程序相区别的几个关键的技术要点。4.1 DriverEntry例程DriverEntry例程是驱动程序的人口点。当I/O管理器装入驱动程序时,他调用DriverEntry例程用来初始化驱动程序范围的数据结构和资源,包括输出该驱动程序的其他人口点,初始化该驱动程序使用的特定对象,并设置驱动程序系统资源。与功能驱动程序相区别的是:他必须为每种类型的IRP都安装派遣函数,而不仅仅只是其希望处理的IRP。4.2 AddDevice例程AddDevice函数的基本职责是创建一个设备对象并把他连接到以物理设备对象PDO为底的设备堆栈中,并负责设备对象初始化。与功能驱动程序相区别的是:过滤驱动程序创建的设备对象可能是2种,一种是不命名的过滤设备对象,过滤器工作时把这个无名的设备对象连接到以物理设备对象PDO为底的设备堆栈中。一种是为了和用户程序通信而创建的命名的设备对象并不连接到以物理设备对象PDO为底的设备堆栈中。命名可以采用2种方法:第一种方法是采用可显示的"硬编码"符号链接名,用户态程序必须把设备名硬编码到源代码中;另外一种方法是使用设备接口,每个设备接口是由一个全局惟一标志符GUID标志。设备注册为一个特定的设备接口就创建了一个符号链接。相关步骤如下:(1)调用IoCreateDevke创建过滤设备对象,并建立一个私有的设备扩展对象。(2)寄存一个或多个设备接口,以便应用程序能知道设备的存在。另外,还可以给出设备名并创建符号连接。(3)初始化设备扩展和设备对象的F1ag成员。(4)调用IOAttachDevkeToDeviceStack函数把新设备对象放到堆栈上。具体实现程序如下:NTSTATUS AddDevice (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo){PDEVICE_OBJECT fido=NULL;//创建没有设备名的过滤设备对象NTSTATUS status=IoCreateDevice (DriverObjeot,sizeof (DEVICE-EXTENSION),NULL,FILE_DEVICE_UNKNOWN,0,FALSE,&fido);if(!NT_SUCCESS(status)) return status;//初始化设备扩展和设备对象的Flag成员PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fido->DeviceExtension;pdx->DeviceObject=fido;pdx->Pdo=pdo;pdx->eDeviceType =FILTER-p.htm" target="_blank" title="FILTER货源和PDF资料">FILTER;//把没有设备名的设备对象放到堆栈上PDEVICE- OBJECT fdo =IoAttachDeviceToDeviceStack (fido,pdo);pdx->TopDevObj=fdo;fido->Flags ︱=pdo->F1ags&(DO_DIRECT-IO ︱DO-BUFFERED-IO ︱ DO_POWER_PAGABLE ︱DO_POWER_INRUSH);………//建立一个命名的设备对象创建符号链接CreateSymbOlicLink (DriverObject,pdo);return STATUS_SUCCESS;}4.3 派遣例程派遣例程处理来自应用程序的打开、关闭、读、写等I/O请求命令。与功能驱动程序的区别是:过滤器驱动程序不能影响其他驱动程序接受IRP。对于未知的IRP或不处理的IRP过滤驱动程序的原则是必须沿设备栈传递下去。因此他必须为每种类型的IRP都安装派遣函数,而不仅仅只是其希望处理的IRP。对于希望处理的IRP必须指定特殊的派遣函数,直接用CompleteIRP来完成接收到的这类IRP,不往下层传送。这里由DispatchDeviceControl处理来自应用程序的所有希望处理的I/O操作命令。通常采用给予所有自定义的I/O请求代码的SWITCH-p.htm" target="_blank" title="SWITCH货源和PDF资料">SWITCH语句,而对于每个命令使用相应的处理函数。下面列出了主要的代码框架:NTSTATUS DispatchDeviceControl (PDEVICE_OBJECT fido,PIRP Irp){NTSTATUS status;PDEVICE_EXTENSION pdx=(PDEVICE_EXTENSION)fido->DeviceExtension;PlO_STACK_LOCATION IrpStack =IoGetCurrentlrpStackLocation(1rp);//取I/O控制命令代码ULONG IoControlCode = IrpStack >Parameters.DeviceloContr01.IoControlCode;switch(IoControlCode){case IOCTL-XXX:…… //处理I/O控制命令代码case IOCTL-XXX:……default:……break;}//完成接收到的IRPIoCompleteRequest(Irp,IO_NO_INCREMENT);……return status;}对于不需要处理的IRP则交由DispatchAny例程处理,将IRP沿着设备栈直接传递下去:NTSTATUS DispatchAny(PDEVICE_OBJECT fido,PIRP Irp){PDEVICE_ EXTENSION pdx=(PDEVICE-EXTENSION)fido->DeviceExtension//使堆栈指针少前进一步。IoSkipCurrentlrpStackLocation(hp);Status=IoCallDriver(pdx->LowerDeviceObject,Irp);……return status;4.4 Unload例程功能在Unload例程中,驱动程序必须释放所有创建的对象和所有分配给驱动程序的资源。5 结 语笔者就采用在Windows提供的USB声卡驱动程序下方插入自己编写的下层过滤器驱动程序实现了对USB声卡输出的数据流的截获并进行语音信号处理,取得了不错的效果,现已投入实际应用。可见过滤器驱动程序作为一类特殊的驱动程序,它可以以较小的代价实现对驱动数据流的截获,修改、增加现有驱动常需的功能,具有很强的实用性。
类别:驱动 | 添加到搜藏 | 浏览(254) | 评论 (0) 上一篇:VMware虚拟机中如何安装VMWare-T... 下一篇:今天离婚,你得抱我出门 相关文章: �6�1Windows文件系统的过滤器驱动程... 最近读者: 登录后,您就出现在这里。 蝶舞360°jacky85chan 网友评论:

『肆』 windown文件过滤驱动开发中 有没有一种IRP_MJ_XXX是修改只读或者隐藏属性产生的IRP

是不是一个IOCTL,不清楚

『伍』 在线等!filemon中怎么才能禁止打开删除等IRP

我劝你还是到驱动开发网上去问吧
这里估计都是没有人能解决这个问题

http://bbs.driverdevelop.com/

『陆』 windows10文件驱动过滤

1、获得文件全路径以及判断时机

除在所有 IRP_MJ_XXX 之前自己从头创建 IRP 发送到下层设备查询全路径外,不要尝试在 IRP_MJ_CREATE 以外的地方获得全路径,因为只有在 IRP_MJ_CREATE
中才会使用 ObCreateObject() 来建立一个有效的 FILE_OBJECT。而在 IRP_READ IRP_WRITE 中它们是直接操作 FCB (File Control Block)的。

2、从头建立 IRP 发送关注点

无论你建立什么样的 IRP,是 IRP_MJ_CREATE 也好还是 IRP_MJ_DIRECTORY_CONTROL也罢,最要提醒的就是一些标志。不同的标志会代来不同的结果,有些结果是直接返回失败。这里指的标志不光是 IRP->Flags,还要考虑 IO_STACK_LOCATION->Flags还有其它等等。尤其是你要达到一些特殊目的,这时候更需要注意,如 IRP_MN_QUERY_DIRECTORY,不同的标志结果有很大的不同。

3、从头建立 IRP 获取全路径注意点

自己从头建立一个 IRP_MJ_QUERY_INFORMATION 的 IRP 获取全路径时需要注意,不仅在 IRP_MJ_CREATE 要做区别处理,在 IRP_MJ_CLOSE 也要做同样的处理,否则如果目标是 NTFS 文件系统的话可能产生 deadlock。如果是 NTFS 那么在 IRP_MJ_CLEANUP 的时候也需要对 FO_STREAM_FILE 类型的文件做同样处理。

4、获得本地/远程访问用户名(域名/SID)

方法只有在 IRP_MJ_CREATE 中才可用,那是因为 IO_SECURITY_CONTEXT 只有在 IO_STACK_LOCATION->Parameters.Create.SecurityContext 才会有效。这样你才有可能从 IO_SECURITY_CONTEXT->SecurityContext->AccessState->SubjectSecurityContext.XXXToken 中获得访问 TOKEN,从而进一步得到用户名或 SID。记得 IFS 中有一个库,它的 LIB 导出一个函数可以让你在获得以上信息后得到用户名与域名。但如果你想兼容 NT4 的话,只能自己分析来得出本地和远程的 SID。

5、文件与目录的判断

正确的方法在楚狂人的文档里已经说过了,再补充一句。如果你的文件过滤驱动要兼容所有文件系统,那么不要十分相信从 FileObject->FsContext 里取得的数据。正确的方法还是在你传递下去 IRP_MJ_CREATE 后从最下层文件系统延设备栈返回到你这里后再获得。

6、加/解密中判断点

只判断 IRP_PAGING_IO,IRP_SYNCHRONOUS_PAGING_IO,IRP_NOCACHE 是没错的。如果有问题,相信是自己的问题。关于有人提到在 FILE_OBJECT->Flags中的 FO_NO_INTERMEDIATE_BUFFERING 是否需要判断,对此问题的回答是只要你判断了 IRP_NOCACHE 就不用再判断 FILE_OBJECT 中的,因为它最终会设置 IRP->Flags 为 IRP_NOCACHE。关于你看到的诸如 IRP_DEFER_IO_COMPLETION 等 IRP 不要去管它,因为它只是一个过程。最终读写还是如上所介绍。至于以上这些 IRP 哪个是由 CC MGR 发送的,哪些是由 I/O MGR 发送和在什么时候发送的,这个已经有很多讨论了,相信可以找到。

7、举例说明关于 IRP 传递与完成注意事项

只看 Walter Oney 的那本 《Programming the Microsoft Windows driver model》里介绍的流程,自己没有实际的体会还是不够的,那里只介绍了基础概念,让自己有了知识。知道如何用,在什么情况下用,用哪种方法,能够用的稳定这叫有了技术。我们从另一个角度出发,把问题分为两段来看,这样利于总结。一个 IRP 在过滤驱动中,把它分为需要安装 CompleteRoutine 的与无需安装 CompleteRoutine 的。那么在不需要安装 CompleteRoutine 的有以下几类情况。

(1) 拿到这个 IRP 后什么都不做,直接调用 IoCompleteRequest() 来返回。
(2) 拿到这个 IRP 后什么都不做,直接传递到底层设备,使用IoSkipCurrentIrpStackLocation() 后调用 IoCallDriver() 传递。
(3) 使用 IoBuildSynchronousFsdRequest() 或 IoBuildDeviceIoControlRequest()来建立 IRP 的。

以上几种根据需要直接使用即可,除了一些参数与标志需要注意外,没有什么系统机制相关的东西需要注意了。那么再来看需要安装 CompleteRoutine 的情况。我们把这种情况再细分为两种,一是在 CompleteRoutine 中返回标志为STATUS_MORE_PROCESSING_REQUIRED 的情况。二是返回处这个外的标志,需要使用函数IoMarkIrpPending() 的情况。在 CompleteRoutine 中绝大多数就这么两种情况,你需要使用其中的一种情况。那么为什么需要安装 CompleteRoutine 呢?那是因为我们对其 IRP 从上层驱动,经过我们驱动,在经过底层设备栈返回到我们这一层驱动时需要得到其中内容作为参考依据的,还有对其中内容需要进行修改的。再有一种情况是没有经过上层驱动,而 IRP 的产生是在我们驱动直接下发到底层驱动,而经过设备栈后返回到我们这一层,且我们不在希望它继续向上返回的,因为这个 IRP 本身就不是从上层来的。综上所述,先来看下 IoMarkIrpPending() 的情况。

(1) 在 CompleteRoutine 中判断 Irp->PendingReturned 并使用 IoMarkIrpPending()然后返回。这种方法在没有使用 KeSetEvent() 的情况下,且不是自建 IRP 发送到底层驱动返回时使用。也就是说有可能我所做的工作都是在 CompleteRoutine 中进行的。比如加/解密时,我在这里对下层驱动返回数据的判断并修改。修改后因为没有使用 STATUS_MORE_PROCESSING_REQUIRED 标志,它会延设备堆一直向上返回并到用户得到数据为止。这里一定要注意,在这种情况下 CompleteRoutine返回后,不要在碰这个 IRP。也就是说如果这个时候你使用了 IoCompleteRequest()的话会出现一个 MULTIPLE_IRP_COMPLIETE_REQUEST 的 BSOD 错误。

(2) 在 CompleteRoutine 中直接返回 STATUS_MORE_PROCESSING_REQUIRED 标志。这种情况在使用了 KeSetEvent() 的函数下出现。这里又有两个小小的分之。

1) 出现于上层发送到我这里,当我这里使用 IoCallDriver() 后,底层返回数据经过我这一层时,我想让它暂时停止继续向上传递,让这个 IRP 稍微歇息一会,等我对这个 IRP 返回的数据操作完成后(一般是没有在 CompleteRoutine中对返回数据进行操作情况下,也就是说等到完成例程返回后再进行操作),由我来调用 IoCompleteRequest() 让它延着设备栈继续返回。这里要注意,我们是想让它返回的,所以调用了 IoCompleteRequest()。这个可不同于下面所讲的自己从头分配 IRP 时在 CompleteRoutine 中已经调用 IoFreeIrp() 释放了当前IRP 的情况。比如我在做一个改变文件大小,向文件头写入加密标志的驱动时,在上层发来了 IRP_MJ_QUERY_INFORMATION 查询文件,我想在这个时候获得文件信息进行判断,然后根据我的判断结果再移动文件指针。注意:上面是两步,第一步是先获得文件大小,那么在这个时候我就需要用到上述办法,先让这个 IRP传递下去,得到我想要的东西后在进行对比。等待适当时机完成这个 IRP,让数据继续传递,直到用户收到为止。第二步我会结合下面小节来讲。

2) 出现于自己从头建立 IRP,当使用 IoAllocate() 或 IoBuildAsynchronousFsdRequest()创建 IRP 调用 IoCallDriver() 后,底层返回数据到我这一层时,我不想让这个 IRP 继续向上延设备栈传递。因为这个 IRP 就是在我这层次建立的,上层本就不知道有这么一个 IRP。那么到这里我就要在 CompleteRoutine 中使用 IoFreeIrp()来释放掉这个 IRP,并不让它继续传递。这里一定要注意,在 CompleteRoutine函数返回后,这个 IRP 已经释放了,如果这个时候在有任何关于这个 IRP 的操作那么后果是灾难性的,必定导致 BSOD 错误。前面 1) 小节给出的例子只完成了第一步这里继续讲第二步,第一步我重用这个 IRP 得到了文件大小,那么这个时候虽然知道大小,但我还是无法知道这个文件是否被我加过密。这时,我就需要在这里自己从头建立一个 IRP_MJ_READ 的 IRP 来读取文件来判断是否我加密过了的文件,如果是,则要减少相应的大小,然后继续返回。注意:这里的返回是指让第一步的IRP 返回。而不是我们自己创建的。我们创建的都已经在CompleteRoutine 中销毁了。

8、关于完成 IRP 的动作简介

当一个底层驱动调用了 IoCompleteRequest() 函数时,基本上所有设备栈相关 IRP 处理工作都是在它那里完成的。包括 IRP->Flags 的一些标志的判断,对 APC 的处理,抛出MULTIPLE_IRP_COMPLETE_REQUESTS 错误等。当它延设备栈一直调用驱动所安装的 CompleteRoutine时,如果发现 STATUS_MORE_PROCESSING_REQUIRED 这个标志,则会停止向上继续回滚。这也是为什么在 CompleteRoutine 中使用这个标志即可暂停 IRP 的原因。

9、关于 ObQueryNameString 的使用

这个函数的使用,在有些环境下会有问题。它的上层函数是 ZwQueryObject()。在某些情况下会导致系统挂起,或者直接 BSOD。它是从 对象管理器中的 ObpRootDirectoryObject开始遍历,通过 OBJECT_HEADER_TO_NAME_INFO 获得对象名称。今天问了下 PolyMeta好象是在处理 PIPE 时会挂启,这个问题出现在 2000 系统。在 XP 上好象补丁了。

10、关于重入问题

其实这个问题在很久前的 IFS FAQ 里已经介绍的很清楚,包括处理方法以及每种方法可能带来的问题。IFS FAQ 里的 Q34 一共介绍了四种方法,包括自己从头建立 IRP发送,使用 ShadowDevice,使用特征字符串,根据线程 ID,在 XP 下使用() 函数。并且把以上几种在不同环境下使用要处理的问题也做了简单的介绍。且在 Q33 里介绍了在 CIFS 碰到的 FILE_COMPLETE_IF_OPLOCKED 问题的解决方法。

『柒』 过滤驱动中打开文件时如何避免重入

在处理IRP_MJ_CREATE请求时,过滤驱动可能会使用不同的属性/权限等打开这个文件。这种情况经常发生在第二次调用ZwCreatefile时。这会导致生成一个对FSD 过滤驱动的回调(就是重入了).因而,正常的过滤驱动就要有能力检测这种重入的问题。
There are several ways of dealing with reentrancy ring an IRP_MJ_CREATE operation, and the appropriate solution for your particular driver will depend upon the circumstances. In addition, there are a number of techniques that might work for a single file system filter driver, but that fail when used in a multi-filter environment.
在处理IRP_MJ_CREATE操作过程中,有几种方法可以处理重入,处理你的驱动(中的重入)的适当方法取决于你的环境。另外,有许多种技术可以在单个文件系统过滤驱动上工作,但在多层过滤的环境下可能会失效。
For Windows XP and newer versions of Windows, the best mechanism for opening a file within the filter is to use . A filter driver can call this function and specify a given device object. The IRP_MJ_CREATE that is built will be passed to the specified device object. This technique avo
ids reentrancy issues and is the best mechanism available for a filter to open a file.
对Windows xp或者更新版的Windows来说,在过滤驱动中打开一个文件的最好方法是使用.文件过滤驱动可以调用这个函数并且指定一个给定的设备对象。
For versions of Windows prior to Windows XP, this mechanism is not available. The best mechanism in this environment is to implement your own functional equivalent of . This can be done by creating a second device object for each device you are filtering.
对Windows xp以前的Windows操作系统,这种方法无效。在这种环境下最好的方法是实现你自己的与等价的功能。这可以通过给你要过滤的设备创建第二个设备对象来实现。
For example, suppose you decide to filter some given file system device object, FSDVolumeDeviceObject. You then create a device object MyFilterDeviceObject and attach it using IoAttachDeviceToDeviceStack (of course, in Windows XP you would use instead). In addition, you create a second device object MyFilterShadowDeviceObject. This device object must be assigned a name ("DeviceMyFilterDevice27", for example). The name can be anything, but it must obviously be unique. In your device extension for your two device objects, you need to track this name, and you need to maintain pointers to the respective device objects (that is, the device extension for MyFilterShadowDeviceObject should point to MyFilterDeviceObject and the device object extension for MyFilterDeviceObject should point to yFilterShadowDeviceObject). Don't forget to set the StackSize field of the device object correctly!)
例如,假设你要过滤某个特定的文件系统设备对象,FSDVolumeDeviceObject(文件系统卷设备对象).这时你要创建一个设备对象MyFilterDeviceObject 并且使用IoAttachDeviceToDeviceStack 函数(在windows xp下使用 )来挂接它。另外,你还要创建第二个设备对象yFilterShadowDeviceObject.这个设备对象必须被指定一个名字(例如"DeviceMyFilterDevice27",注: 这里指的第二个设备对象,即Shadow device object )。名字可以是任意的,但必须唯一的。在这两个设备的设备扩展结构中,你需要跟踪这个名字
(注,其实就是做标志,你要知道你当前是处在哪个设备中,是第一个设备对象还是Shadow object )你需要维护一些指向相应的设备对象的指针(也就是说,MyFilterShadowDeviceObject的设备扩展要指向MyFilterDeviceObject,MyFilterDeviceObject的设备扩展对象要指向MyFilterShadowDeviceObject.不要忘了正确设置设备对象的StackSize成员变量。
Now, an IRP_MJ_CREATE request arrives in your filter, specifying MyFilterDeviceObject. To open the file without experiencing reentrancy problems, you call IoCreateFile (or ZwCreateFile). Since you must pass the name of the file being opened, you construct that by using both the name you gave MyFilterShadowDeviceObject and the name that is in the FileObject of the I/O stack Location (IoGetCurrentIr
pStackLocation(Irp)->FileObject).
现在,当IRP_MJ_CREATE 请求到达你的过滤驱动时,指定了 MyFilterDeviceObject.你调用IoCreateFile(或ZwCreateFile) 打开文件就没有重入的问题了.以后,你必须传递这个打开的文件的名字,这个名字是用你设置在MyFilterShadowDeviceObject中的名字和从I/O 堆栈区域中得到的文件对象中的名字一起构造的。
Since you are passing a name in that points to your second device object, the I/O Manager will build the IRP_MJ_CREATE and pass the resulting I/O request packet to your driver, but specifying MyFilterShadowDeviceObject.

当你传递一个指向你的第二个设备对象的名字,I/O管理器会构建IRP_MJ_CREATE 并且传递I/O请求的结果到你的驱动,但指定了MyFilterShadowDeviceObject.
In your IRP_MJ_CREATE dispatch handler you must detect that this is a "shadow" device object, rather than a typical filter device object. In this case, you should send the IRP_MJ_CREATE operation down to the device being filtered by MyFilterDeviceObject. Indeed, since you should not need to do any further processing, you can use IoSkipCurrentIrpStackLocation (rather than ).
在你的IRP_MJ_CREATE 分发例程处理函数中,你必须检测它是一个"Sahdow"设备对象而不是是一个典型的过滤设备对象。在这种情况下,你必须将IRP_MJ_CREATE操作下传到已经被 MyFilterDeviceObject过滤了的设备中。确实,此后你不需要作进一步的处理,你可以用IoSkipCurrentIrpStackLocation函数(不是).

『捌』 文件过滤驱动开发中,在IRP_MJ_WRITE 中获取将要写入文件的内容,请问这些内容是以什么方式展示的呢如何

读IRP的缓冲区啊。。。

『玖』 遇到流氓软件怎么办

流氓软件的技术五花八门,任何一项功能都有可能成为流氓技术,就象武器,用好了可以伸张正义,用歪了却成为罪恶的帮凶。

首先我从win32下的一些流氓着数分析开始:

1。我想做为一个流氓软件,首先要做到的是实时运行,譬如在注册表的run下,在boot下增加它的启动。这应该是比较老的方法,以前 3721好象就是在run下,但是现在一般的人都知道了。

2。作为流氓软件,已经改变了以前一些木马的特性了,他没必要使自己一定要实时启动了,而是需要自己的时候再启动,譬如说打开一个浏览器窗口,这是一般流氓软件的方法,因为他需要连上网才能有利益可图,所以浏览器肯定是流氓软件必定监控的进程。

3。使用BHO插件,这种技术早先特别流行,这是微软提供的接口,本意是让IE浏览器可以扩充功能。每当一个ie浏览器启动的时候,都会调用BHO下必要的插件,流氓软件就是利用这一点。监控了浏览器所有事件与信息。

4。还有最笨的办法就是利用进程快照监控进程,判断有它自己所监控的进程启动,就使用atl得到浏览器指针,从而监控浏览器所有事件与信息。

5,还有一种方法就是使用spi,这是我在网上看到的。spi是分层协议,当winsock2启动的时候都会调用它的dll,可以监控所有应用层数据包。从而监控用户信息,而且能实时启动。

6。hook方法,hook技术可以所应用太广泛了,特别是监控方面。所以流氓软件也不会错过。首先应用的是api函数hook,譬如windows核心编程里的apihook类,或者微软的detous都可以完成,两者方法其实相同就是修改IDT函数入口地址。api hook钩住createprocess 就可以监控进程,比进程快照性能更强,可以钩住spi下的函数可以完成spi下的所有功能。还有消息hook,鼠标消息,键盘消息,日子消息等等钩子,方法实在太多,都可以利用。

上面列举了一些流氓软件的使用方法,但是流氓软件的一个特性是他无法卸载。所以它又要使用下面的方法了

因为上面的很多方法都可以删除注册表卸载他们,那怎么办呢,那就会时时监控,它会在它的进程,或者线程里监控注册表项,设置一个循环监控,发现没了就继续安装,增加。我想这应该是很多流氓软件的技术。

那现在又出现了一个新问题,那就是流氓软件的进程线程要是结束掉怎么办呢???看西面

7。一种方法就是上面的api hook技术,钩住openprocess ,用自己的函数判断只要打开的是自己进程就返回正确,使用这种方法,用户或者一般的软件就无法结束它的进程了。

8。还有一种是上面象bho,spi根本没有进程。一般的用户也无法删除他

9。还有一种方法是远程线程,这个技术用的也很普遍,首先是象api hook一样向目标进程里申请一段内存空间,然后使用自己映射过去,然后使用CreateRemoteThread创建远程线程。一般很多流氓软件或者以前的一些木马程序,都是把线程注入到系统进程譬如explorer,service等等,使用用户或者一般的杀毒软件很难处理或者结束。。

10。注册成服务后,也可以简单的隐藏进程。还有更可笑的是把自己的进程名跟一些系统进程名譬如lsass相同后,也就无法结束了。

从我上面列举的方法已经差不多可以形成好几款流氓软件了。但是你别高兴太早,因为这些技术只是应用层的,现在出现了一堆驱动层的反流氓软件工具,譬如超级兔子,完美卸载,木马克星,雅虎助手,还有现在火热的360安全卫士。

这些反流氓软件的方法删除以上流氓软件软件就比较简单。优先于流氓软件启动,截获所有访问流氓软件文件的irp,然后删除注册表项,删除文件。轻松的完成了反流氓任务。

为了针对这些反流氓软件,流氓软件出现了内核层的了。

1。首先是使用文件过滤驱动,保护自己的文件,流氓软件过滤了create里对于自己文件的所有fileopen外的所有irp和SetInformation下所有的irp,从而有效的保护了自己的文件。

2。内核级hook技术,可hook住所有公开的或者未公开的内核函数,譬如zwcreatefile,zwSetInformation,也可以有效的保护文件。

3。驱动层下的流氓软件还使用内核级hook技术,替换Regdeletekey,RegDeleteValueKey,RegSetValueKey从而有效的保护了注册表

4。利用内核级hook技术还有隐藏进程,或者监控进程,重起进程。

对于上面的流氓软件的方法一些驱动层下的反流氓软件工具又有点束手无策了。因为同是驱动程序相互拦截irp等于大家都无法操作,反流氓软件工具的删除irp会被拦截,或者删除函数会被替换。删除注册表函数会被替换。虽然驱动的加载有先后,但是无法保证能完全的删除流氓软件,从而出现了一些更顶级的反流氓软件,他直接发删除文件irp到文件系统.,删除注册表也直接发送到文件系统。这类流氓软件又能有效的完成了反流氓任务,但是根据我了解,这样的软件不多。现在火热的360安全卫士都还只是使用了笨办法,优先于驱动流氓软件启动,创建一个驱动流氓软件同设备名的设备,,使流氓驱动创建不成功。具我了解他优先于流氓驱动启动是把自己创建于PNP_TDI这个组下面,就是简单的ndis就能优先于360启动。如果前面的组,那360就束手无策了。所以对付这类流氓驱动只能用直接发irp到文件系统。

流氓软件又怎么来防止直接发irp到文件系统的反流氓软件呢?rootkit,我看很多对于rootkit有误解,很多都认为hook也是rootkit.呵呵,rootkit说白了就是嵌入操作系统文件。你不是发irp到文件系统吗?,可是我把文件系统给改了,不过rootkit根据我的观察unix或者linex下比较多,在windows下还是比较少的,因为需要使用汇编了,哎太晚了,不写了,我想如果流氓软件做到这个技术程度,它也没必要做流氓了,直接做操作系统得了。

阅读全文

与文件过滤驱动取消irp相关的资料

热点内容
盛源泉净水器在哪里买 浏览:632
大孔离子交换树脂的 浏览:933
食品锅炉除垢剂 浏览:250
超威电瓶加蒸馏水还是电解液 浏览:841
牛仔裤水洗废水的排放标准 浏览:387
蒸馏仪架 浏览:70
海尔饮水机加热温控怎么检查好坏就常亮 浏览:82
怡口超滤膜和活性炭 浏览:720
安吉尔新净水器怎么安装 浏览:950
地下污水池怎么做防渗漏 浏览:150
红薯淀粉废水蛋白回收 浏览:964
饮水机烧水不烧什么原因 浏览:815
污水厂在线监测试剂使用情况 浏览:600
大净的净水器怎么卖 浏览:398
本田飞度4s店换空气滤芯多少钱 浏览:48
河北油田废水处理药剂批发厂家 浏览:483
小型的反渗透水处理设备需要多少钱 浏览:368
搭树脂瓦雨棚多少钱一平方 浏览:16
活性炭污水处理起什么作用 浏览:102
废水中总砷测定仪器 浏览:209