背景

文件保护技术不论对于病毒木马还是杀软来说,都是至关重要的。要在内核层下实现文件防删除,通常是通过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消息打开文件不释放对象实现文件防删相关推荐

  1. 释放mysql ibdata1文件_释放MySQL ibdata1文件的空间

    在MySQL数据库中,如果不指定innodb_file_per_table参数,单独存在每个表的数据,MySQL的数据都会存放在ibdata1文件. mysql ibdata1存放数据,索引等,是MY ...

  2. python保存类对象到文件_python存储对象到文件

    1.pickle包 (1).将内存中的对象转换成为文本流: import pickle # define class class Bird(object): have_feather = True w ...

  3. ring0层下实现的文件强制删除

    文件强删 在日常生活使用电脑的过程中,遇到删不掉的文件的时候,我们总会通过一些软件提供的强制删除文件功能来删除顽固的文件.文件强删技术对于杀软来说是清楚病毒木马的武器,在扫描器检测出恶意文件的时候,就 ...

  4. VB SendMessage向其他程序窗口发送字符串消息实例

    以下通过程序的标题来获取该窗口的句柄,然后通过SendMessage函数给该窗口句柄发送WM_SETTEXT消息. 代码如下: '先创建一个文本文档,命名为: 1.txt ' 然后打开测试... Pr ...

  5. Python定时向微信发送天气消息和每日一言[wxpy、apscheduler]

    Python定时向微信发送天气消息和每日一言 Python定时向微信发送天气消息和每日一言 环境描述 引用库 部分代码 开发问题反馈和交流 Python定时向微信发送天气消息和每日一言 通过wxpy拉 ...

  6. C++:3类和对象、文件操作

    目录 1.封装 2.对象的初始化和清理 2.1构造函数的分类 2.2构造函数的使用 2.3拷贝构造函数调用时机 2.4构造函数调用规则 2.5深拷贝与浅拷贝(未看) 2.6初始化列表 2.7类作为成员 ...

  7. VC++ 获取窗体句柄,并发送键盘消息(这种方法也可以打开某些应用程序)

    当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由: CWnd *pwnd = FindWindow(_ ...

  8. 定时循环发送UDP消息(例如:控制远程电脑的开机、关机、重启、打开和关闭程序等)—— 定时执行专家

    目录 ◆ 定时执行专家 - 发送UDP消息功能 - 设置方法 - 使用注意事项 ◆ 两种发送方式 ◆UDP消息的两种格式类型 ◆ 关于UDP协议 ◆ 定时执行专家 - 发送UDP消息功能 - 设置方法 ...

  9. Python发送微信消息(文字、图片、文件)给指定好友和微信群,零基础可看懂(附源码和教程)

    前言 本示例是调用Windows API模拟发送,用Python调用win32api这个库来调用Windows API模拟人的手动操作来发送消息. 在使用前,请将你微信的窗口设置为在最前面,这样就便于 ...

最新文章

  1. 联邦学习的隐忧:来自梯度的深度泄露
  2. 「懒人」LeCun想让计算机自己编程?网友:还差10个 GPT-3
  3. beta阶段140字评论
  4. VC6中工具条的新特色
  5. ExtJs之gridPanel的属性表格,编辑表格,表格分页,分组等技巧
  6. 施密特正交化的几何解释
  7. sql左外连接和右外连接的区别
  8. matlab 可视化 —— axis
  9. 程序员,请远离拖延症!
  10. CSV用excel打开乱码
  11. JavaScript和HTML及CSS的通俗解释
  12. ecshop源码教程第1季
  13. 家用电器插头插座外壳防冲击等级试验——IK摆锤冲击试验装置
  14. abaqus2021详细安装教程
  15. matlab u怎么求均方差,Matlab求方差,均值,均方差,協方差的函數
  16. 实现wpf的doevents
  17. QualDash: Adaptable Generation of Visualisation Dashboards for Healthcare Quality Improvement
  18. IDEA默认KeyMap映射快捷键
  19. 小米wifi显示无网络连接到服务器,小米路由器wifi连接上不能上网怎么办?
  20. :hover的几种选择用法

热门文章

  1. 如何从后面截取字符串 String.slice()
  2. 导弹的坐标系、角度和力
  3. Java 身份证验证(IdCardVerification)
  4. java对接云点播上传视频,视频转码,播放视频,删除视频
  5. 将下列表格转换为HTML代码,HTML table表格转换为Markdown table表格
  6. 手里有200万,如何理财
  7. Grubbs Test
  8. 智慧园区地图导航解决方案,如何实现园区内地图导航?
  9. 高考倒计时1天 | 百度数字人“考生”度晓晓将挑战高考作文
  10. Linux操作系统下复现github上的项目(一):下载项目、配置环境