好文档 - 专业文书写作范文服务资料分享网站

用VXD技术实现的文件系统保护程序示例

天下 分享 时间: 加入收藏 我要投稿 点赞

用VXD技术实现的文件系统保护程序示例

要对Windows9x操作系统下的文件进行保护,只能通过驱动级开发来实现。通常情况下是写一个Installable File System Hook(IFSH,可安装文件系统挂钩程序)加载在系统中,然后在其中监控系统的文件操作。当发现系统在作你希望监控的操作时,进行你需要的操作(此时系统并没有进行实际的操作,你赶在了系统操作之前)。进行此项开发需要相应平台的IFS kit (可安装文件系统开发包),Windows9x的在它们的DDK中已经包含,但Windows NT和Windows 2000的IFS kit需要向微软购买(目前估价$6000,国内好象还没有,你自己找吧,看运气了)。

现在大部分杀毒软件号称的虚拟机技术就是我们将要介绍的基于IFS(可安装文件系统,下同)的文件系统操作技术。不同的是它们是在文件操作之前检查一下特征码,看有没有感染病毒,而我们所要作的是检查一下该文件是否允许存取,对它们作相应的保护。

下面我们以一个用于指定的文件的操作保护的程序为例介绍一下这种技术。

我们把它设计成为对磁盘(逻辑盘)、具体文件作相应保护的工具。为了简化起见,我们只启用了防删除保护。同样的原理你也可以自己扩充功能。

完整的源代码可以从以下网址下载:

并且在不断发展更新中,欢迎时常访问本站并更新你的代码。 本套程序包括后台VXD驱动程序和前台程序两个部分。 本程序开发环境如下: Windows 98 第二版 VC++ 6.0专业版

VTOOLSD 3.0(DRIVERSTUDIO 2.0中自带的)

一、 后台VXD程序的生成和编写

我们用VXD辅助开发工具VTOOLSD 3.0版本来生成程序框架。

1. 设置一般选项

打开vtoolsd的Quick Vxd后将设备参数页作如下设置:

其中在设备名框中输入的”FILHOOK”将作为生成的设备名出现在系统中,你可以用Vtoolsd自带的 vxd viewer查看系统中加载的驱动程序,如果你已经成功加载此驱动程序,你将看到如下图所示的画面:

证明已经加载入系统中。

2. 程序入口方式设置

一般情况下,我们在windows9x下加载的VXD驱动程序都必需使用”Protected Mode”保护模式方式。关于详细的说明,请参阅本专栏前面的文章中的介绍。 3. 必需响应的系统消息

由于我们的驱动程序要求必需能动态加载,而且能够响应win32应用程序的控制,并与Win32前台程序交互作用,所以必需响应系统的如下三个消息 (由操作系统的虚拟机管理器VMM发给我们的驱动程序的系统通知消息) :

SYS_DYNAMIC_DEVICE_EXIT :驱动程序动态卸载通知消息 SYS_DYNAMIC_DEVICE_INIT :驱动程序动态加载通知消息

W32_DEVICEIOCONTROL :WIN32设备输入输出控制消息(由win32前台程序发给VXD驱动程序的消息)

生成框架后,我们再加入自己的代码。 第一部分:实现文件定义。 // - main module for VxD FILEHOOK

#define DEVICE_MAIN #include \

Declare_Virtual_Device(FILEHOOK) //VXD设备名 #undef DEVICE_MAIN

//此处为我们加入的控制消息定义,注意,这里的消息不是windows消息,而是由DeviceIoControl函数发给VXD的消息。

#define REMOVE_DRV 100 //删除在保护列表中的一个驱动器 #define REMOVE_FILE 101 //删除在文件列表中的一个文件 #define REMOVE_DIR 102 //删除在目录列表中的一个目录名 #define ADD_DIR 103 //添加要保护的目录名到列表中 #define ADD_DRV 104 //添加要保护的驱动器到列表中 #define ADD_FILE 105 //添加要保护的文件名到列表中 #define STARTP 106 //启动保护 #define STOPP 107 //停止保护 #define PREAD 10 //读保护 #define PDELETE 11 //删除保护 ,目前我们只实现此保护 #define PWRITE 12 //写保护

