用HOOK来修改API函数的功能 @之禁止删除文件

YOLOv8中间特征层可视化 在通过观察这些特征,可以清楚地看到模型如何逐步将输入图像转化为有意义的表示。 阅读详情
下面是全文

用HOOK来修改API函数的功能 @之禁止删除文件

 

原blog地址:http://fxh7622.blog.51cto.com/63841/32290

 

在"未文档化函数中"有个函数叫做ZwSetInformationFile。这个函数对应的WIN32的函数有"SetFileAttributes、SetEndOfFile、SetFilePointer、SetFileTime、DeleteFile"。也就是说,以上的函数均是和这个ZwSetInformationFile函数有关。如果我们截获到这个函数那么我们就可以做到禁止删除文件。
下面是我的代码。我首先对用户操作的文件名和我们要保护的文件名进行比较,如果文件名相同,则继续判断路径是否相同。如果相同,那么这个文件就是我们保护的文件。否则继续用户的原有操作。

#include "ntddk.h"
#include "bugcodes.h"
#include "ntstatus.h"
#include <ntddkbd.h>
#include <stdio.h>
#include "stdarg.h"
#include "ntiologc.h"
#define MAXPATHLEN 1024
#define MaxBuf 1024
#define MIN(x,y) ((x) < (y) ? (x) : (y))
.....
typedef struct _FILE_NAMES_INFORMATION {
    ULONG NextEntryOffset;
    ULONG FileIndex;
    ULONG FileNameLength;
    WCHAR FileName[1];
} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
...
//反删除文件需要的函数
//(1).声明原有函数
typedef NTSTATUS (*ZWSETINFORMATIONFILE)(
 IN HANDLE  FileHandle,
 OUT PIO_STATUS_BLOCK  IoStatusBlock,
 IN PVOID  FileInformation,
 IN ULONG  Length,
 IN FILE_INFORMATION_CLASS  FileInformationClass
 );
ZWSETINFORMATIONFILE RealZwSetInformationFile;
 
//(2).定义HOOK反删除文件的函数
NTSTATUS HookZwSetInformationFile(
 IN HANDLE  FileHandle,
 OUT PIO_STATUS_BLOCK  IoStatusBlock,
 IN PVOID  FileInformation,
 IN ULONG  Length,
 IN FILE_INFORMATION_CLASS  FileInformationClass
 );
