版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Windows文件访问行为的监控软件设计【摘要】在互联网上,文件系统的信息安全问题是人们所必须重视的问题。除了面对一些带有病毒、木马等的恶意软件给信息安全带来的风险之外,也要防止计算机使用者的错误操作和恶意操作所带来的安全隐患,例如文件在使用者不知情的情况下被更改、删除等。通过对文件系统进行监控,可以实时了解到文件系统发生的变化,对一些非法操作也可以进行及时的处理,从而提高了文件系统的安全性。本文利用WindowsAPI函数设计并实现了一个基于Windows的文件访问行为的监控软件。该监控软件主要分为用户界面模块和文件监控模块,用户界面模块为软件使用者提供控制软件工作的途径,对监控记录进行实时的显示;文件监控模块对新建、更改、删除、重命名文件等操作进行监控和记录。与此同时,该监控软件会将监控记录生成监控日志来进行保存。【关键词】文件行为监控监控日志WindowsAPI目录TOC\o"1-2"\h\u212341绪论 1128531.1课题研究背景及意义 1113671.2国内外研究现状 1193471.3论文的组织结构 39492理论基础 475622.1C++简介 4163322.2文件监控技术基础—WindowsAPI简介 598462.3本章小结 7297173基于Windows的文件访问行为的监控软件的设计与实现 821993.1软件的设计目标 831703.2软件的整体设计 9206683.3用户界面模块的设计与实现 1265043.4文件监控模块的设计与实现 16121333.5本章小结 25189104软件功能测试 2581504.1用户操作测试 25157974.2文件监控测试 2653654.3监控日志测试 263085结论 2816875参考文献 291绪论本章主要介绍了课题研究背景及意义,并且从国内和国外两个角度分析了本文的研究现状,最后还对该论文的组织结构进行了说明。1.1本文研究背景及意义在网络给人们生活带来方便的同时,其安全也成为困扰人们的一个难题。诸如病毒、木马、黑客入侵等安全问题,不仅给个人使用计算机带来了一定的困扰,也给社会造成了巨大的经济损失。此外,在对文件的各种操作中也会经过多个环节,而在这些环节中,并不是时时刻刻就是安全的,也存在被恶意和错误操作的风险。因此保障文件信息存储的安全性成为目前研究的热点。而随着世界的快速变化,储存文件数据和控制文件数据的系统也在发生变化。每天都有成千上万的人对相关文件进行访问、传输和修改,其中的错误操作和恶意操作都是不可估量的。所以非常有必要监控谁对文件数据进行了怎样的操作。众所周知,文件数据是最宝贵的资产。所以说无论公司还是个人,保护数据都是最重要的。有时,人们的生活就取决于数据,例如在医疗保健系统中存储的各类数据,这是人们看病取药的基本保障。因此,如果文件数据发生了没有被人们意识到的变化,就会带来巨大的危险,这也是为什么需要这样的软件的原因。针对上述问题,本文通过调用WindowsAPI函数设计并实现了一种较为通用的文件监控系统,对文件新建、文件修改、文件删除、文件重命名等操作进行监控和记录,同时将监控结果实时反馈给使用者并且通过生成相关的监控日志来对监控记录进行保存,以此来帮助软件使用者更好的了解自己计算机的文件操作情况。1.2国内外研究现状近年来,计算机的出现和普及给用户进行各类操作带来了极大的便利。在记录存储这方面,使用者可以通过计算机代替笔纸来对相关事件进行记录,并且通过简单的操作就可以将其存储到计算机里。与此同时,用户对文件里的相关内容进行更改也是十分方便的。所以,文件系统的出现使得人们的生活更加智能便捷。但是,这也会带来一定的问题。有的时候,人们需要将文件存储到非私人的电脑里,但人们并不能时时刻刻盯着电脑来防止自己的文件信息数据被别的使用者操作。针对这个问题,就需要采取一定的措施来对计算机的重要信息进行保护,国内外在这一方面都有一定的研究。当下,学者专家们提出三层保护体系用于保护计算机的文件、信息数据。对此,市面上各类公司基于操作系统的内核设计了品种繁多的信息安全产品。在这些信息安全产品中,软、硬件结合的产品具有相对优秀的性能,但与此同时,这类产品的价格也比同类产品高出许多。针对这种现象,有相关公司做了调查。调查结果显示,在百分之六十以上的公司中,经常发生非授权使用和篡改信息的情况。甚至有百分之七十以上的公司认为其经济亏损主要是由于信息数据遭受非法盗取和删除。我国在1996年就开始了对文件信息系统的相关研究,当时的科研小组主要是由国家档案局的成员构成。1997年,由国家科学技术委员会牵头,国家质量监督局、国家档案局等部门参与,针对电子文件的归档和归档之后的管理研究组成了研究小组。该研究小组制定的电子文件归档管理规则为中国的各行各业做出了相当大的贡献。随着时代的发展,国家对信息基础的建设也在稳步前进。各类领域也开始着手于建设属于自己的文件管理系统、规划网络平台。通过构建文件文件管理系统,可以对文档的入库储存、浏览、删除等操作进行管理。与此同时,设置系统管理员并赋予其修改个人资料的权限,使系统可以对文档及其相关信息进行更加高效的管理,也为用户们提供了覆盖范围更广、更方便快捷的信息和服务。在现在市面上的各类可以对文件进行管理的具有商业价值的软件中,我国基于Lotus
Notes基础上二次开发的产品和国外同一个层面的软件相比,在功能实现方面是略有不足的。而大部分功能性较强、价格较为昂贵的专业产品也都来自国外。相对国外而言,通用型的文件管理系统在国内是比较少见的。造成目前这种局面的原因是多方面的。一方面因为是国内的文件管理的相关技术的发展与国外存在一定的差距,另一方面是因为文件监控系统在实现相关功能、提高软件性能时也需要进行综合研究运用,目前国内在研究方面较国外来说也不是那么的完备,不过这也从另一个角度说明设计实现一个对文件访问行为进行监控的软件具有较大的价值。1.3论文的组织结构根据通用的软件开发流程规范和本课题的特点,在此对本文的结构组织如下:第一章绪论,主要介绍了本课题的研究背景和意义,也对本课题的国内外的研究现状进行了具体的阐述,并且在该部分的最后,说明了本论文的结构安排,以方便读者可以更加清晰地了解本文的行文脉络和结构组织方式。第二章相关理论基础简介,简单介绍本项目涉及到的相关理论技术基础。本项目采用C++语言进行开发,通过调用WindowsAPI相关函数来实现本系统对文件数据的监控功能。本部分对C++语言、WindowsAPI相关函数及其调用方式作了相应的说明。第三章软件的设计与实现,本软件一共包含两个功能模块:用户界面模块和文件监控模块。这一部分首先对该软件进行了整体的设计,然后对两个功能模块分别进行了相关设计与实现。第四章测试结果与分析,本章主要采用不同的测试用例对软件进行测试,并对测试结果进行了分析。最后,对基于Windows的文件访问行为的监控软件进行了详细的总结和评价,并在结尾附上参考文献和致谢。2理论基础本章主要介绍了在软件的开发和实现的过程中所涉及到的一些理论技术基础,首先对软件实现的语言C++进行了简单阐述,然后对实现文件监控的技术基础WindowsAPI进行了宏观的介绍,最后对WindowsAPI的调用方式进行了说明。本课题的设计和实现都是基于对这些理论知识的掌握以及运用。2.1C++简介C++是C语言的继承,它集合了C语言的大部分特性,可以进行C语言的过程化程序设计,与此同时,C++还可以进行以抽象数据类型为特点的基于对象的程序设计和以继承和多态为特点的面向对象的程序设计。C++拥有计算机高效运行的实用性特征,其支持数据封装和数据隐藏、继承和重用,同时具有多态性。2.2文件监控技术基础—WindowsAPI简介API就是ApplicationProgrammingInterface,应用程序接口。操作系统往往提供了很多可以使程序进行一般任务的API,当然这其中也包括了Windows系统。WindowsAPI是一套用来控制Windows的各个部件的外观和行为的预先定义的Windows函数,囊括了应用程序编写中的各个方面,本软件的实现也是基于WindowsAPI的调用。以下将对WindowsAPI及其调用进行详细的介绍。2.2.1windowsAPI简介根据微软的定义,可以将WindowsAPI按照功能分为以下七个大类:网络类、图形和多媒体类、管理员和管理类、诊断类、安全类、系统服务类和Windows用户接口类。网络类API负责提供接口,使得用户可以访问操作系统所提供的多种网络功能,同时也可以对不同主机上的应用程序之间的相互通信提供支持。包括设备网络服务、蓝牙、NetDDE、HTTP、网络管理、RPC等。图形和多媒体类API可以为应用程序提供格式化的图像、文本、声音或者是视频,也可以输出图形等内容到外部设备,例如显示器、打印机等。在16位Windows下,图形和多媒体类API位于gdi.exe,而在32位的Windows下,其位于gdi32.dll。管理员和管理类API允许用户进行安装,而此时的注册者则是服务应用或者系统。此类API包括Windows远程管理和资源管理、引导数据、访问文件系统、注册表、系统存储和关闭等。诊断类API的作用主要是帮助用户检查、排除应用程序和系统里的故障问题,同时对应用程序和系统进行表现监督。包括应用回复和重启、错误处理机制、事件追踪、事件日志、系统检测以及对结构进行异常处理等。安全类API负责提供相应的安全服务,使用户可以用密码进行登录操作,同时可以对计算机进行权利管理、特权控制和安全审计。其中包括密码使用、安全证书登记以及相关的证明和授权。系统服务类API提供对Windows系统可用的基础资源的访问接口,使得应用程序拥有访问计算机资源的权限,也可以使应用程序获得基础操作系统的特征,例如文件系统、进程、线程等。应用程序可以通过使用这些功能来管理和检测自身工作所需要的资源,包括设备输入输出、外部设备管理、虚拟硬盘服务、内存管理等。Windows用户接口类API为应用程序提供了创造和管理一个用户接口的权限,其可以创造和管理屏幕和按钮和滚动条等的大部分基本控件,还可以接收鼠标和键盘输入并通过Windows来进行展示,同时也可以使用其他必要的任务来完成和用户之间的交互。在使用WindowsAPI函数时,会发现系统提供了两个相同的方法,但它们的结尾名字不同,比如图2.2.1中所示的两种方法。图2.2.1WindowsAPI函数的两种结尾由图可以看出,两种方法分别以W和A结尾,造成这种情景的原因是针对不同的编码方式,系统提供了不同的API。其中,A表示使用ANSI编码作为标准输入与输出流的文本编码,主要针对的是ASCII编码格式;W主要针对的是UNICODE编码;而Ex则表示功能的拓展,标注了Ex的WindowsAPI函数比起普通的WindowsAPI函数会拥有更多的功能,同理,ExA和ExW就是Ex与A、W的结合了。丰富的WindowsAPI函数为程序员在Windows系统下开发各类软件提供了极大的便利,通过使用WindowsAPI可以使应用程序得到相应的简化,使得无论是编写还是理解一个相关的应用程序都变得更加容易。2.2.2windowsAPI调用一个软件在操作系统上运行时主要分为用户态和核心态两个部分。绝大部分应用程序运行时都在用户态,而操作系统则处于核心态,所以在一般情况下应用程序并不能获得操作系统的状态。如果应用程序想获得操作系统的状态,则需要运行核心态的代码。这种两态分离的模式使得程序员在用户态的编程不能与系统和系统环境进行直接的交互,此时如果用户态中的应用程序想要获取操作系统相关的权限,就必须使用系统调用。在调用WindowsAPI函数之前,需要声明相应的头文件和动态链接库。而针对每一个具体的WindowsAPI函数,都需要先了解此函数的参数类型,这样才能对该函数的各个参数的名称、类型和数据类型进行相应的设置。图2.2.2展示了本文利用工具检测到的美图秀秀WindowsAPI调用情况,图中是其中一个DLL文件里的API函数。图2.2.2美图秀秀API调用示例对于文件访问行为的监控,如果是通过在用户态进行编程来实现,不仅需要冗长的代码,还没有访问相关文件的权限。而使用WindowsAPI函数则可以调用Windows系统自带的监控函数,这样就可以十分简便地实现相关的监控操作,这也是本课题采用调用WindowsAPI函数方式设计实现监控软件的重要原因。2.3本章小结本章主要介绍了本项目所涉及到的一些理论知识和所采用的相关技术,本项目采用C++语言进行开发,针对C++语言的特性对其进行了介绍,然后简要介绍了API函数,并将WindowsAPI函数分为七类进行阐述,然后说明了WindowsAPI函数的结尾模式,最后介绍了WindowsAPI函数调用的方式以及本课题调用WindowsAPI函数的原因。3基于Windows的文件访问行为的监控软件的设计与实现本章主要对此监控文件访问行为的软件进行详细的设计。首先明确了该软件的设计目标,再对软件进行了整体的设计,并对开发环境作了简要介绍。提出一套基于Windows系统的文件访问行为的监控软件的设计方案后,对其相关技术进行研究与分析,将整个系统分为用户界面模块和文件监控模块,然后对用户界面模块和文件监控模块进行了详细的设计。最后,本文尝试将这两个部分结合起来,并根据对相关WindowsAPI函数的分析,采用合理的方式对选取的WindowsAPI函数进行调用组合,实现一个基于Windows系统的文件访问行为的监控软件,实现为使用者管理自己的计算机提供实时、有价值的数据支持。3.1软件的设计目标根据本文背景,这个基于Windows系统的文件访问行为的监控软件主要用于对一台计算机的指定位置的文件访问行为的监控。该软件的设计与实现,可以提高使用文件系统的安全性,减少重要文件被恶意操作和错误操作的安全隐患。从某种意义上来说节约了使用者的监控成本,产生了极大的实用价值。有了这个软件,使用者和其他相关人员都可以实时得知电脑文件访问的情况,在后期还可以通过保存的监控日志查询历史监控情况。总的来说,整个软件设计包含以下几个目标:监控系统可以捕捉到相应的变化事件,并将其按类型进行分类。首先,监控系统需要对计算机指定位置的变化事件进行捕捉,当监控系统捕捉到一个变化事件后,需要对该变化事件的类型进行判断,得出该变化事件属于新增、修改、删除、重命名中的哪一类事件的结论。监控记录可以按照相应的分类实时显示于用户界面。在监控系统判断出变化事件的类型后,需要将该变化事件按照其所属的分类实时将结果反馈于用户界面,让使用者可以显而易见的了解到计算机的哪个位置的哪一个文件发生了怎样的变化。监控系统可以生成监控日志并将其保存。监控系统应根据监控进度,实时将监控记录写入监控日志中。而在一次监控结束后,监控系统应将本次生成的监控日志保存到计算机的相关位置中,以方便软件使用者后期对相应监控记录进行查阅。用户可以在界面指定监控位置,并且可以手动控制监控的开始与暂停。用户可以在软件界面指定本次监控的范围,当用户单击开始按钮时软件才会工作,用户在按下暂停按钮后软件即刻停止工作,并且用户可以在界面选择清除掉实时显示的监控记录。3.2软件的整体设计文件系统是操作系统用来识别存储设备(基于NandFlash的磁盘或SSD)或分区上的文件的方法和数据结构;即,在存储设备上组织文件的方法。负责在操作系统中管理和存储文件信息的软件组织称为文件管理系统。文件系统由三部分组成:文件系统的接口、操作和管理对象的软件集、对象和属性。从系统的角度看,文件系统是组织和分配文件存储设备空间,负责文件存储,并对存储的文件进行保护和检索的系统。具体来说,它负责为用户创建文件,以及存储、读取、修改和转储文件,它还可以控制对文件的访问,以及在用户不再使用文件时撤消文件。而在Windows操作系统中,文件系统驱动程序(FileSystemDriver,FSD)和存储设备驱动程序这两个程序承担了文件系统的大部分功能。其中,文件系统驱动程序负责文件管理,应用程序接口通过文件系统驱动程序来进行创建和存取文件的操作。按照不同的处理功能的方式,可以将文件系统进行相应的层次划分,其基本结构如图3.2.1所示。图3.2.1基于NT核心的文件系统结构这种层次结构为程序员开发文件系统的特色功能提供了十分丰富的接口。它不仅可以在FSD层利用文件系统驱动的过滤技术开发文件监控系统,还可以在应用程序接口层利用系统提供的Win32API开发存储监控系统。为了完成对存储数据的监控,有必要对机密文件进行截获操作。常用的方法有:hook函数、拦截系统调用和加载文件系统过滤驱动程序。在hook函数模式下,在用户模式下挂钩与文件操作相关的API函数,对文件操作进行监控;系统调用表中会提供相应的接口函数,通过修其中调用接口函数的入口信息,来拦截文件操作,需要过滤大量无关信息,因此这样做会造成不必要的系统开销;加载文件系统过滤器驱动程序相比较于拦截系统调用则处在更加底层的地方,因此也是很不容易实现的。通过对以上监控方式的分析,本课题通过利用Windows系统中相关的API接口直接实现用户层操作的方式是最为便捷的。这样,利用系统提供的WindowsAPI函数对文件和文件夹的变化进行监控,并根据文件信息状态的变化进行具体操作,从而达到监控和存储监控数据的目的。通过指定计算机中被监控的范围,监控程序将对该范围内的所有文件的任何操作进行监控和记录。对于指定监控范围内的文件,可以监视以下操作:新增、删除、修改、重命名。为了更好的说明软件的设计思路和系统的设计框架,如图3.2.2展示了整个系统的工作流程机构划分。图3.2.2系统体系结构图从上面的系统结构图可以看出来,该软件需要由使用者来进行一些相关的控制操作。首先需要由使用者来确定此文件访问行为监控软件的监控范围,即选择一个逻辑磁盘来对其进行监控。在确定需要监控的逻辑磁盘后,使用者单击启动监控的按钮,此时文件监控系统才会开始工作。文件监控系统开始工作后,即开始对指定的逻辑磁盘内所发生的一系列变化事件进行捕捉,捕捉到变化事件后将其存入一个缓冲区并对变化事件的类型进行判断。对于判断完成的变化事件,文件监控系统将其按照新增、修改、删除、重命名四个分类标准进行对变化事件的分类,在分类完成后,再按照相应的类别将监控记录传输至用户界面,与此同时也会按照此类别生成相关的监控日志并对监控日志进行保存。文件监控系统开始工作时,使用者可以在软件的界面上看到监控系统按照新增、修改、删除、重命名四个类别传输至用户界面模块的监控记录,此时用户界面系统和文件监控系统是同步的,所以使用者看到的监控记录也是实时的。当使用者想停止监控时,需要点击用户界面的暂停监控按钮,此时文件监控系统将停止工作。在整个监控过程中,使用者都可以通过点击清除记录按钮来清除界面上显示的监控记录,但需要注意的是,这个操作并不会清空已经存入监控日志里的监控记录。本软件从功能需求的角度大致可以分为两个部分,分别为:用户界面系统和文件监控系统。该系统采用C++语言编写,通过调用Windows系统里与之相应的一些API函数来实现实现相关功能,如图3.2.3是此文件访问行为监控软件的功能模块图。图3.2.3软件功能模块图3.3用户界面模块的设计与实现用户界面模块的主要功能是方便使用者更好的对此文件访问行为监控软件进行相应的控制操作,使用者通过点击界面上的功能按钮就可以实现控制软件的行为。用户界面模块的工作流程如图3.3.1所示。图3.3.1用户界面模块工作流程图如图所示,用户界面上会有一个记录显示框和磁盘选择、开始监控、暂停监控、清除记录这四个按钮,使用者通过点击不同的按钮来“指挥”软件完成不同的功能。通过点击磁盘选择按钮,使用者可以指定需要监控的范围,一般情况下,计算机使用者都会将文件存储至逻辑磁盘中,所以此处笔者设想的是可以选择计算机内的其中一个逻辑磁盘来进行监控。在此过程中,系统需要获取主机中所有的逻辑驱动器,同时也需要获取相应的目录和盘号的属性以便进行后续操作。获取主机中的逻辑驱动器需要调用WindowsAPI函数中的GetLogicalDriveStrings函数,而获取相应目录和盘号的属性则需要调用GetDriveTypeA函数,接下来将对这两个API函数的结构和参数定义、功能和工作机制进行一些相关分析。GetLogicalDriveStrings函数,是一个可以利用指定系统中有效驱动器的字符串填充缓冲区的函数,其结构定义如下:DWORDGetLogicalDriveStringsA(DWORDnBufferLength,LPSTRlpBuffer);LpBuffer即指向缓冲区的指针,它接收一系列以空结尾的字符串,其中一个字符串用于系统中的每个有效驱动器,外加一个附加的空字符。里面的每个字符串都是一个设备的名称。nBufferLength即LpBuffer指出的缓冲区的最大大小,此大小以TCHAR为单位。同时,此大小不包括终止空字符。如果此参数为零,则表示不使用lpBuffer。如果GetLogicalDriveStrings函数成功,则返回值是复制到缓冲区的字符串的长度(以字符为单位),不包括终止空字符。注意,ANSI-ASCII空字符使用一个字节,而Unicode(UTF-16)空字符使用两个字节。如果缓冲区不够大,则返回值大于nBufferLength。它是保存驱动器字符串所需的缓冲区的大小。如果函数失败,则返回值为零。缓冲区中的每个字符串都可以在需要根目录的地方使用,比如GetDriveType和GetDiskFreeSpace函数。此函数返回全局和本地MS-DOS设备命名空间中驱动器的级联。如果两个名称空间中都存在驱动器,则此函数将返回LocalMS-DOS设备命名空间中的条目。以下将举一个例子以便读者可以更好理解这个函数。假如系统中有4个逻辑驱动器“C:\”、“D:\”、“E:\”,“F:\”。缓冲区中内容如下:0x430x3a0x5c0x000x440x3a0x5c0x000x450x3a0x5c0x000x460x3a0x5c0x000x00。即连续存放了“C:\”、“D:\”、“E:\”,“F:\”这4个字符串。此处需要注意的是,每个字符串后都会加一个‘\0’结束符,而在所有卷标字符串的最后会再加一个结束符。而在这之后,则需要GetDriveType函数来判断磁盘驱动器是可移动的、固定的、CD-ROM、RAM磁盘还是网络驱动器。但如果要确定驱动器是否为USB类型的驱动器,就需要调用SetupDiGetDeviceRegistryProperty函数并指定SPDRP_Remove_Policy属性。GetDriveType函数结构定义如下:UINTGetDriveTypeA(LPCSTRlpRootPathName);其中,lpRootPathName指的是驱动器的根目录,而这个参数需要根目录后面的反斜杠。如果此参数为NULL,则该函数将使用当前目录的根目录。根据GetDriveType函数的返回值,可以指定驱动器的类型,其返回值可以是下表中的值之一。表3.3.1GetDriveType函数的返回值名称值含义DRIVE_UNKNOWN
0无法确定驱动器类型。DRIVE_NO_ROOT_DIR1根路径无效;例如,在指定的路径上没有安装卷。DRIVE_REMOVABLE2该驱动器具有可移动介质。例如,软盘驱动器,拇指驱动器或闪存卡读取器。DRIVE_FIXED
3该驱动器具有固定的媒体;例如,硬盘驱动器或闪存驱动器。DRIVE_REMOTE
4该驱动器是远程(网络)驱动器DRIVE_CDROM
5该驱动器是CD-ROM驱动器。DRIVE_RAMDISK6该驱动器是RAM磁盘。对于本课题的这个基于Windows系统的文件访问行为的监控软件,此处选择设置一个if语句对返回值进行判断,若返回值不是DRIVE_CDROM
,即检索到的磁盘驱动器不是CD-ROM驱动器,那么就将这个驱动器作为一个选项加入磁盘选择组合框供使用者进行选择。使用者选择一个逻辑磁盘后,下一步便是开始对这个逻辑磁盘的监控。此处笔者设想设置一个线程存在标志位g和线程结束标志位g5,将其初始值均设为0,同时调用CreateEvent函数创建一个事件对象,其相关结构定义介绍如下:HANDLECreateEventA(LPSECURITY_ATTRIBUTESlpEventAttributes,BOOLbManualReset,BOOLbInitialState,LPCSTRlpName);lpEventAttributes即指向安全属性结构的指针。如果lpEventAttributes参数为空,则子进程无法继承句柄。其中,创建的新事件的安全描述符则由该结构中的lpSecurityDescriptor成员所指定。而在该基于Windows系统的文件访问行为的监控软件中,选择将lpEventAttributes设置为NULL,这样设置后则事件将获得一个默认的安全描述符。而事件的默认安全描述符中的ACL来自创建者的主令牌或模拟令牌。bManualReset参数有true和false两种情况。如果此参数为true,则该函数将创建一个手动重置事件对象,该对象要求使用ResetEvent函数将事件状态设置为无信号状态。如果此参数为false,则该函数将创建一个自动重置事件对象,并且在释放单个等待线程后,系统会自动将事件状态重置为无信号状态。而在本项目中,由于需要由用户来控制文件监控模块的开始与否,所以此处将bManualReset参数设置为true。bInitialState参数也有true和false两种情况。如果此参数为true,则表示事件对象的初始状态;否则事件对象为无信号状态。在本项目中,事件在使用者点击开始监控按钮之前都应该处于一种无信号状态,所以在软件编写时将bInitialState参数设置为false。lpName参数表示事件对象的名称。名称仅限于MAX_PATH字符。名称比较区分大小写,并且可以具有“全局”或“本地”前缀。但在本软件的实现过程中,选择将lpName设置为NULL,即代表创建事件对象时不使用名称。当使用者点击开始监控按钮时,用户界面模块利用SetEvent函数向监控系统模块传输开始信号,此时事件被激活,同时线程存在标志位g由初始值0变为5,线程结束标志位g5由初始值0变为6,标志着文件监控模块工作的开始。同理,当使用者点击暂停监控按钮时,用户界面模块利用ResetEvent函数向监控系统模块传输结束信号,此时事件被重置,线程存在标志位g的值由5变为0,线程结束标志位g5的值由6变为5,文件监控模块停止工作。在文件监控模块开始工作的同时,监控记录也会按照新增、修改、删除、重命名的分类实时显示在用户界面上,同时也会显示发送变化的文件的路径和记录的条数。在任何时候,使用者都可以通过点击清除记录按钮来清除用户界面上显示的监控记录。此处设置了一个条数记录器cnt,其初始值为0。使用者点击按钮后,界面上显示的监控记录即刻被清空,此时条数记录器cnt也被清零,如果这个时候文件监控模块仍在继续工作,那么用户界面上新显示的监控记录条数将从1开始。3.4文件监控模块的设计与实现文件监控模块的主要功能是对指定磁盘内的所有文件访问行为进行监控,其监控着所有格式的文件的新增、修改、删除和重命名行为。当接收到相应的开始信号时,文件监控模块就会开始工作,直到再次接收到停止信号为止。文件监控模块的工作流程如图3.3.1所示。图3.4.1文件监控模块工作流程图文件监控模块开始进行监控工作前,首先需要解决的是如何访问目标文件位置的问题,此处笔者设想调用CreateFile函数创建一个访问句柄dirHandle以实现对需要监控的文件位置的访问。以下是对CreateFile函数的详细介绍:CreateFile函数用于创建或打开文件或I/O设备。最常用的I/O设备如下:文件,文件流,目录,物理磁盘,卷,控制台缓冲区,磁带机,通信资源,邮槽和管道。该函数返回一个句柄,而这个句柄取决于文件或设备以及指定的标志和属性,同时该句柄可用于访问各种类型的I/O的文件或设备,其结构定义如下:HANDLECreateFileA(LPCSTRlpFileName,DWORDdwDesiredAccess,DWORDdwShareMode,LPSECURITY_ATTRIBUTESlpSecurityAttributes,DWORDdwCreationDisposition,DWORDdwFlagsAndAttributes,HANDLEhTemplateFile);其中,lpFileName参数指要创建或打开的文件或设备的名称,而在此函数的ANSI版本中,名称仅限于MAX_PATH字符。dwDesiredAccess参数表示请求对文件或设备的读、写或读写访问。这个参数最常用的值是GENERIC_READ和GENERIC_WRITE,也可以和本软件一样,将两者同时使用。如果此参数为零,应用程序可以在不访问该文件或设备的情况下查询某些元数据,如文件、目录或设备属性。dwShareMode参数表示所请求的文件或设备的共享模式,共享模式包括对文件的读、写、删除等,也可以同时使用几种共享模式,其值如下表所示:表3.4.1dwShareMode参数值名称值含义0
0x00000000如果其他进程请求删除、读取或写入访问,则阻止它们打开文件或设备。FILE_SHARE_DELETE0x00000004允许随后在文件或设备上打开的操作请求删除或重命名访问。否则,其他进程如果请求删除或重命名访问,则无法打开文件或设备。如果未指定此标志,但已打开用于删除访问的文件或设备,则该函数将失败。FILE_SHARE_READ0x00000001允许随后打开的文件或设备上的操作请求读取访问。否则,其他进程如果请求读取访问,则无法打开文件或设备。如果未指定此标志,但已打开该文件或设备以进行读取访问,则该函数将失败。FILE_SHARE_WRITE
0x00000002允许随后打开的文件或设备上的操作请求写入访问。否则,其他进程如果请求写访问,则无法打开文件或设备。如果未指定此标志,但已打开该文件或设备以进行写入访问,或具有带有写访问权限的文件映射,则该函数将失败。无论进程上下文如何,直到该句柄关闭为止,每个打开句柄的共享选项一直有效。如果此参数为零,并且CreateFile成功,则无法共享文件或设备,并且在关闭文件或设备的句柄之前不能再次打开该文件或设备。同时,不能请求与具有打开句柄的现有请求中指定的访问模式冲突的共享模式,否则CreateFile函数将失败。lpSecurityAttributes参数指指向SECURITY_ATTRIBUTES结构的指针,在本项目中,选择将这个参数设为NULL,所以应用程序可能创建的任何子进程无法继承CreateFile返回的句柄,并且与返回句柄关联的文件或设备将获得默认的安全描述符。dwCreationDisposition参数指对存在或不存在的文件或设备执行的操作,具体可取的值如下表所示:表3.4.2dwCreationDisposition参数值名称值含义CREATE_NEW1当该文件不存在时,创建一个新文件。如果指定的文件存在,则函数将失败,如果指定的文件不存在,并且是可写位置的有效路径,则将创建一个新文件。CREATE_ALWAYS2无论原来是否有文件,都创建一个新文件。如果指定的文件存在并且是可写的,则函数覆盖文件,如果指定的文件不存在,并且是有效路径,则创建一个新文件,函数成功。OPEN_EXISTING3只在文件或设备存在的情况下打开它。如果指定的文件或设备不存在,则函数失败。OPEN_ALWAYS
4无论原来的文件是否存在,都打开一个文件。如果指定的文件存在,则函数成功,如果指定的文件不存在,并且是可写位置的有效路径,则函数将创建一个文件。TRUNCATE_EXISTING5打开一个文件并截断它,如果指定的文件不存在,则函数失败。在本项目中,由于函数发起访问请求的对象是使用者所指定的逻辑磁盘,所以选择将此参数设置为OPEN_EXISTING。dwFlagsAndAttributes参数指文件或设备的属性标志,当CreateFile打开一个现有文件时,通常会将文件标志与现有文件的文件属性组合使用。此参数的标志值与属性值较多,此处只对本项目涉及到的值进行介绍,其余值就不在此进行赘述。表3.4.3dwFlagsAndAttributes参数标志值名称值含义FILE_FLAG_BACKUP_SEMANTICS0x02000000正在为备份或还原操作打开或创建文件,必须设置此标志才能获取目录的句柄。FILE_FLAG_OVERLAPPED0x40000000正在为异步I/O打开或创建文件或设备,如果指定了此标志,则该文件可用于同时进行读写操作。具有GENERIC_READ访问权限的模板文件的有效句柄。打开现有文件或设备时,CreateFile将忽略此参数。而在本项目中,所有能被监控到的逻辑磁盘都是存在的设备,所以在实现此文件访问行为监控软件时,选择将此参数设置为NULL。根据访问句柄返回值的不同,文件监控系统可以判断出目标文件位置是否接受访问。如果目标设备接收访问,则函数成功,返回值是指定文件、设备、命名管道或邮件槽的打开句柄。若目标文件位置拒绝接收访问,则返回值为INVALID_HANDLE_VALUE,同时文件监控系统也会将相应错误信息传输至用户界面以此通知使用者错误的发生。如果目标文件位置接受来自文件监控模块的访问,则WaitForSingleObject函数接收到相关信号,WaitForSingleObject函数结构定义如下:DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);指定的对象处于信号状态或超时间隔过去前,WaitForSingleObject函数都处于等待状态。其中,hHandle参数即对象的句柄,本项目中设置为由CreateEvent返回的事件句柄hEvent。如果此句柄在等待仍然挂起时关闭,则表示函数的行为未定义。dwMilliseconds参数指超时间隔,以毫秒为单位。如果指定了非零值,则函数将等待对象发出信号或间隔已过去。如果dwMilliseconds参数的值为零,则如果对象未发出信号,那么该函数不会进入等待状态,它始终会立即返回。而在本项目中,选择将dwMilliseconds参数的值为INFINITE,这个值代表只有在发出信号时函数才会返回,而信号则在使用者点击开始监控按钮后才会发出。如果函数成功,则返回值指示导致函数返回的事件,其具体值如下表所示:表3.4.4dwMilliseconds参数返回值返回代码/值含义WAIT_ABANDONED指定的对象是一个互斥对象,在拥有线程结束之前,拥有互斥对象的线程没有释放该互斥对象。将互斥对象的所有权授予调用线程,并将互斥对象状态设置为无信号状态。WAIT_OBJECT_0指示指定对象的状态。WAIT_TIMEOUT超时间隔过去了,对象的状态没有信号.WAIT_FAILED功能失败。本项目中,设置返回值为WAIT_OBJECT_0时,文件监控模块开始调用ReadDirectoryChangesW函数对该目标位置的文件访问行为进行监控。ReadDirectoryChangesW函数负责检索描述指定目录中的更改的信息,但该函数不报告对指定目录本身的更改,其结构定义如下:BOOLReadDirectoryChangesW(HANDLEhDirectory,LPVOIDlpBuffer,DWORDnBufferLength,BOOLbWatchSubtree,DWORDdwNotifyFilter,LPDWORDlpBytesReturned,LPOVERLAPPEDlpOverlapped,LPOVERLAPPED_COMPLETION_ROUTINElpCompletionRoutine);hDirectory参数指要监视的目录的句柄。该项目中此句柄为CreateFile函数创建的句柄dirHandle,需要注意的是,被监视的目录必须以打开FILE_LIST_DIRECTORY访问权限,或是像GENERIC_READ这样包含FILE_LIST_DIRECTORY访问权限的权限。lpBuffer参数指指向DWORD对齐格式的缓冲区的指针,将在其中返回读取结果。该缓冲区的结构由FILE_NOTIFY_INFORMATION结构定义,该结构会在接下来的文字中为读者进行详细讲述。nBufferLength参数指lpBuffer参数指向的缓冲区大小,以字节为单位。通过bWatchSubtree参数的值可以判断函数的监视范围。如果此参数为TRUE,则该函数监视以指定目录为根的目录树。如果此参数为FALSE,则该函数仅监视hDirectory参数指定的目录。dwNotifyFilter的值是函数检查以确定等待操作是否完成的筛选条件,此参数可以是以下值中的一个或多个。表3.4.5dwNotifyFilter参数值值含义FILE_NOTIFY_CHANGE_FILE_NAME监视目录或子树中的任何文件名更改都会导致更改通知等待操作返回。更改包括重命名、创建或删除文件。FILE_NOTIFY_CHANGE_DIR_NAME监视目录或子树中的任何目录名称更改都会导致更改通知等待操作返回。更改包括创建或删除目录。FILE_NOTIFY_CHANGE_ATTRIBUTES监视目录或子树中的任何属性更改都会导致更改通知等待操作返回。FILE_NOTIFY_CHANGE_SIZE监视目录或子树中任何文件大小的更改都会导致更改通知等待操作返回。只有当文件写入磁盘时,操作系统才会检测到文件大小的变化。对于使用广泛缓存的操作系统,只有在缓存被充分刷新时才会进行检测。FILE_NOTIFY_CHANGE_LAST_ACCESS对监视目录或子树中文件的最后访问时间的任何更改都会导致更改通知等待操作返回。FILE_NOTIFY_CHANGE_CREATION对监视目录或子树中文件创建时间的任何更改都会导致更改通知等待操作返回。FILE_NOTIFY_CHANGE_SECURITY监视目录或子树中的任何安全描述符更改都会导致更改通知等待操作返回。由于本课题的目的是监控指定磁盘中文件的新建、修改、删除、重命名操作,所以此处设置dwNotifyFilter的值为FILE_NOTIFY_CHANGE_FILE_NAME、FILE_NOTIFY_CHANGE_DIR_NAME、FILE_NOTIFY_CHANGE_SIZE。lpBytesReturned参数对于同步调用,接收传输到lpBuffer参数中的字节数。而对于异步调用,此参数是未定义的。lpOverlapped指针和lpCompletionRoutine指针都是异步调用所涉及的,与本课题的实现无关,所以此处将其都设置为NULL。对于ReadDirectoryChangesW函数捕捉到的变化事件,先将其存储到FILE_NOTIFY_INFORMATION结构定义的缓冲区中,以下将结合对FILE_NOTIFY_INFORMATION结构的详细描述来对接下来的监控流程进行阐述:typedefstruct_FILE_NOTIFY_INFORMATION{DWORDNextEntryOffset;DWORDAction;DWORDFileNameLength;WCHARFileName[1];}FILE_NOTIFY_INFORMATION,*PFILE_NOTIFY_INFORMATION;其中,NextEntryOffset参数表示必须跳过以到达下一条记录的字节数,而零值表示这是最后一条记录。参数Action表示发生的更改的类型,由于计算机文件访问的所有行为基本上都可以囊括到新增、修改、删除、重命名这四种分类之中,所以根据Action值的不同,再结合switch-case语句,就可以判断变化事件属于新增、修改、删除、重命名这四种分类中的哪一类。Action的值如下表所示:表3.4.6Action参数值值含义FILE_ACTION_ADDED该文件被添加到目录中。FILE_ACTION_REMOVED该文件从目录中被删除。FILE_ACTION_MODIFIED文件被修改了。其中包括了时间戳或属性的更改。FILE_ACTION_RENAMED_OLD_NAME文件被重命名,这是旧的名称。FILE_ACTION_RENAMED_NEW_NAME文件被重命名,这是新的名称。FileNameLength参数的功能是记录的文件名部分的大小,该参数以字节为单位。需要注意的是,此值不包括终止空字符。FileName参数是可变长度字段,包含相对于目录句柄的文件名。文件名采用Unicode字符格式,并且不以null终止。如果文件有短名和长名,该函数将返回这些名称之一,但未指定是短名和长名中的哪一个。判断变化事件的类型后,接下来本应将变化事件按相应分类传输至用户界面和监控日志中。但由上文可知,FILE_NOTIFY_INFORMATION结构中的字符格式为Unicode字符格式,不能直接传输至用户界面和写入监控日志,所以本课题选择利用WideCharToMultiByte函数将其以新的字符格式映射到新字符串来解决这个问题。对WideCharToMultiByte函数的结构定义作简单介绍如下:intWideCharToMultiByte(UINTCodePage,DWORDdwFlags,_In_NLS_string_(cchWideChar)LPCWCHlpWideCharStr,intcchWideChar,LPSTRlpMultiByteStr,intcbMultiByte,LPCCHlpDefaultChar,LPBOOLlpUsedDefaultChar);其中,CodePage参数指指定执行转换的代码页,本课题中将其值设置为CP_ACP,即系统默认的WindowsANSI代码页。dwFlags参数允许调用者进行额外的控制,此参数会影响使用了读音符号(比如重音)的字符,本课题中的文件名并不会涉及读音符号,所以将此参数设为0。lpWideCharStr参数指定了要转换为宽字节字符串的缓冲区。cchWideChar参数指定了由参数lpWideCharStr指向的缓冲区的字符个数,由于一个字符需要占两个字节,所以本项目中对此参数做了除以2的处理。lpMultiByteStr参数指定了指向接收被转换字符串的缓冲区,而intcchMultiByte参数指定了此缓冲区最大值,在本项目中将其设置为99。LPCSTRlpDefaultChar参数和LPBOOLpfUsedDefaultChar参数主要针对的是字符不能转换的情况,在本课题中并不涉及,所以将这两个参数设置为NULL。然后,通过调用PathFindFileNameA函数和PathFindExtensionA函数获取路径中的文件名和其扩展名,再根据上文所述的四种分类将监控记录传输至用户界面。与此同时,文件监控模块也将通过文件输入输出流将监控记录写入监控日志来进行保存,以方便使用者进行后续的查阅操作。此处需要注意的是,监控日志本身也是一个文件,所以按理来说监控日志文件的变动也会被监控到,但这样就会陷入日志文件更改-记录到日志文件中-日志文件再次更改的死循环中。针对这个问题,本项目设置了一个变量pos,用于定位日志文件的文件名的下标,若找到的变化事件不属于日志文件,即下标值为负数,那么才对这个变化事件进行接下来的判断和记录。3.5本章小结本章是系统的设计实现部分。本章首先介绍了此基于Windows系统的文件访问行为的监控软件的设计目标,然后对该软件进行了一个整体的设计,接下来根据软件的整体设计情况,对该软件的用户界面模块和文件监控模块进行了详细的设计与实现,同时也详细地介绍了实现过程中涉及的WindowsAPI函数及其运用方式。4软件功能测试本章的主要内容是介绍了该软件的相关功能的测试工作。测试内容主要包括用户操作测试、文件监控测试以及监控日志测试。4.1用户操作测试该部分主要测试了用户对于磁盘的选择和监控的控制是否可以正常进行,测试结果如图所示。注;本测试计算机只有C、E两个逻辑磁盘图4.1.1磁盘选择框测试图4.1.2其余控制按钮测试由上图可得,用户界面各按钮均可正常工作。4.2文件监控测试该部分主要测试了文件监控模块是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年注册核安全工程师考试(一、二、三级)真题汇编及答案
- 护理工作挑战与应对
- 慢性阻塞性肺疾病(COPD)的护理
- FR194738-Standard-生命科学试剂-MCE
- 2025年无人机管制技术成果展示
- 2026net core面试题及答案
- 2026layui常见面试题及答案
- 小儿惊厥的并发症预防与处理
- 2026年洛阳老城区招考事业单位工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 2026年河源市财政局事业单位招考工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年国企常见面试题及参考答案
- 知识产权合规管理体系建设方案
- 2026百万英才汇南粤广东东莞市东城社区卫生服务中心招聘纳入岗位管理编制外人员12人笔试备考试题及答案解析
- 2026年物理实验员岗位面试专业题集
- 滤筒式除尘器设计计算表
- 病理科职业暴露应急处理演练脚本
- 2026年高考考前预测卷-物理(安徽卷)(考试版及全解全析)
- 2026年食堂从业人员食品安全培训及答案
- 2026年医护一体化在临床护理应用方面的现状及进展分析课件
- 2026年公证服务中心下属事业单位选聘考试试题(附答案)
- 美军梅文(Maven)人工智能指挥系统深度战略研究报告 -欧洲“无人机墙”项目对中国低空飞行物监视与空域态势感知网络建设的启示
评论
0/150
提交评论