Ring0层发送IRP消息打开文件不释放对象实现文件防删
背景
文件保护技术不论对于病毒木马还是杀软来说,都是至关重要的。要在内核层下实现文件防删除,通常是通过HOOK内核函数来实现,通过判断是否是删除保护文件,从而拒绝操作。本文将介绍一种不需要HOOK操作即可实现的文件保护方法,通过发送IRP信息打开文件并获取文件句柄,而不关闭文件句柄,使文件句柄一直保持打开状态。在文件句柄没有被关闭释放的情况,文件不能被删除,从而实现文件防删除。
实现过程
在前面章节就已经介绍过发送IRP管理操作文件,直接发送 IRP 对文件进行操作,可以避免一些HOOK的干扰。
在发送 IRP 打开文件之前,程序需要先打开文件所在的驱动器,并获取其文件系统驱动的设备对象DeviceObject以及物理磁盘设备对象RealDevice。具体的实现流程如下所示。
首先,调用IoCreateFile函数打开磁盘驱动器,并获取设备句柄。
然后,调用ObReferenceObjectByHandle函数,根据设备句柄获取设备对象的主体内容。本文是获取*IoFileObjectType对象类型,对应的数据类型为PFILE_OBJECT。这样,程序就可以从PFILE_OBJECT中的Vpb中获取其文件系统驱动的设备对象DeviceObject以及物理磁盘设备对象RealDevice。
最后,调用ObDereferenceObject释放文件对象内容,调用ZwClose关闭上述获取的设备句柄。
当获取了驱动器的文件系统驱动的设备对象DeviceObject以及物理磁盘设备对象RealDevice之后,程序就可以创建IRP_MJ_CREATE消息,发送到系统,打开相应的文件了。具体的实现流程如下所示。
首先,调用ObCreateObject函数,创建一个*IoFileObjectType文件类型的对象。
然后,调用IoAllocateIrp函数,根据文件系统驱动的设备对象的栈大小 DeviceObject->StackSize申请一块IRP数据空间。
接着,调用KeInitializeEvent初始化一个SynchronizationEvent内核同步事件。并开始构造一个IRP数据包。
1> 首先,对文件对象数据结构FILE_OBJECT进行设置。
2> 然后,调用SeCreateAccessState函数创建访问状态,其中,结构体AUX_ACCESS_DATA的定义为。
typedef struct _AUX_ACCESS_DATA {PPRIVILEGE_SET PrivilegesUsed;GENERIC_MAPPING GenericMapping;ACCESS_MASK AccessesToAudit;ACCESS_MASK MaximumAuditMask;ULONG Unknown[256];
} AUX_ACCESS_DATA, *PAUX_ACCESS_DATA;
```http://www.biyezuopin.cc3> 最后,设置安全上下文IO_SECURITY_CONTEXT数据,并调用IoGetNextIrpStackLocation函数获取IRP的堆栈空间数据,对堆栈空间数据进行设置。最后,调用IoSetCompletionRoutine为IRP设置一个完成回调函数,用于IRP的清理工作。再调用IofCallDriver函数,将IRP数据包发送到系统,进行处理,打开文件。并保存文件对象,后续关闭文件的时候,需要用到该文件对象。这样,程序就可以打开文件,获取文件对象。在没有调用ObDereferenceObject函数释放文件对象之前,文件是一直处于打开状态,不能被删除。从而,实现了对文件的保护。具体的发送IRP打开文件的代码实现,可以参考前面章节中介绍的通过IRP实现创建或打开文件的实现代码,在此就不重复介绍了。那么,保护文件的具体实现代码如下所示。```c++
PFILE_OBJECT ProtectFile(UNICODE_STRING ustrFileName)
{PFILE_OBJECT pFileObject = NULL;IO_STATUS_BLOCK iosb = { 0 };NTSTATUS status = STATUS_SUCCESS;// 创建或者打开文件status = IrpCreateFile(&pFileObject, DELETE | FILE_READ_ATTRIBUTES | SYNCHRONIZE,&ustrFileName, &iosb, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);if (!NT_SUCCESS(status)){return pFileObject;}return pFileObject;
}
关闭文件保护的实现代码如下所示。
http://www.biyezuopin.vip
BOOLEAN UnprotectFile(PFILE_OBJECT pFileObject)
{if (pFileObject){ObDereferenceObject(pFileObject);}return TRUE;
}
测试
在64位Windows 10操作系统上,直接加载并运行上述驱动程序,保护C:\520.exe文件不被删除。在驱动程序成功执行后,直接删除520.exe文件,删除失败,系统提示文件正在使用,如图7-1所示。关闭文件保护后,文件正常删除。
总结
该文件保护程序的核心原理是通过发送IRP打开文件而保持文件句柄处于打开状态,系统在文件删除的时候,会检查文件打开的句柄数是否为零,若不为零,则拒绝删除操作。
在编码实现的过程中需要注意的是,在构造打开文件IRP包的时候,文件对象的文件名pFileObj->FileName,需要使用ExAllocPool申请MAX_NAME_SPACE大小字节的非分页内存NonPagedPool空间,这样,程序才能正常执行。否则,会导致蓝屏。
Ring0层发送IRP消息打开文件不释放对象实现文件防删相关推荐
- 释放mysql ibdata1文件_释放MySQL ibdata1文件的空间
在MySQL数据库中,如果不指定innodb_file_per_table参数,单独存在每个表的数据,MySQL的数据都会存放在ibdata1文件. mysql ibdata1存放数据,索引等,是MY ...
- python保存类对象到文件_python存储对象到文件
1.pickle包 (1).将内存中的对象转换成为文本流: import pickle # define class class Bird(object): have_feather = True w ...
- ring0层下实现的文件强制删除
文件强删 在日常生活使用电脑的过程中,遇到删不掉的文件的时候,我们总会通过一些软件提供的强制删除文件功能来删除顽固的文件.文件强删技术对于杀软来说是清楚病毒木马的武器,在扫描器检测出恶意文件的时候,就 ...
- VB SendMessage向其他程序窗口发送字符串消息实例
以下通过程序的标题来获取该窗口的句柄,然后通过SendMessage函数给该窗口句柄发送WM_SETTEXT消息. 代码如下: '先创建一个文本文档,命名为: 1.txt ' 然后打开测试... Pr ...
- Python定时向微信发送天气消息和每日一言[wxpy、apscheduler]
Python定时向微信发送天气消息和每日一言 Python定时向微信发送天气消息和每日一言 环境描述 引用库 部分代码 开发问题反馈和交流 Python定时向微信发送天气消息和每日一言 通过wxpy拉 ...
- C++:3类和对象、文件操作
目录 1.封装 2.对象的初始化和清理 2.1构造函数的分类 2.2构造函数的使用 2.3拷贝构造函数调用时机 2.4构造函数调用规则 2.5深拷贝与浅拷贝(未看) 2.6初始化列表 2.7类作为成员 ...
- VC++ 获取窗体句柄,并发送键盘消息(这种方法也可以打开某些应用程序)
当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由: CWnd *pwnd = FindWindow(_ ...
- 定时循环发送UDP消息(例如:控制远程电脑的开机、关机、重启、打开和关闭程序等)—— 定时执行专家
目录 ◆ 定时执行专家 - 发送UDP消息功能 - 设置方法 - 使用注意事项 ◆ 两种发送方式 ◆UDP消息的两种格式类型 ◆ 关于UDP协议 ◆ 定时执行专家 - 发送UDP消息功能 - 设置方法 ...
- Python发送微信消息(文字、图片、文件)给指定好友和微信群,零基础可看懂(附源码和教程)
前言 本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息. 在使用前,请将你微信的窗口设置为在最前面,这样就便于 ...
最新文章
- 联邦学习的隐忧:来自梯度的深度泄露
- 「懒人」LeCun想让计算机自己编程?网友:还差10个 GPT-3
- beta阶段140字评论
- VC6中工具条的新特色
- ExtJs之gridPanel的属性表格,编辑表格,表格分页,分组等技巧
- 施密特正交化的几何解释
- sql左外连接和右外连接的区别
- matlab 可视化 —— axis
- 程序员,请远离拖延症!
- CSV用excel打开乱码
- JavaScript和HTML及CSS的通俗解释
- ecshop源码教程第1季
- 家用电器插头插座外壳防冲击等级试验——IK摆锤冲击试验装置
- abaqus2021详细安装教程
- matlab u怎么求均方差,Matlab求方差,均值,均方差,協方差的函數
- 实现wpf的doevents
- QualDash: Adaptable Generation of Visualisation Dashboards for Healthcare Quality Improvement
- IDEA默认KeyMap映射快捷键
- 小米wifi显示无网络连接到服务器,小米路由器wifi连接上不能上网怎么办?
- :hover的几种选择用法
热门文章
- 如何从后面截取字符串 String.slice()
- 导弹的坐标系、角度和力
- Java 身份证验证(IdCardVerification)
- java对接云点播上传视频,视频转码,播放视频,删除视频
- 将下列表格转换为HTML代码,HTML table表格转换为Markdown table表格
- 手里有200万,如何理财
- Grubbs Test
- 智慧园区地图导航解决方案,如何实现园区内地图导航?
- 高考倒计时1天 | 百度数字人“考生”度晓晓将挑战高考作文
- Linux操作系统下复现github上的项目(一):下载项目、配置环境