...
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) 
{
...... 
RealZwSetInformationFile=(ZWSETINFORMATIONFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetInformationFile")]);
  (ZWSETINFORMATIONFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwSetInformationFile")])=HookZwSetInformationFile;
//上面两行的代码含义请参照我上面的文章。
}

NTSTATUS HookZwSetInformationFile(
  IN HANDLE  FileHandle,
  OUT PIO_STATUS_BLOCK  IoStatusBlock,
  IN PVOID  FileInformation,
  IN ULONG  Length,
  IN FILE_INFORMATION_CLASS  FileInformationClass
)
{
 PVOID *pFileObject;
 NTSTATUS rc;
 ULONG ActualLength;
 int DelInt;
 PUNICODE_STRING puniFileName_Del;
 ANSI_STRING ansiFileName_Del,
    m_ansiFileName_Del,
    ansiGetFileName_Del,
    m_ansiGetFileName_Del;
 IO_STATUS_BLOCK MyIoStatusBlock;
 PFILE_NAMES_INFORMATION pFileInfo; 
 char DeleteFileDir[MaxBuf]={'\0'};
 char TempDel[2]={'\0'};
 char TempInstallDir[256]={'\0'};//定义临时使用的安装路径数组
 UNICODE_STRING pHideFileDir; //定义反删除读取文件的文件名
 UNICODE_STRING *pFullPath=NULL;
 int Judge=0;
 int CompareJudge=0;
 int i;
 pFileInfo = (PFILE_NAME_INFORMATION)ExAllocatePool( NonPagedPool, sizeof(FILE_NAME_INFORMATION)*255); 
 //调用ZwQueryInformationFile函数将操作文件的信息放如pFileInfo。
 rc = ZwQueryInformationFile( FileHandle,&MyIoStatusBlock,pFileInfo,sizeof(FILE_NAME_INFORMATION)*255,FileNameInformation );
 if(NT_SUCCESS(rc))
 {
  //定义变量
  PWSTR pTemp = (PWSTR)ExAllocatePool( NonPagedPool, sizeof(PWSTR)*pFileInfo->FileNameLength);
  puniFileName_Del = (PUNICODE_STRING)ExAllocatePool( NonPagedPool, sizeof( UNICODE_STRING));
  puniFileName_Del->Buffer = pTemp;
  //将文件名成拷贝到puniFileName_Del变量中
  RtlCopyMemory( puniFileName_Del->Buffer, pFileInfo->FileName, pFileInfo->FileNameLength);
  puniFileName_Del->Length = (USHORT)pFileInfo->FileNameLength;
  puniFileName_Del->MaximumLength = (USHORT)pFileInfo->FileNameLength;
  
  //对文件名称转换大小写
  RtlUnicodeStringToAnsiString( &ansiFileName_Del, puniFileName_Del, TRUE);
  RtlUnicodeStringToAnsiString( &m_ansiFileName_Del, puniFileName_Del, TRUE);
  RtlUpperString(&ansiFileName_Del,&m_ansiFileName_Del);
  //将文件名称保存在变量ansiFileName_Del中
  RtlFreeAnsiString(&m_ansiFileName_Del);
  //比较我们要保护的文件名称是否和正在操作的文件名称相同
  if (RtlCompareMemory(ansiFileName_Del.Buffer,"Test1.txt",strlen("Test1.txt") ) == strlen("Test1.txt"))
  {
    rc = ObReferenceObjectByHandle(FileHandle,0,NULL,KernelMode,(PVOID*)&pFileObject,NULL);
    if(NT_SUCCESS(rc))   
    {
     pFullPath = (UNICODE_STRING *)ExAllocatePool(NonPagedPool,MaxBuf);
     RtlZeroMemory(pFullPath,MaxBuf);
     pFullPath->MaximumLength = MaxBuf ;
     //得到文件的全路径
     rc = ObQueryNameString(pFileObject,pFullPath,MaxBuf,&ActualLength);
     if(rc != STATUS_SUCCESS)
     {
      //如果失败 则调用正常处理
      rc=RealZwSetInformationFile(FileHandle,IoStatusBlock,FileInformation,Length,FileInformationClass);
      RtlFreeAnsiString(&ansiFileName_Del);
      ExFreePool(puniFileName_Del);
      ExFreePool(pTemp);
      ExFreePool(pFileInfo);
      ExFreePool(pFullPath);
      ObDereferenceObject(pFileObject);
      return rc;
     }
     ObDereferenceObject(pFileObject);
     //将文件的全路径转换成大写
     RtlUnicodeStringToAnsiString(&ansiGetFileName_Del,pFullPath,TRUE);
     RtlUnicodeStringToAnsiString(&m_ansiGetFileName_Del,pFullPath,TRUE);
     RtlUpperString(&ansiGetFileName_Del,&m_ansiGetFileName_Del);
     RtlFreeAnsiString(&m_ansiGetFileName_Del);
     memset(DeleteFileDir,0,MaxBuf);
     memcpy(DeleteFileDir,ansiGetFileName_Del.Buffer,ansiGetFileName_Del.Length);
     RtlFreeAnsiString(&ansiGetFileName_Del);
     ExFreePool(pFullPath);
     //判断文件的全路径是否和我们需要保护的文件全路径匹配
     if(RtlCompareMemory(DeleteFileDir," http://www.cnblogs.com/bcxx_qin/admin/file://??/C://Test1.txt") ) == strlen(" http://www.cnblogs.com/bcxx_qin/admin/file://??/C://Test1.txt"))
     {
      //如果匹配,直接返回,不调用删除功能
      RtlFreeAnsiString(&ansiFileName_Del);
      ExFreePool(puniFileName_Del);
      ExFreePool(pTemp);
      ExFreePool(pFileInfo);
      return(rc);
     } 
    } 
    else
    {
     //如果调用ObReferenceObjectByHandle函数不正常,则调用原来的操作
     rc=RealZwSetInformationFile(FileHandle,IoStatusBlock,FileInformation,Length,FileInformationClass);
     RtlFreeAnsiString(&ansiFileName_Del);
     ExFreePool(puniFileName_Del);
     ExFreePool(pTemp);
     ExFreePool(pFileInfo);
     return rc;
    }
   }
  }
  //如果文件名称不匹配,则调用原来的操作
  rc=RealZwSetInformationFile(FileHandle,IoStatusBlock,FileInformation,Length,FileInformationClass);
  RtlFreeAnsiString(&ansiFileName_Del);
  ExFreePool(puniFileName_Del);
  ExFreePool(pTemp);
 }
 ExFreePool(pFileInfo);
 return(rc);
}
RT-Thread必考面试题及参考答案 RT-Thread的设备驱动模型遵循层次化的结构,设计简洁且易于扩展。它主要由设备注册、设备操作和设备控制三部分组成。设备驱动模型允许开发者为不同的硬件设备编写驱动程序,这些驱动程序可以被RT-Thread内核统一管理和调度。在RT-Thread中,设备被抽象成一系列标准的接口,包括打开、关闭、读取、写入、控制等操作,这些操作封装在结构体中。设备驱动程序需要实现这些接口,然后通过调用函数注册设备,使其对系统可见。这种模型不仅简化了驱动开发,还提高了代码的可移植性和可维护性。 阅读详情

