(九)、文件操作
一、文件创建
ZwCreateFile内部调用了IoCreateFile
objectAttributes:文件属性,里面有很多属性,可以用下面的函数初始化他
IoStatusBlock :返回状态
FileAttributea: 文件属性,如压缩、加密、隐藏、存档、常规属性
ShareAccess:共享访问,多进程能否同时打开文件
CreateDisposition :创建意向,原文件存在就创建、不存在就打开等等
代码
#include <ntddk.h> VOID Unload(PDRIVER_OBJECT driver) { DbgPrint("Driver Unload\n"); } VOID FileTest1() { HANDLE hFile; NTSTATUS status; IO_STATUS_BLOCK IoStatus; //指向IO_STATUS_BLOCK结构的指针,该结构接收最终完成状态和有关请求操作的其他信息 UNICODE_STRING FilePath = RTL_CONSTANT_STRING(L"\\??\\C:\\test.log"); OBJECT_ATTRIBUTES oa;//文件属性// InitializeObjectAttributes(&oa, &FilePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);//初始化文件属性// 在将 ObjectName 参数与现有对象的名称匹配时使用不区分大小写的比较/指定句柄只能在内核模式下访问 status = ZwCreateFile(&hFile, GENERIC_ALL, &oa, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF,//打开文件且当文件不存在时创建文件// FILE_SYNCHRONOUS_IO_NONALERT, //文件同步不警告// NULL, 0); if (status != STATUS_SUCCESS) { DbgPrint("文件创建失败 %x\n",status); return; } DbgPrint("文件创建成功\n"); ZwClose(hFile); } void FileTest2() { HANDLE hFile; NTSTATUS status; OBJECT_ATTRIBUTES oa; IO_STATUS_BLOCK IoStatus; UNICODE_STRING FilePath = RTL_CONSTANT_STRING(L"\\??\\C:\\test2.log"); InitializeObjectAttributes(&oa, &FilePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); status = IoCreateFile(&hFile, GENERIC_ALL, &oa, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT,//文件同步不警告// NULL, 0, CreateFileTypeNone,//驱动程序必须将此参数设置为CreateFileTypeNone。// NULL, IO_NO_PARAMETER_CHECKING);//不做参数检查 if (NT_SUCCESS(status)) { DbgPrint("文件创建2失败 %x\n",status); return; } DbgPrint("文件创建成功\n"); ZwClose(hFile); } NTSTATUS DriverEntry(PDRIVER_OBJECT driver) { DbgPrint("Driver Load\n"); FileTest1(); FileTest2(); driver->DriverUnload = Unload; return STATUS_SUCCESS; }
二、文件查询
1、ZwQueryInformationFile
IoStatusBlock : 接收最终完成状态和有关操作的信息的IO_STATUS_BLOCK结构的指针
FileInformation : 这是自定义的缓冲区,函数将请求的有关文件对象的信息写入该缓冲区
Length : 这是缓冲区的长度
FileInformationClass : 为FileInformation参数指定返回的有关文件信息的类型
2、ZwSetInformationFile
这个函数用于设置文件属性
我们这里以设置文件大小为例
代码
FileTest5函数才是设置文件大小函数
#include <ntddk.h> VOID Unload(PDRIVER_OBJECT driver) { DbgPrint("Driver Unload\n"); } VOID FileTest1() { HANDLE hFile; NTSTATUS status; IO_STATUS_BLOCK IoStatus; //指向IO_STATUS_BLOCK结构的指针,该结构接收最终完成状态和有关请求操作的其他信息 UNICODE_STRING FilePath = RTL_CONSTANT_STRING(L"\\??\\C:\\test.log"); OBJECT_ATTRIBUTES oa;//文件属性// InitializeObjectAttributes(&oa, &FilePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);//初始化文件属性// 在将 ObjectName 参数与现有对象的名称匹配时使用不区分大小写的比较/指定句柄只能在内核模式下访问 status = ZwCreateFile(&hFile, GENERIC_ALL, &oa, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF,//打开文件且当文件不存在时创建文件// FILE_SYNCHRONOUS_IO_NONALERT, //文件同步不警告// NULL, 0); if (status != STATUS_SUCCESS) { DbgPrint("文件创建失败 %x\n",status); return; } DbgPrint("文件创建成功\n"); ZwClose(hFile); } void FileTest2() { HANDLE hFile; NTSTATUS status; OBJECT_ATTRIBUTES oa; IO_STATUS_BLOCK IoStatus; UNICODE_STRING FilePath = RTL_CONSTANT_STRING(L"\\??\\C:\\test2.log"); InitializeObjectAttributes(&oa, &FilePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); status = IoCreateFile(&hFile, GENERIC_ALL, &oa, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT,//文件同步不警告// NULL, 0, CreateFileTypeNone,//驱动程序必须将此参数设置为CreateFileTypeNone。// NULL, IO_NO_PARAMETER_CHECKING);//不做参数检查 if (NT_SUCCESS(status)) { DbgPrint("文件创建2失败 %x\n",status); return; } DbgPrint("文件创建成功\n"); ZwClose(hFile); } VOID FileTest3() { HANDLE hFile; NTSTATUS status; OBJECT_ATTRIBUTES oa; UNICODE_STRING FilePath = RTL_CONSTANT_STRING(L"\\??\\C:\\KmdManager.exe"); IO_STATUS_BLOCK IoStatus; FILE_STANDARD_INFORMATION fsi; InitializeObjectAttributes(&oa,&FilePath,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL); status = ZwOpenFile(&hFile,FILE_ALL_ACCESS,&oa,&IoStatus,FILE_SHARE_READ,FILE_SYNCHRONOUS_IO_NONALERT); if (!NT_SUCCESS(status)) { DbgPrint("文件打开失败\n"); return; } status = ZwQueryInformationFile(hFile, &IoStatus, &fsi, sizeof(fsi), FileStandardInformation);//标准信息// if (!NT_SUCCESS(status)) { DbgPrint("文件查询失败\n"); ZwClose(hFile); return; } DbgPrint("文件的大小为:%d字节\n ", fsi.EndOfFile.LowPart);//22528// } VOID FileTest4() { HANDLE hFile; NTSTATUS status; OBJECT_ATTRIBUTES oa; UNICODE_STRING FilePath = RTL_CONSTANT_STRING(L"\\??\\C:\\KmdManager.exe"); IO_STATUS_BLOCK IoStatus; FILE_STANDARD_INFORMATION fsi; InitializeObjectAttributes(&oa, &FilePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); status = ZwOpenFile(&hFile, FILE_ALL_ACCESS, &oa, &IoStatus, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT); if (!NT_SUCCESS(status)) { DbgPrint("文件打开失败 %x\n",status); return; } status = ZwQueryInformationFile(hFile, &IoStatus, &fsi, sizeof(fsi), FileStandardInformation);//标准信息// if (!NT_SUCCESS(status)) { DbgPrint("文件查询失败 %x \n",status); ZwClose(hFile); return; } DbgPrint("文件的大小为:%d字节\n ", fsi.EndOfFile.LowPart);//22528// //lowPart 是LARGE_INTEGER结构体的成员信息/// /* FILE_END_OF_FILE_INFORMATION feofi; feofi.EndOfFile.LowPart = 0xfffffff; status = ZwSetInformationFile(hFile, &IoStatus, &feofi, sizeof(feofi), FileValidDataLengthInformation); if (!NT_SUCCESS(status) ) { DbgPrint("改变失败 %x\n",status); //第一次失败原因: 0xc000000d错误,代表的意思是把一个无效的参数传递给了服务或函数 ZwClose(hFile); return ; } DbgPrint("改变成功\n"); ZwClose(hFile); //ZwSetInformationFile// */ } VOID FileTest5() { HANDLE hFile; OBJECT_ATTRIBUTES oa; UNICODE_STRING FilePath = RTL_CONSTANT_STRING(L"\\??\\C:\\KmdManager.exe"); InitializeObjectAttributes(&oa, &FilePath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); IO_STATUS_BLOCK iosb; NTSTATUS status; FILE_END_OF_FILE_INFORMATION feofi; status = ZwCreateFile(&hFile, FILE_ALL_ACCESS, &oa, &iosb, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_NO_INTERMEDIATE_BUFFERING, NULL, 0); if (!NT_SUCCESS(status)) { DbgPrint("ZwCreateFile error %x\n", status); //第一次失败原因: 0xc000000d错误,代表的意思是把一个无效的参数传递给了服务或函数 ZwClose(hFile); //c00000034 触发不必要快照删除// return; //c0000008//无效句柄 } feofi.EndOfFile.QuadPart = 0xffffff; // 设置文件信息 status = ZwSetInformationFile(hFile, &iosb, &feofi, sizeof(FILE_END_OF_FILE_INFORMATION), FileEndOfFileInformation); if (!NT_SUCCESS(status)) { DbgPrint("改变失败 %x\n", status); //第一次失败原因: 0xc000000d错误,代表的意思是把一个无效的参数传递给了服务或函数 ZwClose(hFile); return; } DbgPrint("修改成功,扩增到了%lld个字节\n",feofi.EndOfFile.QuadPart); // 关闭句柄,释放内存 ZwClose(hFile); } NTSTATUS DriverEntry(PDRIVER_OBJECT driver) { DbgPrint("Driver Load\n"); //FileTest1(); //FileTest2(); //FileTest3(); //FileTest4(); FileTest5();//设置文件大小// driver->DriverUnload = Unload; return STATUS_SUCCESS; }
实验
如图,这本来是一个大小为22528kb的文件,经过拓展后:
文件被拓展到0xffffff个字节,用16进制文本编辑器打开后,可以发现,文件是由于二进制数据的拓展照成的
__EOF__

本文作者:_TLSN
本文链接:https://www.cnblogs.com/lordtianqiyi/articles/16098034.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/lordtianqiyi/articles/16098034.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现