windows 内核读写文件
1 static UNICODE_STRING StringSrcDriver = RTL_CONSTANT_STRING(L"\\??\\C:\\Users\\Administrator\\Desktop\\PCHunter64as.sys"); 2 static UNICODE_STRING StringDstDriver = RTL_CONSTANT_STRING(L"\\??\\C:\\Users\\Administrator\\Desktop\\PCHunter64as.sys.bak"); 3 4 #define PAGE_SIZE_MM (4096) 5 #define MYDRIVER_TAG ('hack') 6 7 static NTSTATUS CopyFile(PUNICODE_STRING dst, PUNICODE_STRING src) 8 { 9 HANDLE FileHandle1,FileHandle2; 10 IO_STATUS_BLOCK block1, block2; 11 OBJECT_ATTRIBUTES ot1, ot2; 12 NTSTATUS status; 13 //block1 14 char *Buff; 15 LARGE_INTEGER ByteOffset1, ByteOffset2; 16 17 if(KeGetCurrentIrql() != PASSIVE_LEVEL) { 18 kprintf("[+] infinityhook: STATUS_INVALID_DEVICE_STATE\n"); 19 return STATUS_INVALID_DEVICE_STATE; 20 } 21 22 Buff = (char *)ExAllocatePoolWithTag(PagedPool, PAGE_SIZE_MM, MYDRIVER_TAG); 23 if (Buff == NULL) { 24 return STATUS_INVALID_DEVICE_STATE; 25 } 26 block1.Pointer = NULL; 27 block1.Information = NULL; 28 block2.Pointer = NULL; 29 block2.Information = NULL; 30 31 InitializeObjectAttributes(&ot1, dst, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); 32 InitializeObjectAttributes(&ot2, src, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL); 33 34 status = ZwCreateFile( &FileHandle1, 35 GENERIC_WRITE, 36 &ot1, &block1, 37 NULL, FILE_ATTRIBUTE_NORMAL ,0, 38 FILE_OVERWRITE_IF, 39 FILE_SYNCHRONOUS_IO_NONALERT, 40 NULL, 0); 41 if (!NT_SUCCESS(status)) { 42 kprintf("ZwCreateFile File %wZ Error:%d\n", dst, status); 43 goto out; 44 } 45 status = ZwCreateFile( &FileHandle2, 46 GENERIC_READ, 47 &ot2, &block2, 48 NULL, FILE_ATTRIBUTE_NORMAL, 0, 49 FILE_OPEN, 50 FILE_SYNCHRONOUS_IO_NONALERT, 51 NULL, 0); 52 if (!NT_SUCCESS(status)) { 53 kprintf("ZwCreateFile File %wZ Error:%d\n", src, status); 54 goto out_2; 55 } 56 kprintf("ZwCreateFile Tow File Ok, Next to Read and Write!!!!\n"); 57 58 ByteOffset1.QuadPart = 0; 59 ByteOffset2.QuadPart = 0; 60 61 do { 62 status = ZwReadFile(FileHandle2, 63 NULL, 64 NULL, 65 NULL, 66 &block2, 67 Buff, 68 PAGE_SIZE_MM, 69 &ByteOffset2, 70 NULL); 71 if (!NT_SUCCESS(status)) { 72 kprintf("ZwReadFile Error!!!"); 73 goto out_1; 74 } 75 if (block2.Information == 0) { 76 kprintf("ZwReadFile Zero byte!!!"); 77 goto out_1; 78 } 79 kprintf("ZwReadFile block2 Information : %d", (int)block2.Information); 80 81 ByteOffset2.QuadPart += block2.Information; 82 83 status = ZwWriteFile( FileHandle1, 84 NULL, 85 NULL, 86 NULL, 87 &block1, 88 Buff, 89 (ULONG)block2.Information, 90 &ByteOffset1, 91 NULL); 92 if (!NT_SUCCESS(status)) { 93 kprintf("ZwWriteFile Error!!!"); 94 goto out_1; 95 } 96 ByteOffset1.QuadPart += block1.Information; 97 kprintf("ZwWriteFile block1 Information : %d", (int)block1.Information); 98 } while(1); 99 100 out_1: 101 ZwClose(FileHandle2); 102 out_2: 103 ZwClose(FileHandle1); 104 out: 105 ExFreePool(Buff); 106 return status; 107 }