相关推荐

高光谱知识(1)-高光谱成像技术的理解

系列文章目录 高光谱技术可以获得待观测目标或场景的连续单色光谱图像,并通过空间维(x, y)数据和光谱维(λ)数据共同组成三维观测数据立方体,从而为研究人员提供探测目标或场景中的每一个点的空间和光谱特征细节。这种兼具相机的高分辨成像能力和光谱仪的高光谱分辨能力使得高光谱被广泛应用于测绘遥感、目标识别、环境监测与评估、临床影像诊断、过程监控等任务中,并在地理、空间、海洋、气候、大气、农业、植被、生态、医药、安防、制造与色度等多个领域中发挥巨大作用。 文章目录系列文章目录前言一、按获取数据的过程划分二、按照光

Echo_Code的博客 1万+

用HOOK来修改API函数的功能(3)-禁止删除文件

今天我写一写如何使用HOOK的方法来保护一些特定的文件不被删除。在"未文档化函数中"有个函数叫做ZwSetInformationFile。这个函数对应的WIN32的函数有"SetFileAttributes、SetEndOfFile、SetFilePointer、SetFileTime、DeleteFile"。也就是说,以上的函数均是和这个ZwSetInformationFile函数有关。如果我们...

weixin_33947521的博客 308

NFS服务器配置与autofs自动挂载

