用HOOK来修改API函数的功能(2)-创建文件

简介:
上次写了如何使用HOOK的方法修改API函数的功能,来对注册表进行保护。对于对注册表操作的函数还有ZwDeleteKey、ZwDeleteValueKey、ZwOpenKey等等,对这些函数的HOOK和我上面写的方法是一样的。
今天我来写一下如何对文件操作的API函数来HOOK。
在我们编程中经常使用CreateFile函数来创建文件。其实对于系统来说,当我们使用右键点击并选择“新建”中的创建文件的时候,系统也是调用了CreateFile来创建一个文件。对于某些项目来说,我们不想让没有权限的人来随意的来创建文件。这个时候我们就应该对CreateFile函数的功能进行修改。
在“未文档化函数”中有一个函数叫做ZwCreateFile。这个函数的作用就是创建文件,API函数CreateFile的实现就是调用了这个函数。如果我们修改了这个函数的实现过程,就可以达到修改API函数CreateFile的目的。
下面的代码是我给一个大学做的项目中一段。目的是不让学生随便在指定的盘符上创建文件。
#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))
.....
//(1).声明原有函数
typedef NTSTATUS (*REALZWCREATEFILE)(
  OUT PHANDLE FileHandle,
  IN ACCESS_MASK DesiredAccess,
  IN POBJECT_ATTRIBUTES ObjectAttributes,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  IN PLARGE_INTEGER AllocationSize  OPTIONAL,
  IN ULONG FileAttributes,
  IN ULONG ShareAccess,
  IN ULONG CreateDisposition,
  IN ULONG CreateOptions,
  IN PVOID EaBuffer  OPTIONAL,
  IN ULONG EaLength
  );
REALZWCREATEFILE RealZwCreateFile;
 
NTSTATUS HookZwCreateFile(
  OUT PHANDLE FileHandle,
  IN ACCESS_MASK DesiredAccess,
  IN POBJECT_ATTRIBUTES ObjectAttributes,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  IN PLARGE_INTEGER AllocationSize  OPTIONAL,
  IN ULONG FileAttributes,
  IN ULONG ShareAccess,
  IN ULONG CreateDisposition,
  IN ULONG CreateOptions,
  IN PVOID EaBuffer  OPTIONAL,
  IN ULONG EaLength
  );
...
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) 
{
...... 
RealZwCreateFile=(REALZWCREATEFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwCreateFile")]);
  (REALZWCREATEFILE)(KeServiceDescriptorTable->ServiceTableBase[SYSTEMSERVICE("ZwCreateFile")])=HookZwCreateFile;
//上面两行的代码含义请参照我上面的文章。
}
 
.....
 
NTSTATUS HookZwCreateFile(
  OUT PHANDLE FileHandle,
  IN ACCESS_MASK DesiredAccess,
  IN POBJECT_ATTRIBUTES ObjectAttributes,
  OUT PIO_STATUS_BLOCK IoStatusBlock,
  IN PLARGE_INTEGER AllocationSize  OPTIONAL,
  IN ULONG FileAttributes,
  IN ULONG ShareAccess,
  IN ULONG CreateDisposition,
  IN ULONG CreateOptions,
  IN PVOID EaBuffer  OPTIONAL,
  IN ULONG EaLength)
  {
  //初始化此函数的返回值
  NTSTATUS rc=0;
  //定义一个数组用来保存当前用户操作的盘符
  char Dir[7]={'\0'};
 int Flag=0;
  ANSI_STRING ansiDirName;
  PUNICODE_STRING uniFileName;
  PWSTR pTemp = (PWSTR)ExAllocatePool( NonPagedPool, 256);
  uniFileName = (PUNICODE_STRING)ExAllocatePool( NonPagedPool, sizeof( UNICODE_STRING));
  uniFileName->Buffer = pTemp;
  //将用户操作的路径保存在变量ansiDirName中
  RtlUnicodeStringToAnsiString( &ansiDirName, ObjectAttributes->ObjectName, TRUE);
  memset(Dir,0,7);
  //将用户操作的盘符保存在数组Dir中
  memcpy(Dir,ansiDirName.Buffer,6);
  //比较和我们保护的盘符是否匹配 注意这里只是简单的使用"C:\"来表示C盘。实际的盘符应该是" \\??\\C:\\"
  if (strcmp(Dir,"C:\")==0)
  {
   //下面的参数设置是为了给系统返回一个系统级错误,这样系统就不会在这个盘符上创建文件。
   IoStatusBlock->Information=FILE_DOES_NOT_EXIST;
   rc=RealZwCreateFile(0,DesiredAccess,ObjectAttributes,IoStatusBlock,AllocationSize,FileAttributes,ShareAccess,CreateDisposition,CreateOptions,EaBuffer,EaLength);
   return rc;
  }
  //如果这个盘符不是我们保护的盘符,那么我们调用正常的ZwCreateFile函数来实现创建文件的过程
  rc=RealZwCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,AllocationSize,FileAttributes,ShareAccess,CreateDisposition,CreateOptions,EaBuffer,EaLength);
  return rc;
  }
 
 通过以上的代码我们就可以对API函数CreateFile的功能进行修改。大家可以看到HOOK函数CreateFile是比较简单的。下次我要写的是"保护文件不被删除",这个功能实现起来就不会这样简单了。
 (我的代码都是从我自己开发的实际项目中摘录出来的。)
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/30909如需转载请自行联系原作者

fxh7622
相关文章
|
25天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
64 2
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
52 4
|
11天前
|
JSON 供应链 搜索推荐
某东API接口:开启电商数据交互与功能调用的新篇章
在当今的数字化时代,电商平台的开放API(Application Programming Interface,应用程序编程接口)已经成为连接开发者与电商平台之间的重要桥梁。京东作为中国领先的电商平台之一,其开放平台提供的API接口更是为开发者们带来了无限可能。本文将深入探讨京东API接口的功能、应用场景、使用流程以及其在电商领域的重要价值。
|
23天前
|
API 开发工具 开发者
探究亚马逊国际获得AMAZON商品详情 API 接口功能、作用与实际应用示例
亚马逊提供的Amazon Product Advertising API或Selling Partner API,使开发者能编程访问亚马逊商品数据,包括商品标题、描述、价格等。支持跨境电商和数据分析,提供商品搜索和详情获取等功能。示例代码展示了如何使用Python和boto3库获取特定商品信息。使用时需遵守亚马逊政策并注意可能产生的费用。
|
2月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
53 10
|
3月前
|
API
本地hook API MessageBoxA的masm32源代码[07-10更新]
本地hook API MessageBoxA的masm32源代码[07-10更新]
|
3月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
2月前
|
移动开发 前端开发 JavaScript
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
212 0
|
3月前
|
存储 程序员 API
【收藏】非API函数检测操作系统类型
【收藏】非API函数检测操作系统类型
|
1天前
|
XML JSON 缓存
阿里巴巴商品详情数据接口(alibaba.item_get) 丨阿里巴巴 API 实时接口指南
阿里巴巴商品详情数据接口(alibaba.item_get)允许商家通过API获取商品的详细信息,包括标题、描述、价格、销量、评价等。主要参数为商品ID(num_iid),支持多种返回数据格式,如json、xml等,便于开发者根据需求选择。使用前需注册并获得App Key与App Secret,注意遵守使用规范。