网络安全编程:内核下文件读写函数
文件读写程序分为4个函数,分别是DriverUnload()、DriverEntry()、CreateFileTest()和OpenFileTest()。这4个函数的功能非常明确,DriverUnload()是一个卸载例程,DriverEntry()是驱动程序的入口,CreateFileTest()是用来新建文件的,OpenFileTest()是用来打开已建立文件并进行读写的函数。
1. 文件的创建、打开与关闭
对于文件的创建或打开,在内核驱动中都是通过内核函数ZwCreateFile()进行操作的。和Win32API类似,会通过参数接收返回的文件句柄。它的返回值是一个操作是否成功的状态码。ZwCreateFile()函数的定义如下:
参数介绍如下。
FileHandle:用来接收创建文件后的文件句柄。
DesiredAccess: 打开文件操作的描述,读或写,一般指定为 GENERIC_READ 或 GENERIC_WRITE;该参数和CreateFile()函数中的参数相同。
ObjectAttributes: 指向 OBJECT_ATTRIBUTES 结构体的指针,该结构体包含要创建或打开的文件名。
IoStatusBlock: 指向 IO_STATUS_BLOCK 结构体的指针,该结构体用于接收操作结果的状态。
AllocationSize: 该参数指向一个 64 位的整数,用于文件初始化分配时的大小。
FileAttributes: 通常为 FILE_ATTRIBUTE_NORMAL,该参数和 CreateFile()函数中的参数相同。
ShareAccess: 指定文件的共享方式,可以指定为 FILE_SHARE_READ、FILE_SHARE_WRITE 或FILE_SHARE_DELETE,该参数和 CreateFile()函数中的参数相同。
CreateDisposition: 描述本次调用 ZwCreateFile()函数的意图,可以指定为FILE_CREATE、FILE_OPEN、FILE_OPEN_IF 等。
CreateOptions: 通常指定为 FILE_SYNCHRONOUS_IO_NONALERT,表示文件是同步操作,比如在写入文件时,调用ZwWriteFile()函数,在 ZwWriteFile()调用返回时,文件写操作已经完成。
EaBuffer: 该参数表示一个指针,指向可选的扩展属性区,一般为 NULL。
EaLength: 该参数表示扩展属性区的长度,一般为 0。
ZwCreateFile()函数的第 3 个参数是一个指向 OBJECT_ATTRIBUTES 的结构体,该结构体的定义如下:
该结构体通常不需要用户逐个进行初始化,而是使用InitializeObjectAttributes()函数进行初始化,该函数的定义如下:
从InitializeObjectAttributes()函数的定义可以看出,其参数与OBJECT_ATTRIBUTES结构体的成员变量相同。InitializeObjectAttributes()函数的参数说明如下。
InitializeAttributes: 指向 OBJECT_ATTRIBUTES 结构体的指针。
ObjectName: 对象名称,用 UNICODE_STRING 描述,对于 ZwCreateFile()函数而言,该处指定为文件名。
Attributes: 一般设置为 OBJ_CASE_INSENSITIVE,意味着名字字符串不区分大小写。
RootDirectory: 一般设置为 NULL。
SecurityDescriptor: 用于设置安全描述符,一般设置为 NULL。
ObjectName 必须使用 UNICODE_STRING 类型进行描述,UNICODE_STRING是内核对宽字符串封装的一种数据结构,该结构体的定义如下:
结构体成员说明如下。
Length: 字符串的参数,单位是字节,如果是 N 个字符,那幺 Length 的值为 N 个字符的 2 倍。
MaximumLength:整个字符缓冲区的最大长度,单位是字节。
Buffer:缓冲区的指针。
对于 UNICODE_STRING 类型的字符串,通过 KdPrint()也可以进行调试输出,输出的方式类似如下:
UNICODE_STRING类型的字符串在使用前需要进行初始化,初始化的方法有两种:一种是使用内核函数RtlInitUnicodeString()进行初始化,另一种方式是自行申请内存空间来进行初始化。通常情况下都是用第1种方法。RtlInitUnicodeString()函数的定义如下:
参数说明如下。
DestinationString: 要初始化的 UNICODE_STRING 字符串的指针。
SourceString:字符串的内容。
在为InitializeObjectAttributes()函数传递第2个参数时,需要指定的文件名是一个符号链接。在应用层下,描述一个文件的完整路径是“c:\a.txt”;而在内核下,描述的方式为“\??\c:\a.txt”。符号链接在内核模式下以“\??\”(或者是“\DosDevices\”)开头;在用户模式下使用符号链接,则以“\\.\”开头。
上面介绍的ZwCreateFile()函数不但可以创建文件,还可以打开文件。但是由于它的参数过于繁多,因此内核函数中专门提供了一个用于进行文件打开的函数ZwOpenFile(),其定义如下:
ZwOpenFile()函数相当于一个只用来打开文件的精简版的ZwCreateFile()函数,其各参数使用方法与ZwCreateFile()函数相同,这里不重复介绍。
文件句柄的关闭使用内核函数ZwClose(),其定义如下:
该函数只包含一个参数,即被打开文件的句柄。该函数除了可以关闭文件句柄以外,还可以关闭其它类型资源的句柄,比如注册表句柄等。
2. 文件的相关操作
文件相关的操作主要介绍4个内核函数,分别是ZwReadFile()、ZwWriteFile()、ZwQueryInformationFile()和ZwSetInformationFile()。例子代码中实现了对文件的读写操作,判断打开的文件是否为目录,获取文件的长度和设置文件的指针。
首先来看ZwQueryInformationFile()和ZwSetInformationFile()两个函数的定义。ZwQueryInformationFile()函数的定义如下:
参数说明如下。
FileHandle:被打开的文件句柄。
IoStatusBlock:返回设置的状态。
FileInformation: 依据 FileInformationClass 的不同而不同。
Length: FileInformation 数据的长度。
FileInformationClass:描述需获取的属性类型。
ZwSetInformationFile()函数的定义如下:
ZwSetInformationFile()函数的参数与 ZwQueryInformationFile()函数的参数几乎相同,但是两个函数的第 3个参数稍有差别,差别在于对 ZwQueryInformationFile()来说是一个输出参数,对于ZwSetInformationFile()来说是一个输入参数。这里一定要注意。
对于ZwQueryInformationFile()和ZwSetInformationFile()这两个函数来说,第5个参数决定了要读取或设置的属性的类型,第3个参数根据第5个参数来接受或传递相应的值。
两个函数的第5个参数的常用值有3种类型,分别是FileStandardInformation、FileBasicInformation和FilePositionInformation。每种类型分别又对应不同的结构体,这些结构体则是被ZwQueryInformationFile()和ZwSetInformationFile()函数的第3个参数所用。
FileStandardInformation对应的结构体定义如下:
FileBasicInformation对应的结构体定义如下:
FilePositionInformation对应的结构体定义如下:
明白了第3个参数和第5个参数以后,就可以清楚第4个参数的取值了,该取值是第3个参数的大小。
上面的结构体中大量使用了LARGE_INTEGER的数据类型,它其实是一个联合体。LARGE_INTEGER的定义如下:
该结构体主要是用来表示64位的整数类型,通常使用其QuadPart成员。
ZwReadFile()函数的定义如下:
参数说明如下。
FileHandle:打开文件的句柄。
Event: 用于异步完成读取时,一般设置为 NULL。
ApcRoutine: 回调例程,用于异步完成读取时,一般设置为 NULL。
ApcContext: 一般设置为 NULL。
IoStatusBlock: 指向 IO_STATUS_BLOCK 的指针,记录读取操作的状态,IoStatusBlock.Information用于记录读取的字节数。
Buffer:保存读取文件内容的缓冲区。
Length:准备读取文件内容的字节数。
ByteOffset:指定读取内容的偏移地址。
Key: 读取文件时的附加信息,一般设置为 NULL。
ZwWriteFile()函数的定义如下:
该函数的参数类似于ZwReadFile()函数,Buffer中保存的是欲写入文件内容的缓冲区。
3. 内存管理函数
文件读写代码中用到了3个内存相关的内核函数,分别是ExAllocatePool()、RtlFillMem ory()和ExFreePool()。
ExAllocatePool()函数用于申请一块内存空间,其定义如下:
参数说明如下。
PoolType: 该参数是一个枚举值,常用的值有两个,分别是 NonPagedPool 和PagedPool;前者表示非分页内存,而后者表示分页内存;永远不会被交换到文件中的虚拟内存称为非分页内存,可以被交换到文件中的虚拟内存称为分页内存。
NumberOfBytes:表示需要分配的内存大小。
该函数的返回值是一个内存地址。
RtlFillMemory()函数用于填充内存,其定义如下:
参数说明如下。
Desination:填充内存地址的起始位置。
Length:填充的长度。
Fill:需要填充的字节。
ExFreePool()函数用于回收 ExAllocatePool()申请的内存空间,其定义如下:
该函数只有一个参数,是指向ExAllocatePool()函数分配内存空间的指针。
推荐系统
雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO
语言:中文版系统大小:5.91GB系统类型:Win7雨林木风win7旗舰版系统下载 win7 32位旗舰版 GHOST 免激活镜像ISO在系统方面技术积累雄厚深耕多年,加固了系统安全策略,雨林木风win7旗舰版系统在家用办公上跑分表现都是非常优秀,完美的兼容各种硬件和软件,运行环境安全可靠稳定。win7 32位旗舰装机版 v2019 05能够帮助用户们进行系统的一键安装、快速装机等,系统中的内容全面,能够为广大用户
番茄花园Ghost Win7 x64 SP1稳定装机版2022年7月(64位) 高速下载
语言:中文版系统大小:3.91GB系统类型:Win7欢迎使用 番茄花园 Ghost Win7 x64 SP1 2022.07 极速装机版 专业装机版具有更安全、更稳定、更人性化等特点。集成最常用的装机软件,集成最全面的硬件驱动,精心挑选的系统维护工具,加上独有人性化的设计。是电脑城、个人、公司快速装机之首选!拥有此系统
番茄花园 Windows 10 极速企业版 版本1903 2022年7月(32位) ISO镜像快速下载
语言:中文版系统大小:3.98GB系统类型:Win10番茄花园 Windows 10 32位极速企业版 v2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程中自动激活
新萝卜家园电脑城专用系统 Windows10 x86 企业版 版本1507 2022年7月(32位) ISO镜像高速下载
语言:中文版系统大小:3.98GB系统类型:Win10新萝卜家园电脑城专用系统 Windows10 x86企业版 2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程
笔记本&台式机专用系统 Windows10 企业版 版本1903 2022年7月(32位) ISO镜像快速下载
语言:中文版系统大小:3.98GB系统类型:Win10笔记本台式机专用系统 Windows 10 32位企业版 v2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过
笔记本&台式机专用系统 Windows10 企业版 版本1903 2022年7月(64位) 提供下载
语言:中文版系统大小:3.98GB系统类型:Win10笔记本台式机专用系统 Windows10 64专业版 v2022年7月 一、系统主要特点: 使用微软Win10正式发布的专业版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程中自动
雨林木风 Windows10 x64 企业装机版 版本1903 2022年7月(64位) ISO镜像高速下载
语言:中文版系统大小:3.98GB系统类型:Win10新雨林木风 Windows10 x64 企业装机版 2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程中自动激活
深度技术 Windows 10 x64 企业版 电脑城装机版 版本1903 2022年7月(64位) 高速下载
语言:中文版系统大小:3.98GB系统类型:Win10深度技术 Windows 10 x64 企业TLSB 电脑城装机版2022年7月 一、系统主要特点: 使用微软Win10正式发布的企业TLSB版制作; 安装过程全自动无人值守,无需输入序列号,全自动设置; 安装完成后使用Administrator账户直接登录系统,无需手动设置账号。 安装过程
热门系统
- 1华硕笔记本&台式机专用系统 GhostWin7 32位正式旗舰版2018年8月(32位)ISO镜像下载
- 2深度技术 Windows 10 x86 企业版 电脑城装机版2018年10月(32位) ISO镜像免费下载
- 3电脑公司 装机专用系统Windows10 x86喜迎国庆 企业版2020年10月(32位) ISO镜像快速下载
- 4雨林木风 Ghost Win7 SP1 装机版 2020年4月(32位) 提供下载
- 5深度技术 Windows 10 x86 企业版 六一节 电脑城装机版 版本1903 2022年6月(32位) ISO镜像免费下载
- 6深度技术 Windows 10 x64 企业版 电脑城装机版2021年1月(64位) 高速下载
- 7新萝卜家园电脑城专用系统 Windows10 x64 企业版2019年10月(64位) ISO镜像免费下载
- 8新萝卜家园 GhostWin7 SP1 最新电脑城极速装机版2018年8月(32位)ISO镜像下载
- 9电脑公司Ghost Win8.1 x32 精选纯净版2022年5月(免激活) ISO镜像高速下载
- 10新萝卜家园Ghost Win8.1 X32 最新纯净版2018年05(自动激活) ISO镜像免费下载
热门文章
- 1迅雷云播“手机看片神器”使用教程(随时随地秒速离线云播放)
- 2微信公众号怎么年审? 微信公众号年审流程及所需材料介绍
- 3Win10怎么设置网络按流量计费 Win10网络设置流量收费教程
- 4安卓手机安装运行win7系统教程 安卓手机装win7系统教程
- 5win7蓝屏代码7f指什 怎么解决 很严重
- 6二手笔记本电脑价格是多少 二手笔记本电脑价格盘点
- 7aoc一体机电脑win10改win7系统及bios设置
- 8Steam提示“需要在线进行更新,请确认您的网络连接正常”怎么办?
- 9华硕b460主板装win7系统及bios设置教程 10代CPU安装Win7教程 BIOS设置 U盘启动 完美支持USB驱动
- 10高通骁龙8cx怎么样 高通骁龙8cx处理器详细介绍
常用系统
- 1笔记本系统Ghost Win8.1 (X64) 喜迎国庆 全新纯净版2021年10月(永久激活) 提供下载
- 2深度技术 GHOSTXPSP3 电脑城极速装机版 2021年3月 ISO镜像高速下载
- 3深度技术Ghost Win8.1 x32位 特别纯净版2020年9月(免激活) ISO镜像高速下载
- 4雨林木风Ghost Win8.1 64位 纯净正式版下载 2018年8月免激活)
- 5电脑公司Ghost Win8.1 X64位 元旦特别 纯净版2020年1月(自动激活) ISO镜像快速下载
- 6深度技术Ghost Win8.1 x32位 特别纯净版2021年3月(免激活) ISO镜像高速下载
- 7电脑公司 装机专用系统Windows10 x64 企业装机版 版本1507 2021年9月(64位) ISO镜像高速下载
- 8深度技术Ghost Win7 Sp1 电脑城万能装机版2021年11月(32位) ISO高速下载
- 9番茄花园Ghost Win8.1 (X32) 六一节 纯净版2020年6月(免激活) ISO镜像免费下载
- 10笔记本系统Ghost Win8.1 (X64) 六一节 全新纯净版2021年6月(永久激活) 提供下载