Ntstrsafe.h

kernel中使用字符串最好使用Ntstrsafe.h中的操作函数,各种操作已经被封装好,可以直接使用。

包括判断开头是否含字符串,复制字符串,大写字母等

文件的创建读写删除

文件路径必须用\\??\\的前缀

就是API:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

InitializeObjectAttributes(&obja,&filepath,OBJ_CASE_INSENSITIVE,NULL,NULL);//初始化文件对象
status = ZwDeleteFile(&obja);//删除对象

InitializeObjectAttributes(&obja,&sourcefilepath,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);//初始化文件对象
status = ZwOpenFile(&hfile,FILE_READ_DATA,&obja,&iostack1,FILE_SHAR_READ|FILE_SHAR_WRITE,FILE_SYNCHRONOUS_NONALERT);
status = ZwQueryInformationFile(&hfile,&iostack1,&fbi,sizeof(FILE_STANDARD_INFORMATION),FileStandInformation);
filebuffer = ExAllocatePool(NonPagedPool,fbi.EndOfFile.QuadPart);
RtlZeroMemory(filebuffer,fbi.EndOfFile.QuadPart);
LARGE_INTEGER readoffset = {};
status = ZwReadFile(hfile,NULL,NULL,NULL,&iostack,filebuffer,fbi.EndOfFile.QuadPart,&readoffset,NULL);//读取

InitializeObjectAttributes(&obja,&sourcefilepath,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);//初始化文件对象
status = ZwCreateFile(&hfile2,GENERIC_ALL,&obja2,&iostack2,NULL,FILE_SHARE_WRITE,FILE_SUPERSEDE,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);//创建文件

status = ZwWriteFile(hfile2,NULL,NULL,NULL,&iostack2,filebuffer,fbi.EndOfFile.QuadPart,&writeoffset,NULL);//写入文件

ExFreePool(filebuffer);
ZwClose(hfile2);//关闭文件句柄

MiniFilter

MiniFilter驱动是相对与SFilter来说的

通过过滤管理器介入,实现IRP过滤操作的驱动程序。它可以为一个IRP请求定义pre事件和post事件,并在处理IRP前后的过程中执行这两个自定义的函数。默认情况下,其会对所有被定义的操作执行,所以需要在回调中判断是否是自己需要的IRP请求,然后执行处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <fltKernel.h>

PFLT_FILTER gFilterHandle = NULL; // 全局过滤器句柄
// 回调函数集
CONST FLT_OPERATION_REGISTRATION Callbacks[] =
{
// 创建时触发 PreOperation(之前回调函数) / PostOperation(之后回调函数)
{ IRP_MJ_CREATE, 0, PreOperation, PostOperation },
// 读取时触发
{ IRP_MJ_READ, 0, PreOperation, PostOperation },
// 写入触发
{ IRP_MJ_WRITE, 0, PreOperation, PostOperation },
// 设置时触发
{ IRP_MJ_SET_INFORMATION, 0, PreOperation, PostOperation },
// 结束标志
{ IRP_MJ_OPERATION_END }
};
// 过滤驱动数据结构
CONST FLT_REGISTRATION FilterRegistration =
{
sizeof(FLT_REGISTRATION), // 结构大小(默认)
FLT_REGISTRATION_VERSION, // 结构版本(默认)
0, // 过滤器标志
NULL, // 上下文
Callbacks, // 注册回调函数集
Unload, // 驱动卸载函数
InstanceSetup, // 实例安装回调函数
InstanceQueryTeardown, // 实例销毁回调函数
InstanceTeardownStart, // 实例解除绑定时触发
InstanceTeardownComplete, // 实例解绑完成时触发
NULL, // GenerateFileName
NULL, // GenerateDestinationFileName
NULL // NormalizeNameComponent
};

NTSTATUS DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
) {
NTSTATUS status;

// 注册过滤器
status = FltRegisterFilter(
DriverObject, // 驱动对象
&FilterRegistration, // 注册信息结构体
&gFilterHandle // 返回的过滤器句柄
);

if (NT_SUCCESS(status)) {
// 启动过滤
status = FltStartFiltering(gFilterHandle);
if (!NT_SUCCESS(status)) {
FltUnregisterFilter(gFilterHandle); // 失败时卸载
}
}
return status;
}

VOID DriverUnload(_In_ PDRIVER_OBJECT DriverObject) {
FltUnregisterFilter(gFilterHandle); // 卸载过滤器
}
1