Windows文件读写监控系统.docx
- 文档编号:8781821
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:11
- 大小:94.39KB
Windows文件读写监控系统.docx
《Windows文件读写监控系统.docx》由会员分享,可在线阅读,更多相关《Windows文件读写监控系统.docx(11页珍藏版)》请在冰豆网上搜索。
Windows文件读写监控系统
Windows文件读写监控系统
摘要:
21世纪,人类进入了一个全新的时代,一个以计算机技术为代表的信息时代。
人们的生活节奏随着信息技术的快捷方便而变快。
在这次信息革命中谁拥有便捷的信息,谁就掌握了时代的命脉,占据技术的颠峰。
在PC领域,称霸桌面的Windows系统的垄断和不公开源代码,对我们研究更是带来很大困难。
本程序的全称为Windows下的文件监视程序,是一个工具软件。
通过本程序的分析和设计,为创建更大的软件工程提供了一定的帮助。
在逆向工程中,可以利用本程序,分析进程的文件读写情况,对工程的开发提供了一定的帮助。
本程序采用VC开发环境,利用DLL挂接,拦截API等技术实现了对目标进程的文件读写监视
关键词:
文件监视程序工具软件DLL挂接拦截API
1.引言
1.1课题背景
以计算机为代表的信息技术在近几年在全世界得到了飞速的发展,在企事业单位计算机已经成为主要的工作平台,在个人的日常生活中,计算机已经非常普及,就像普通家电那样。
计算机技术的运用可以帮助人们减轻负担,提高工作效率。
然而我们国家计算机研究起步相对较晚,特别在PC领域,微软的windows平台垄断了我们国家的绝大部分,再加上它的源代码的不公开,以及众多版本,给我国的平台研究更是带来了很大的困难。
现在我们国家已经有一些公司和集体在研究操作系统。
本程序是一个工具软件,它可以做为很多软件项目的工具,可以在项目开发前期进行简单的构造。
在设计本程序的时候,运用了很多热门技术,比如DLL挂接和远线程注射等,在很多杀毒软件和防火墙软件中都有它们的身影。
1.2系统开发的目的和意义
本程序作为一个工具软件,之所以设计它,主要一方面出于学习研究一些热门技术,以及利用这些技术能到达一个什么效果。
它用到的技术,比如DLL挂接,API拦截,这些技术在很多杀毒软件等中运用的很多。
比如卡巴斯基,它在进程读写时进行拦截,获得读写文件的数据,再利用其杀毒引擎进行查杀病毒。
上面提到的拦截实际上是对文件读写API(比如ReadFile,WriteFile等)。
很多游戏外挂利用远线程注射,将木马DLL插入游戏进程空间内,一旦插入成功,它就能破坏进程的正常运行,甚至有的对游戏进程的数据区进行搜索内帐号密码等信息,达到窃取帐号等目的。
类似这些技术用处很大,几乎所有的市面上知名的软件都有用到。
另一方面是其实用性。
本小程序能拦截目标进程对文件的操作,并向用户报告,并且可以设置对目标进程对文件只读,对一些重要数据可以起到一定的仿删除作用。
比如一些病毒就专门破坏移动存储设备内的文件,通过对对其设置只读就可以防止这类事情的发生。
1.3国内外概况
在国外技术环境相对较好,很多公司都对windows文件系统都有深刻的研究,并且开发了很多文件过滤驱动程序,他们的功能都类似,这些驱动都处于功能驱动之上,通过对某些IO请求包(IRP)的过滤,实现一定的功能。
由于驱动处在内核模式,因此这种方式功能非常强大,杀毒软件一般都在内核模式下监视进程的文件操作,它最先收到进程的IRP,通过修改,抛弃IRP,很容易实现文件的监视效果。
另一种方法是在用户模式下监视,这种方法相对简单,它主要是拦截API,将API的头几个字节修改跳转指令,使跳转的我们自己写的替换API中,这样一旦目标进程调用了该被修改的API,就跳到我们写的替换API上了,通过修改传递进来的参数实现某些功能。
在国内,台湾的志远公司设计的还原精灵,它则是修改MBR,使它的程序先被执行,然后将之前保存的FAT覆盖现在的FAT,到达文件系统的还原。
内地的硬盘保护卡,则是采用文件过滤驱动方式。
2.应用技术
本程序作为一个工具软件,出于学习研究一些热门技术,以及利用这些技术能到达一个什么效果。
用到VisualC++开发语言,用到API,APIHOOK,API拦截,DLL挂接等,这些技术在很多杀毒软件等中运用的很多。
2.1API
(1)API定义
API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组编程的能力,而又无需访问源码,或理解内部工作机制的细节。
API函数包含在Windows系统目录下的动态链接库文件中。
(2)WindowsAPI
WindowsAPI是一套用来控制Windows的各个部件的外观和行为的一套预先定义的Windows函数。
用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么。
更易理解地说:
Windows这个多作业系统除了协调应用程序的执行、分配内存、管理系统资源之外,它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序,所以便称之为ApplicationProgrammingInterface,简称API函数。
凡是在Windows工作环境底下执行的应用程式,都可以调用WindowsAPI。
(3)API分为四种类型
远程过程调用(RPC):
通过作用在共享数据缓存器上的过程(或任务),实现程序间的通信。
标准查询语言(SQL):
是标准的访问数据的查询语言,通过通用数据库实现应用程序间的数据共享。
文件传输:
文件传输通过发送格式化文件实现应用程序间数据共享。
信息交付:
指松耦合或紧耦合应用程序间的小型格式化信息,通过程序间的直接通信实现数据共享。
2.2APIHOOK
在Windows系统下编程,应该会接触到API函数的使用,常用的API函数大概有2000个左右。
随着控件,stl等高效编程技术的出现,API的使用概率在普通的用户程序上就变得越来越小了。
当诸如控件这些现成的手段不能实现的功能时,我们还需要借助API。
最初有些人对某些API函数的功能不太满意,就产生了如何修改这些API,使之更好的服务于程序的想法,这样APIHOOK就自然而然的出现了。
通过APIHOOK,改变一个系统API的原有功能。
基本的方法就是通过HOOK“接触”到需要修改的API函数入口点,改变它的地址指向新的自定义的函数。
APIHOOK并不属于MSDN上介绍的13类HOOK中的任何一种。
所以说,APIHOOK并不是什么特别不同的HOOK,它也需要通过基本的HOOK提高自己的权限,跨越不同进程间访问的限制,达到修改API函数地址的目的。
对于自身进程空间下使用到的API函数地址的修改,是不需要用到APIHOOK技术就可以实现的。
2.3VisualC++
VisualC++是一种可视化的、面对对象的高级程序设计,可用于开发Windows环境下的种类应用程序。
它简单易学、效率高,且功能强大。
在VisualBasic环境下,使用Windows内部的应用程序接口(API)函数,以及动态链接库(DLL)、动态数据交换(DDE)、对象的链接与嵌入(OLE)、开放式数据访问(ODBC)等技术,可以高效、快速地开发出Windows环境下功能强大、图形界面丰富的应用软件系统。
同时,由于本程序中的监视模块必须做成一个动态链接库,所以要求的开发环境必须能很好的支持动态链接库的开发。
2.4DLL
动态链接库英文为DLL,是DynamicLinkLibrary的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL还有助于共享数据和资源。
多个应用程序可同时访问内存中单个DLL副本的内容。
DLL是一个包含可由多个程序同时使用的代码和数据的库。
3.系统总体分析
3.1系统的可行性研究
可行性研究的目的是用最小的代价在尽可能短的时间内确定问题是否能够解决。
也就是说可行性研究的目的不是解决问题,而是确定问题是否值得去解,研究在当前的具体条件下,开发新系统是否具备必要的资源和其它条件。
一般说来,应从经济可行性、技术可行性、运行可行性、法律可行性和开发方案可行性等方面研究可行性。
3.2系统需求分析
由于开发该系统的工具为Microsoft公司的VisualC++6.0,所以在分析阶段应当结合VisualC++6.0这种工具的自身的特点进行建模。
这样,一方面能够最大限度的发挥该工具的优越性;另一方面,可以利用该工具的优点使系统更加完善、可靠和稳定。
本程序为一个工具软件。
该程序要满足如下功能:
(1)程序应建立友好的界面,既要操作简单、直观、灵活,又要易于学习掌握。
(2)本程序需要在目标进程插入DLL,要保证不去破坏目标进程的正常运行。
(3)如果本程序用来监视系统进程,要保证不去破坏系统进程,不使系统无法工作。
(4)系统的模块化程度要高,系统可扩充、易维护。
3.3系统数据流图
数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输入到输出的过程中所经受的变换。
在数据流图中没有任何具体的物理元素,它知识描绘信息在软件中流动和被处理的情况。
因为数据流图是系统逻辑功能的图形表示,即使不是专业的计算机技术人员也容易理解它,所以是分析员与用户之间极好的通信工具。
此外,设计数据流图时只需要考虑系统必须完成的基本逻辑功能,完全不需要考虑怎样具体地实现这些功能。
系统总的数据流图如图3.1所示。
进程文件读写信息
进程文件读写信息
目标进程
图3.1系统总数据流图
系统功能级数据流图如图3.2所示。
被监视进程名
图3.2系统功能级数据流图
4.系统总体设计
4.1功能模块分析
本程序的主要任务是监视进程的文件读写操作。
主要用户为软件项目开发人员。
程序提供友好界面,操作简单。
为实现这些功能,系统要包含如下几个基本模块:
(1)监视模块。
负责监视本进程的文件操作。
(2)DLL注射模块。
注射监视模块到被监视进程地址空间。
(3)信息交换模块。
收集文件操作信息和负责进程间通信。
(4)数据显示模块。
显示收集来的信息。
(5)APIHOOK模块。
HOOK需要挂钩的API函数。
(6)选项模块。
配置程序监控设置。
(7)文件读写监控模块。
核心模块,负责监控文件读写操作。
此外采用硬件软件及科学的系统开发方案,设计本程序,实现文件监视的计算机自动化。
系统应符合现代化、自动化的管理制度,并达到操作直观、方便、实用、安全等要求。
系统总体流程图如图4.1.所示
图4.1系统总体流程图
系统功能模块如图4.2所示
图4.2系统总体功能模块图
4.2显示模块
显示模块是向用户报告监视信息的主要地方。
当注射模块将监视模块注射到被监视进程中后,显示模块向之前建立的内存文件映射中获取数据,而这些数据有监视模块提供。
在监视模块里主要通过一个列表控件,显示监视信息。
4.3注射模块
注射模块的作用是负责将监视模块注射到被监视进程地址空间中去。
用CreateThread可以在当前进程里建立一个线程,远线程与此类似,只不过是在其他进程中建立一个线程,用API函数CreateRemoteThread。
这个远线程建立后就与建立它的进程无关了,而是进入了另外一个进程。
举例说,进程A可以在进程B中建立一个远线程,这个远线程就是进程B中的线程了,而此时如果进程A结束了,也不会影响到那个远线程的运行,除非进程B也结束了,那个远线程才会结束。
远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。
我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。
不过,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。
其工作过程步骤如下:
第一步找到目标进程的PID,假设把目标进程定为explorer.exe。
第二步调用OpenProcess(参数表)来打开目标进程--远程PROCESS_CREATE_THREAD。
允许远程创建线程
PROCESS_VM_OPERATION
允许远程VM操作
PROCESS_VM_WRITE
允许远程VM写操作,参数表示要对目标进程的权限的分配,这里在参数中要提供第一步获取的PID。
第三步要调用VirtualAllocEx(HANDLEhProcess,LPVOIDlpAddress,SIZE_TdwSize,DWORDflAllocationType,DWORDflProtect)函数在目标进程中分配内存。
其中hProcess是嵌入目标进程的句柄,在我们的实际操作中是一个远程的进程。
dwSize是要分配的内存大小。
第四步调用WriteProcessMemory()函数向申请的内存中写入要注入木马.dll的路径和名称
writeProcessMemory
(hRemoteProcess,//远程进程pszLibFileRemote,//具体空间
(PVOID)wCurPath,//远程进程路径
changdu,NULL//长度);
第五步计算入口地址,也就是远程线程的地址
PTHREAD_START_ROUTINE
pfndizhi=GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryW");
Pfndizhi为入口地址,LoadLibraryW函数是在kernel32.dll中定义的,就是用来启动DLL文件
第六步利用CreateRemoteThread()在远程进程中创建一个线程,这个线程执行LoadLibraryW,就实现了通过远程线程调用木马DLL文件。
要把LoadLibraryW的入口地址代入
hRemoteThread=CreateRemoteThread(hRemoteProcess,NULL,0,pfndizhi,pszLibFileRemote,0,NULL);
4.4APIHOOK模块
当动态链接库被注入到目标进程之后,动态链接库的初始化函数会负责将进程中会调用的读写文件的API函数HOOK住。
该类的构造函数需要传入三个参数:
需要HOOK的API函数的函数名,目标API函数所在地动态链接库文件名以及自己的处理函数的地址。
HOOKAPI函数的主要流程如下:
(1)动态链接库通过LoadLibrary函数加载目标API所在地DLL文件,并获取你句柄;
(2)成功获取DLL句柄之后,使用GetProcAddress函数获取目标API函数在进程中的内存地址;
(3)之后需要调用ReadProcessMemory函数读取API函数所在位置的函数汇编代码,并保存;
(4)向目标API函数所在的内存地址写入跳转汇编码,当应用程序执行到函数开头时就会执行新写入的跳转代码跳转到自己的处理函数中去。
从而截获文件的读写操作。
其流程图如下:
图4.4APIHOOK流程图
4.5选项模块
该模块是一个对话框,它的作用是显示当前系统的所有进程,由用户选择要监视的进程,它在对话框初始化的时候获取系统中的所有进程名,显示在左边的对话框。
选项模块的主要功能是获得系统内的所有进程名,并将它们用一个列表空间显示,由用户选择监视哪些进程,同过双击列表控件的选项,将选中的进程明添加到”监视进程列表”中,该列表列出了所有要监视的进程名。
如果选择了“只读”复选按钮,对被监视采取只读,使被监视进程对文件只能读。
该模块通过系统快照来获得当前系统内的所有进程,对当前系统所有已开启的进程进行枚举,就必须首先获得那些加载到内存的进程当前相关状态信息。
在Windows操作系统下,这些进程的当前状态信息不能直接从进程本身获取,系统已为所有保存在系统内存中的进程、线程以及模块等的当前状态的信息制作了一个只读副本--系统快照,用户可以通过对系统快照的访问完成对进程当前状态的检测。
在具体实现时,系统快照句柄的获取是通过Win32API函数CreateToolhelp32Snapshot()来完成的,通过该函数不仅可以获取进程快照,而且对于堆、模块和线程的系统快照同样可以获取。
在得到系统的快照句柄后,就可以对当前进程的标识号进行枚举了,通过这些枚举出的进程标识号可以很方便的对进程进行管理。
进程标识号通过函数Process32First()和Process32Next()而得到,这两个函数可以枚举出系统当前所有开启的进程,并且可以得到相关的进程信息。
4.6文件读写监控模块
本模块为对进程文件读写操作监控的核心模块,本模块能够在被监控进程尝试读写文件时进行拦截,从而获得进程尝试读写文件的句柄,通过文件句柄得到文件路径,完成文件读写监控功能。
本模块需要以上所有模块组合完成。
进程在对文件进行读写时必须先调用OpenFile或CreateFile函数打开文件,打开文件后进程调用WriteFile和ReadFile函数对文件进行读写操作。
因此本模块的主要工作流程如下:
(1)选择需要监控的进程,也可以选择全局监控,即监控系统中所有进程。
(2)将包含监控功能的动态链接库通过注射模块注射到远程进程。
(3)被注射的动态链接库在初始化过程中使用APIHOOK类分别挂钩OpenFile,CreateFile,ReadFile,WriteFile函数四个函数。
其工作流程图如下:
图4.5开始监控流程图
当OpenFile,CreateFile,ReadFile,WriteFile四个API函数被挂钩后,当被挂钩的API函数被调用就会跳转到我们的钩子函数中去执行,从而进程的读写文件操作被拦截下来,当监控程序允许进程对文件的读写操作时只需要恢复被调用的API函数,然后调用API函数即可。
否则直接返回访问不被允许。
其工作流程如下:
(1)进程准备对文件进行读写操作;
(2)进程调用CreateFile或者OpenFile函数对文件进行打开操作;
(3)HOOK函数CreateFile或OpenFile的代码被执行;
(4)跳转到监控程序的监控代码中执行;
(5)监控程序确定是否允许进程的文件读写操作;
(6)如果允许则恢复被HOOK的API函数,并调用,在调用后重新将API进行HOOK;
(7)如果不允许则直接向进程返回操作失败。
其工作流程图如下:
图4.6监控模块实现流程图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 文件 读写 监控 系统