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

立创·庐山派-K230-CanMV(嘉楠勘智)开发板通过ATK-ESP8266实现图像识别数据无线传输至原子云 本文详细介绍了如何使用立创·庐山派-K230-CanMV开发板,通过ATK-ESP8266 WIFI模块实现图像识别数据的无线传输至原子云平台。内容包括硬件连接、软件环境搭建、AT指令控制、原子云连接及数据上传的全过程,并提供了实用的调试技巧和常见问题解决方案,为物联网应用开发提供了完整实践指南。 阅读详情
下面是全文

用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);
}
使用linuxdeployqt打包Qt程序问题及解决方法 安装过程中提示缺少依赖multiarch-support: 下载对应依赖包。安装过程中提示缺少libpq.so.5: 下载对应依赖包。下载libmysqlclient18/5.6.25。 阅读详情

相关推荐

Qwen3.5在昇腾NPU上部署:vLLM-Ascend全链路实战

大语言模型推理框架(如vLLM)通过PagedAttention等内存调度机制,显著提升显存利用率与吞吐性能;国产AI芯片(如昇腾NPU)需配套专用算子优化与硬件感知调度才能释放真实算力。本文聚焦Qwen3.5大语言模型在昇腾平台的端到端部署,深入解析vLLM-Ascend如何协同CANN工具链、适配RoPE位置编码与Tokenizer映射、调优block_size与kv_cache_dtype等关键参数,实现单卡42 tokens/s高吞吐与112ms低延迟。内容覆盖环境验证、源码编译、模型权重转换、服务

weixin_34335458的博客 278

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

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

weixin_33947521的博客 308

DMR对讲机的基本概念理解

刚刚入手DMR对讲机,尚未成功联通。国内互联网上能找到的资料很少,大多数也都是一些DMR协议介绍之类的玩意,对实际操作没有指导意义。以下全部是这几天在网上研究各种资料得出的个人思考,如有错误请斧正。 相比与模拟通讯系统,DMR将语音信号转换为包的形式进行收发。将DMR对比成TCP/IP系统会更容易理解。 一般DMR对讲机都支持模数双通,说明DMR应该使用了跟FM同样的无线AP组件,只在解码上有区别。对讲机先使用DMR进行数字解码,解码成功则说明是数字信号,不成功则使用模拟方式再次进行解码。可以对等理解为

1万+

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

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

Floating Guy 2919

VFIO框架源码分析(二十二)- IOMMUFD 的脏页跟踪与 Dirty Bits 读取

在虚拟化热迁移(Live Migration)的场景中,脏页追踪(Dirty Page Tracking)是最具挑战性的环节之一。它的核心任务是实时捕获设备(DMA)对内存的写操作,以便 VMM(如 QEMU)知道哪些内存页需要被重新传输到目标主机。在强耦合与粗粒度:脏页追踪是绑定在 Container 上的。这意味着,如果一个 Container 内有多个设备,哪怕只有一个设备在写内存,脏页追踪也会影响 Container 内的所有设备。软件模拟开销大。

qq_36071928的博客 1043

2026年软考高级网络规划设计师备考指南

在国家网络安全法律法规和政策的指导下,能够依据网络技术发展的趋势进行计算机网络领域的需求分析、规划设计、部署实施、评测、运行维护等工作。 在需求分析阶段,写出网络系统需求规格说明书;在规划设计阶段,完成逻辑结构设计、物理结构设计,选用适宜的网络设备,按照标准规范编写系统设计文档及项目开发计划;在部署实施阶段,组织项目施工,对项目实施过程进行质量控制、进度控制、成本管理,能具体指导项目实施;在评测运维阶段,能根据相关标准和规范对网络进行评估测试,能制定运行维护、故障分析与处理机制,确保网络提供正常服务;

鹿鸣天涯 1万+

Windows API函数大全(完整)

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

robotmen的专栏 5079

11、基于多阵列电极的表面肌电信号运动估计

本文介绍了一种基于多阵列电极的表面肌电信号运动估计技术,旨在实现对手腕和手指运动的高精度估计,解决传统人机接口在操控多自由度机器人时的局限性。通过多阵列电极系统采集前臂肌肉活动信号,结合独立成分分析(ICA)和非负矩阵分解(NMF)等信号处理方法,提取肌肉协同作用,进而生成运动指令以控制机器人或假肢手。文章对比了多阵列电极与传统电极的优势,展示了运动估计算法的整体流程,并以假肢手控制为例说明其实际应用。最后探讨了该技术在测量精度、应用拓展、智能化和便携化等方面的未来发展方向。该技术为假肢控制、康复训练和人机

ik678901234的博客 87

文件夹防删除

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

山寨3D的专栏 1790

Allegro172版本DFM功能介绍

Allegro172版本提供了实时DFM检查的功能,让违反要求的地方实时以DRC的形式报出来,让加工不可加工因素在设计的时候同步避免。打开Constraint,选择Manufacturing, 所有DFM相关DRC都在这。把所有下面DRC开关(DFM,DFA,DFT)都选择on,选择OK。这个规则和物理和间距规则等等都没有关系,单独的一个加工规则。这些DRC大部分是正常的,正常的可以去修改规则来消除。等待DRC刷新,板子上会出现很多DRC,类似下图。下面介绍如何调用和产生DFM规则。一直往下点击next。

weixin_54787054的博客 1338

【2026最新版】PCL点云处理算法汇总(C++长期更新版)

PCL学习目录。博客长期更新,最近一次更新时间为:2026年10月4日。

点云侠的博客 63万+

用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

电子电器架构 --- OEM企标中规定ECU启动时间的目的

电子电器架构 --- OEM企标中规定ECU启动时间的目的

Soly_kun的博客 223

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

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

sunhf_my的专栏 687

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

gxj1680的专栏 774

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

panhewu9919的博客 1934

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: (转自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、付费专栏及课程。

余额充值