#define PALL #define PCREATE 13 14 //保护所有的操作

//禁止创建文件

由于时间关系,我们只实现了文件删除保护和驱动器删除保护。其它的保护只是响应不同的系统操作类型而已。(目录操作保护和文件操作保护机理不同,另文探讨)

FilehookVM::FilehookVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}

FilehookThread::FilehookThread(THREADHANDLE hThread) : VThread(hThread) {}

BOOL FilehookDevice::OnSysDynamicDeviceInit() { PrevHook = IFSMgr_InstallFileSystemApiHook(MyIfsHook);//安装文件系统挂钩回调函数

//初始化数据成员 FILE=DIR=NULL;

//将目录和文件列表指针初始化为NULL,实际上,文件名和目录列表都是一个单链表,你也可以用hash表等来实现。

ENDFILE=FILE; //初始化尾指针 ENDFILE->Next=NULL; //将尾指针的下一个元素指针初始化为NULL ENDDIR=DIR; ENDDIR->Next=NULL; for(int i=0;i<26;i++) DRIVER[i].iIsIn=0;

//将驱动器列表初始化,此时表时没有驱动器,当加入驱动器时,只需要将相应的元素的iIsIn域置为1即可。

//以下代码打开日志文件,调用的是Ring0级的文件i/o函数,当然,此时的日志很简单,只记录了什么文件被保护,什么文件被企图删除

WORD pAction; BYTE pError; ::logfile=R0_OpenCreateFile(true,\Y,ATTR_NORMAL,ACTION_IFNOTEXISTS_CREATE|ACTION_IFEXISTS_TRUNCATE,R0_NO_CACHE,&pAction,&pError);

//logfile为全局日志文件句柄 ::WriteLog(logfile,\开始记录\ return TRUE; }

BOOL FilehookDevice::OnSysDynamicDeviceExit() //动态卸载事件响应函数 { //删除动态分配的内存,这些内存是在前台程序加入文件或目录到保护列表时动态分配的

FT *temp;//临时指针变量 while(FILE!=NULL)//文件列表 { temp=::FILE; ::FILE=::FILE->Next; delete temp; } while(DIR!=NULL)//目录列表 { temp=::DIR; ::DIR=::DIR->Next; delete temp; } ::WriteLog(logfile,\正常结束运行!\记入日志 WORD pError; R0_CloseFile(logfile,&pError);//关闭日志文件 IFSMgr_RemoveFileSystemApiHook(MyIfsHook); //卸载文件挂钩回调用函数 return TRUE; }

DWORD FilehookDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)//前台控制消息响应函数

{ switch(pDIOCParams->dioc_IOCtlCode)//检查操作类型,这些消息是在前面定义的 { case ADD_FILE://添加文件 FT *file,*pfile; pfile=(FT *)pDIOCParams->dioc_InBuf;//生成一个FT类型的指针并指向传递过来的内存区域

WriteLog(logfile,\添加文件\//记入日志,当然在正式发行时可以去掉,这里是为了调试方便

WriteLog(logfile,pfile->PathName);//记录添加的文件名,可以和前台的对比,看有没有误传,这里也是为了调试方便

file=new FT; //分配内存 if(file!=NULL) { memcpy(file,pfile,sizeof(FT)); //将传递过来的内存块保存下来,以下代码是典型的链表操

用VXD技术实现的文件系统保护程序示例

用VXD技术实现的文件系统保护程序示例要对Windows9x操作系统下的文件进行保护,只能通过驱动级开发来实现。通常情况下是写一个InstallableFileSystemHook(IFSH,可安装文件系统挂钩程序)加载在系统中,然后在其中监控系统的文件操作。当发现系统在作你希望监控的操作时,进行你需要的操作(此时系统并没有进行实际的操作,你赶在了系统操作之前)。进行此
推荐度:
点击下载文档文档为doc格式
1rg0l42nsy05ej21u0rq9kfa25180i00kcf
领取福利

微信扫码领取福利

微信扫码分享