内核复制文件
来源:互联网 发布:工程类软件下载网站 编辑:程序博客网 时间:2024/06/05 15:53
众所周知内核中并不存在 ZwCopyFile,但可利用ZwReadFile,ZwWriteFile来实现
#include <ntddk.h>VOID DriverUnload(IN PDRIVER_OBJECT DriverObject){DbgPrint("卸载完成!\n");}BOOLEAN MyCopyFile(PCWSTR desFile,PCWSTR srcFile){HANDLE readFileHandle;HANDLE writeFileHandle;OBJECT_ATTRIBUTES ObjectAttributes;OBJECT_ATTRIBUTES ObjectAttributes1;UNICODE_STRING readFilePath;UNICODE_STRING writeFilePath;IO_STATUS_BLOCK IoStatusBlock;NTSTATUS status;PVOID saveBuffer=NULL;LARGE_INTEGER byteOffset;ULONG length=0;byteOffset.QuadPart=0;RtlInitUnicodeString(&readFilePath,srcFile);RtlInitUnicodeString(&writeFilePath,desFile);saveBuffer=ExAllocatePoolWithTag(PagedPool,1000,"tag1");InitializeObjectAttributes(&ObjectAttributes,&readFilePath,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);InitializeObjectAttributes(&ObjectAttributes1,&writeFilePath,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);status=ZwCreateFile(&readFileHandle,GENERIC_ALL,&ObjectAttributes,&IoStatusBlock,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN_IF,FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);if(!NT_SUCCESS(status)){DbgPrint("Can not create");if(readFileHandle!=NULL)ZwClose(readFileHandle);if(saveBuffer!=NULL)ExFreePool(saveBuffer);return FALSE;}status=ZwCreateFile(&writeFileHandle,GENERIC_ALL,&ObjectAttributes1,&IoStatusBlock,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN_IF,FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);if(!NT_SUCCESS(status)){ if(readFileHandle!=NULL) ZwClose(readFileHandle); if(writeFileHandle!=NULL)ZwClose(writeFileHandle); if(saveBuffer!=NULL) ExFreePool(saveBuffer); DbgPrint("Can not create");return FALSE;}do {length=1000;status=ZwReadFile(readFileHandle,NULL,NULL,NULL,&IoStatusBlock,saveBuffer,length,&byteOffset,NULL);//读取数据if(!NT_SUCCESS(status)){if(status==STATUS_END_OF_FILE)DbgPrint("read File End");if(readFileHandle!=NULL)ZwClose(readFileHandle);if(writeFileHandle!=NULL)ZwClose(writeFileHandle);if(saveBuffer!=NULL)ExFreePool(saveBuffer);return FALSE;}length=IoStatusBlock.Information;//返回实际读取数据的大小status=ZwWriteFile(writeFileHandle,NULL,NULL,NULL,&IoStatusBlock,saveBuffer,length,&byteOffset,NULL);if(!NT_SUCCESS(status)){DbgPrint("Can not write File ");if(readFileHandle!=NULL)ZwClose(readFileHandle);if(writeFileHandle!=NULL)ZwClose(writeFileHandle);if(saveBuffer!=NULL)ExFreePool(saveBuffer);return FALSE;}byteOffset.QuadPart+=length;//文件偏移移动} while (1);if(readFileHandle!=NULL)ZwClose(readFileHandle);if(writeFileHandle!=NULL)ZwClose(writeFileHandle);if(saveBuffer!=NULL)ExFreePool(saveBuffer);return TRUE;}NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath){if(MyCopyFile(L"\\??\\c:\\xxxx.rar",L"\\??\\c:\\xxxx1.rar")) DbgPrint("CopyFile Sucessfully");DriverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS;}
- 内核复制文件
- 内核进程的复制
- 文件复制
- 文件复制
- 文件复制
- 复制文件
- 文件复制
- 复制文件
- 复制文件
- 复制文件
- 复制文件
- 复制文件
- 复制文件
- 复制文件
- 文件复制
- 复制文件
- 复制文件
- 复制文件
- ubuntu创建swap分区
- OA项目之导出
- Activity onDestroy() 调用研究
- hdu/hdoj 1068 Girls and Boys
- 动态规划学习
- 内核复制文件
- javaNIO局部修改文件中指定位置的部分数据
- *** Terminating app due to uncaught exception of class '_NSZombie_NSException' libc++abi.dylib: ter
- wpa的4-Way Handshake
- 标准C++中的string类的用法总结
- myeclipse web 项目转到eclipse
- 通过结构体成员变量地址得到结构体的地址
- cocos2d-x学习日志(9) --战争烟雾
- 线程