NFS服务器配置autofs自动挂载 环境: hostname ip OS server 192.168.220.138 centos7 client 192.168.220.139 centos7 一、NFS概述 NFS(Network File System)网络文件系统。最大功能就是通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。 二、端口 [root@se...

DoloresOOO的博客 1026

内核级驱动对抗Hook ZwSetInformationFile反删除技术

网络安全中的文件删除与保护一直都是大家谈论的焦点问题,针对如何保护磁盘上属于自己的专有文件,已经存在一些现成技术,比如信息隐藏技术。笔者详细的谈论过有关基于有序规则的信息隐藏与加密技术,利用一些常见图片、视频等作为载体将文件嵌入其中,达到掩人耳目的目的。这种方式如果在图像的鲁棒性、文件规则的健壮性、加密算法的有效性上能够很好的满足,是可以很好的实现文件的保护的。下面论述的是文件在没有隐藏的情况下,

Floating Guy 2919

医疗设备安规入门:一张图搞懂BF型设备的MOOP/MOPP绝缘路径(附GB 9706.1附录解析)

本文深入解析了BF型医疗设备的MOOP/MOPP绝缘路径设计,结合GB 9706.1标准附录J的实战应用,帮助工程师快速掌握医疗设备安规要点。通过典型绝缘路径图分析,详细对比了MOOP与MOPP的防护差异,并提供了海拔修正、漏电流测试等关键设计指南,助力医疗设备安全合规。

weixin_30633405的博客 386

手把手教你理解ARM SoC中的PPU:电源管理IP的配置与实战避坑指南

本文深入解析ARM SoC中的PPU(Power Policy Unit)电源管理IP,提供详细的配置指南与实战避坑技巧。从PPU基础架构、寄存器配置到与PCSM的协同工作,全面介绍如何优化电源管理策略,解决常见配置误区,并分享高级调试与性能优化方法,助力工程师提升低功耗SoC设计效率。

weixin_28693447的博客 479

Windows API函数大全(完整)

ExtractAssociatedIcon 判断一个可执行程序或DLL中是否存在图标,或是否有图标与系统注册表中指定的文件存在关联并提取之。FindFirstPrinterChangeNotification 创建一个新的改变通告对象,以便我们注意打印机状态的各种变化。GetClassInfo 取得WNDCLASS结构(或WNDCLASSEX结构)的一个副本,结构中包含了与指定类有关的信息。GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况。

robotmen的专栏 5079

有限元分析必看:如何用ANSYS检查关键区域的网格质量(附操作截图)

本文聚焦有限元分析中决定仿真精度的关键环节,详细讲解了如何利用ANSYS Workbench对关键区域进行网格质量检查与优化。文章提供了从思维转变、实战操作到指标解读的完整流程,强调通过命名选择、Worksheet过滤器等工具实现定向检查,并给出了针对结构分析的关键区域网格质量阈值建议,帮助工程师提升仿真结果的可靠性与效率。

weixin_29200741的博客 465

文件夹防删除

library CopyHook; uses ComServ, CopyMain in ’CopyMain.pas’; exports DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer; {$R *.TLB} {$R *.RES} begin end. //////////// CopyMain.p

山寨3D的专栏 1790

手把手教你复现IEEE 2025高光谱图像盲超分算法DBSR(附开源代码与避坑指南)

本文详细介绍了如何从零复现IEEE 2025高光谱图像盲超分算法DBSR,包括环境配置、数据预处理、核心模块解析、训练策略及常见问题解决方案。特别针对开源代码中的关键步骤和潜在问题提供了实用指南,帮助研究者和开发者高效实现Deep blind super-resolution技术,适用于遥感、医疗等领域的图像增强应用。

weixin_42524708的博客 412

多模型动态路由(Fusion):从“算力霸权”到“架构分权”的工程范式转型

多模型动态路由(Multi-Model Dynamic Routing)是指在多个大语言模型之间,根据请求特征、资源约束和业务目标,动态选择最优模型或模型组合的技术范式。传统网关擅长管理请求流量,但不理解“任务类型”。而AI路由层需要对每个请求进行语义理解、能力匹配和成本评估。从“算力霸权”到“架构分权”,这不是技术的线性演进,而是工程范式的根本转型。过去三年,开发者的核心能力是“选对模型”——在GPT、Claude、Gemini之间做出正确选择。

ZDQ58818的博客 73

用HOOK来修改API函数的功能(3)-禁止删除文件(转)

用HOOK来修改API函数的功能(3)-禁止删除文件 2007-06-28 22:36:52 标签:HOOK 禁止删除文件   [<a class="operlink" onclick="function onclick(){dfanologin();return false;}" href="http://writeblog.youkuaiyun.com/#">推送到技术圈]

gxj1680的专栏 695

如何实现一个用STM32F103C8T6作为主控芯片,加上AD8232、MAX30102 、MPU6050模块的用于运动中监测心率变异性??

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1212

用HOOK来修改API函数的功能(1)-注册表

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://fxh7622.blog.51cto.com/63841/30324 我们知道编程实际上是使用各种API函数来达到我们想要的目的。换句话说就是API函数是我们通常编程时使用到的最底层函数。很多人也觉得除了API函数微软没有在提供其它的编程接口。其实

sunhf_my的专栏 687

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

用HOOK来修改API函数的功能(1)-注册表(转)

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://fxh7622.blog.51cto.com/63841/30324 我们知道编程实际上是使用各种API函数来达到我们想要的目的。换句话说就是API函数是我们通常编程时使用到的最底层函数。很多人也觉得除了API函数微软没有在提供

gxj1680的专栏 774

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Linux内核调试】使用Ftrace来Hook linux内核函数

目标:hook几个Linux内核函数调用,如打开文件和启动进程,并利用它来启用系统活动监控并抢先阻止可疑进程。 一、方案比较 1. 使用Linux安全API 方法:内核代码的关键点包含安全函数调用,这些调用可能触发安全模块安装的回调,该模块可以分析特定操作的上下文,并决定是允许还是禁止它。 限制:安全模块无法动态加载,所以需要重新编译内核。 2. 修改系统调用表 方法:所有Linux系统调用处理程...

panhewu9919的博客 1934

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: (转自MSDN)InternetExplorer.Application的用法及属性解释
下一篇: 探讨《如何在MFC设计超链接控件类》
darkread
博客等级 码龄25年 42粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值