实现FileCopy(Ring0 x86 x64)
1.1 内核不接受一个字符串文件路径,必须填写一个OBJECT_ATTRIBUTES结构。
这个结构,在InitializeObjectAttributes初始化 typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName; //路径
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
typedef CONST OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES; VOID
InitializeObjectAttributes(
OUT POBJECT_ATTRIBUTES InitializedAttributes,
IN PUNICODE_STRING ObjectName, //路径
IN ULONG Attributes, //OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE 忽略大小写 |打开内核句柄
IN HANDLE RootDirectory,
IN PSECURITY_DESCRIPTOR SecurityDescriptor //打开的是内核句柄 传NULL
); NTSTATUS
ZwCreateFile(
__out PHANDLE FileHandle,
__in ACCESS_MASK DesiredAccess, //申请的权限GENERIC_ALL
__in POBJECT_ATTRIBUTES ObjectAttributes,
__out PIO_STATUS_BLOCK IoStatusBlock, //
__in_opt PLARGE_INTEGER AllocationSize,
__in ULONG FileAttributes,
__in ULONG ShareAccess,
__in ULONG CreateDisposition,
__in ULONG CreateOptions,
__in_opt PVOID EaBuffer,
__in ULONG EaLength
); 如果CreateOptions 带有FILE_NO_INTERMEDIATE_BUFFERING CreateOptions 表示不通过缓冲区 直接操作磁盘,所以每次
操作读写都必须以磁盘扇区大小(通常为512字节)对齐,否则返回错误,
typedef struct _IO_STATUS_BLOCK {
union {
NTSTATUS Status; //成功则为STATUS_SUCCESS
PVOID Pointer;
} DUMMYUNIONNAME;
ULONG_PTR Information; //返回的更多信息
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; NTSTATUS
ZwReadFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL, //用于异步完成时
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, //异步完成时的回调例程
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID Buffer, //缓冲区
IN ULONG Length, //缓冲区长度
IN PLARGE_INTEGER ByteOffset OPTIONAL, //
IN PULONG Key OPTIONAL
); 读取的实际长度在ioStatusBlock.Information里
读取完 返回STATUS_END_OF_FILE NTSTATUS
ZwWriteFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset OPTIONAL,
IN PULONG Key OPTIONAL
);
/***************************************************************************************
* AUTHOR : icqw
* DATE : 2015-7-30
* MODULE : FileOption.H
*
* IOCTRL Sample Driver
*
* Description:
* Demonstrates communications between USER and KERNEL.
*
****************************************************************************************
* Copyright (C) 2010 icqw.
****************************************************************************************/
#ifndef CXX_FILEOPTION_H
#define CXX_FILEOPTION_H
#include <ntifs.h>
#include <devioctl.h>
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObj, IN PUNICODE_STRING pRegistryString);
VOID DriverUnload(IN PDRIVER_OBJECT pDriverObj);
HANDLE OpenFile(WCHAR* wzFilePath);
NTSTATUS ReadFile(HANDLE hFile,CHAR* szBuffer,PULONG ulLength,PLARGE_INTEGER Offset);
NTSTATUS WriteFile(HANDLE hFile,CHAR* szBuffer,PULONG ulLength,PLARGE_INTEGER Offset);
NTSTATUS FileCopy(WCHAR* wzDest,WCHAR* wzSour);
#endif
#ifndef CXX_FILEOPTION_H
# include "FileOption.h"
#endif
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING pRegisterPath)
{
NTSTATUS status = STATUS_SUCCESS;
// #if DBG
// _asm int 3
//
// #endif
DriverObject->DriverUnload = DriverUnload;
FileCopy(L"\\??\\D:\\Dest.txt",L"\\??\\D:\\Sour.txt"); DbgPrint("[FileOption] DriverEntry Success\r\n");
return STATUS_SUCCESS;
}
NTSTATUS FileCopy(WCHAR* wzDest,WCHAR* wzSour)
{
HANDLE hSourFile = OpenFile(wzSour);
HANDLE hDestFile = OpenFile(wzDest);
ULONG ulLength = ;
CHAR* szBuffer = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
LARGE_INTEGER Offset = {};
if (hSourFile==NULL||hDestFile==NULL)
{
return STATUS_UNSUCCESSFUL;
}
szBuffer = (char*)ExAllocatePool(NonPagedPool,*+);
while(TRUE)
{
RtlZeroMemory(szBuffer,*+);
ulLength = *;
//读
Status = ReadFile(hSourFile,
szBuffer,
&ulLength,
&Offset);
if (!NT_SUCCESS(Status))
{
break;
}
//写
Status = WriteFile(hDestFile,
szBuffer,
&ulLength,
&Offset);
if (!NT_SUCCESS(Status))
{
break;
}
}
DbgPrint("Copy Success!");
ZwClose(hSourFile);
ZwClose(hDestFile);
return STATUS_SUCCESS;
}
HANDLE OpenFile(WCHAR* wzFilePath)
{
UNICODE_STRING uniName;
OBJECT_ATTRIBUTES Ob;
HANDLE hFile = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
IO_STATUS_BLOCK ioStatus = {}; RtlInitUnicodeString(&uniName,wzFilePath);
InitializeObjectAttributes(&Ob,
&uniName,
OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
NULL,
NULL);
Status = ZwCreateFile(&hFile,
GENERIC_ALL|SYNCHRONIZE,
&Ob,
&ioStatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN_IF,
FILE_NON_DIRECTORY_FILE|
FILE_RANDOM_ACCESS|
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
);
if (!NT_SUCCESS(Status))
{
return NULL;
}
return hFile;
}
//读文件 ulLength 为读取实际长度
NTSTATUS ReadFile(HANDLE hFile,CHAR* szBuffer,PULONG ulLength,PLARGE_INTEGER Offset)
{
//这里用
NTSTATUS Status = STATUS_UNSUCCESSFUL;
IO_STATUS_BLOCK ioStatus = {}; Status = ZwReadFile(hFile,
NULL,
NULL,
NULL,
&ioStatus,
szBuffer,
*ulLength,
Offset,
NULL);
if (!NT_SUCCESS(Status))
{
//Status==STATUS_END_OF_FILE) return STATUS_UNSUCCESSFUL; }
*ulLength = ioStatus.Information;
return Status;;
}
//写文件
NTSTATUS WriteFile(HANDLE hFile,CHAR* szBuffer,PULONG ulLength,PLARGE_INTEGER Offset)
{
NTSTATUS Status = STATUS_UNSUCCESSFUL;
IO_STATUS_BLOCK ioStatus = {}; Status = ZwWriteFile(hFile,
NULL,
NULL,
NULL,
&ioStatus,
szBuffer,
*ulLength,
Offset,
NULL);
if (!NT_SUCCESS(Status))
{
return STATUS_UNSUCCESSFUL; //!!!!
}
(*Offset).QuadPart += *ulLength; //Offset移动
return Status;;
}
VOID
DriverUnload(IN PDRIVER_OBJECT pDriverObj)
{
DbgPrint("[FileOption] Unloaded Success\r\n");
return;
}
实现FileCopy(Ring0 x86 x64)的更多相关文章
- 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY
转载自: 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY Navicat Premium(数据库管理工具 ...
- [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
[原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...
- 关于VS项目平台的x86,x64,Any CPU以及Debug和Release的区别
相信对于很多刚接触打包程序的同志来说,关于x86,x64,Any CPU这三个项目平台,以及解决方案配置Debug和Release有什么区别?这个问题一定有许多的困惑,甚至不乏一些已经工作了很久的老程 ...
- SQL Server 2008 R2 Developer (x86, x64, ia64) – DVD (Chinese-Simplified)
http://blog.sina.com.cn/s/blog_4aedf6370101j9tz.html 1. SQL Server 2008 R2 Developer (x86, x64, ia64 ...
- System Address Map Initialization in x86/x64 Architecture Part 2: PCI Express-Based Systems
原文 http://resources.infosecinstitute.com/system-address-map-initialization-x86x64-architecture-pa ...
- VOL.2 IE6,7,8(windows vista/7 x86/x64 )单文件版三连发,欢迎大家分享
在上期 VOL.1 利用vmware ThinApp 制作非XP下可以运行的IE6 [无插件版](windows vista/7/8 x86/x64 )中,简要介绍了如何利用vmware Thina ...
- [Tool]利用Advanced Installer建立x86/x64在一起的安装程式
原文 [Tool]利用Advanced Installer建立x86/x64在一起的安装程式 之前使用InstallShield做安装程式时,如果要将程式放在Program Files的话,需要分别针 ...
- 『开源重编译』System.Data.SQLite.dll 自适应 x86 x64 AnyCPU 重编译
背景: > System.Data.SQLite.dll 程序集 不能良好的支持 AngCPU 格式 System.Data.SQLite.dll 在 适应 x86 和 x64 有三个方案: & ...
- 关于.NET编译的目标平台(AnyCPU,x86,x64) (转)
关于.NET编译的目标平台(AnyCPU,x86,x64)(转) 今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有DLL工程的目标平台全部指定成AnyCPU . ...
随机推荐
- Linked List Cycle (java)
public boolean hasCycle(ListNode head) { ListNode slow=head; ListNode fast=head; if(head==null)retur ...
- ps 网页配图设计
网站配图设计 蒙太奇 品科软件---网页页面 1橡皮擦来画两图 容合 大橡皮擦擦出来自然 2图放到一个色块中 用剪贴蒙版 3调色阶 装饰下图片 矩形工具 形状 填充 画彩条 超出本框的怎么去掉多 ...
- iframe自适应高度的多种方法方法小结(转)
对于自适应高度的代码有很多,可效率什么的考虑进来好代码就不多见了,不过思路倒是差不多的不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 iframe的 ...
- 匈牙利算法(素数伴侣(HW1112))
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vector> #include<string&g ...
- 1207: C.LU的困惑
题目描述 Master LU 非常喜欢数学,现在有个问题:在二维空间上一共有n个点,LU每连接两个点,就会确定一条直线,对应有一个斜率.现在LU把平面内所有点中任意两点连线,得到的斜率放入一个集合中( ...
- 浅谈 qmake 之 shadow build(就是将源码路径和构建路径分开)
shadow build shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁. 这不是qmake ...
- Erlang语言介绍
Erlang (/ˈɜrlæŋ/ er-lang) is a general-purpose concurrent, garbage-collected programming language an ...
- mfc subclasswindow attach setwindowlong使用区别
1. CWnd::Attach BOOL Attach( HWND hWndNew ); 返回值:如果成功,则返回非零值:否则返回0. 参数: hWndNew 指定了Windows窗口的句柄. 说明: ...
- pycares cffi
pypy 5.0.1 由于 cpyext 有 bug,用不了异步 DNS 解析库 pycares .花了一周时间,对照着 pycares 的 C 代码自己重写了个 cffi 的实现.在 windows ...
- 栈ADT的链表实现
/* 栈ADT链表实现的类型声明 */ struct Node; typedef struct Ndoe *PtrToNode; typedef PtrToNode Stack; struct Nod ...