用HOOK来修改API函数的功能(2)-创建文件-阿里云开发者社区

开发者社区> 科技探索者> 正文

用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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
函数计算 4-5 月功能发布
函数计算4-5月发布了访问用户 VPC 资源,HTTP 触发器,环境变量等重磅功能,以及在控制台、工具链、SDK 上一系列改进,快来看看吧!
1281 0
十分钟上线-基于函数计算开发 Restful web api & asp.net core web app
.NET Core是一个开源通用的开发框架,支持跨平台, 阿里云函数计算推出了 dotnetcore2.1 runtime, 使用 C# 编写 serverless 函数, 除了很好地支持通常意义上的函数外, 还可以基于函数计算开发 asp.
4546 0
阿里云云效功能升级,支持快速创建多个应用的独立测试环境
作为测试人员来说,搭建测试环境是测试实施的一个重要阶段,测试环境适合与否会严重影响测试结果的真实性和正确性。为了更好地服务用户,近日,阿里云研发协同平台-云效宣布功能升级,支持快速创建多个应用的独立测试环境,对于企业开发人员和测试人员来说,又是一大福音。
4514 0
PHPpraffa也有了,一个PHP版本的阿里云函数计算与API网关的开发框架
发布了Python版本的函数计算与API网关的开发框架后,一直觉得对不起PHP,因为公司一直是用PHP的,我这弄了个Python,实在不该,对了,(Python版本说明点这里。 PHPpraffa是什么? PHPpraffa 是praffa的PHP版本。
1161 0
请问:hive中avg聚合函数会使用到combiner功能吗?
hive avg函数是否可以使用combiner功能
2900 0
C#使用WinAPI 修改电源设置,临时禁止笔记本合上盖子时睡眠
原文 http://www.cnblogs.com/h46incon/archive/2013/09/03/3299138.html 在 阻止系统自动睡眠的小软件,附C#制作过程 ,弄了一个防止系统睡眠的工具。
1410 0
SAP SE16N 批量修改KONP表数据
SAP SE16N 批量修改KONP表数据   在做当前的一个项目里,我在导入采购信息记录主数据的时候,把价格的货币单位人民币弄成了CNY,实际上项目上要求使用RMB,有660多条采购信息记录的价格都有类似的问题。
2086 0
5489
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载