目的
实现一个类似 PCHunter 中的一个功能:
代码
功能参考:https://write-bug.com/article/2503.html
其余参考:https://blog.csdn.net/Simon798/article/details/103308039
// 获取 Operations 偏移
LONG GetOperationsOffset(){
// 初始化
RTL_OSVERSIONINFOW osInfo = { 0 };
LONG lOperationsOffset = 0;
// 获取系统版本信息
RtlGetVersion(&osInfo);
// 判断系统给版本
if (6 == osInfo.dwMajorVersion){
// Win7
if (1 == osInfo.dwMinorVersion){
#ifdef _WIN64
// 64 位
lOperationsOffset = 0x188;
#else
// 32 位
lOperationsOffset = 0xCC;
#endif
}
// Win8
else if (2 == osInfo.dwMinorVersion){
#ifdef _WIN64
// 64 位
#else
// 32 位
#endif
}
// Win8.1
else if (3 == osInfo.dwMinorVersion){
#ifdef _WIN64
// 64 位
lOperationsOffset = 0x198;
#else
// 32 位
lOperationsOffset = 0xD4;
#endif
}
}
// Win10
else if (10 == osInfo.dwMajorVersion){
#ifdef _WIN64
// 64 位
lOperationsOffset = 0x1A8;
#else
// 32 位
lOperationsOffset = 0xE4;
#endif
}
return lOperationsOffset;
}
// 遍历 MiniFilter
NTSTATUS EnumMiniFilter() {
// 定义返回值
NTSTATUS status;
// 获取 Minifilter 数量
ULONG ul_fliterList_size = 0;
FltEnumerateFilters(NULL, 0, &ul_fliterList_size);
// 申请内存
PFLT_FILTER* pp_fliterList = NULL;
pp_fliterList = (PFLT_FILTER*)ExAllocatePoolWithTag(
NonPagedPool, // 非分页内存
ul_fliterList_size * sizeof(PFLT_FILTER), // 分配的字节数
'T_1' // 内存空间标识
);
if (pp_fliterList == NULL){
DbgPrint("ExAllocatePoolWithTag error:%X", STATUS_INSUFFICIENT_RESOURCES);
return STATUS_INSUFFICIENT_RESOURCES;
}
// 获取 Minifilter 中所有 Filter 的信息
status = FltEnumerateFilters(
pp_fliterList, // 接受 PFLT_FILTER 数组
ul_fliterList_size, // 数组长度
&ul_fliterList_size // 接收实际数组长度
);
if (!NT_SUCCESS(status)){
DbgPrint("FltEnumerateFilters error:%X", status);
return status;
}
DbgPrint("ul_fliterList_size = %d", ul_fliterList_size);
// 遍历 Minifilter
PFLT_OPERATION_REGISTRATION p_FOR = NULL;
for (ULONG i = 0; i < ul_fliterList_size; i++) {
// 获取 PFLT_FILTER 中 Operations 成员地址
p_FOR = (PFLT_OPERATION_REGISTRATION)(*(PVOID*)((UCHAR*)pp_fliterList[i] + GetOperationsOffset()));
// 遍历回调函数
while (p_FOR->MajorFunction != IRP_MJ_OPERATION_END) {
// 打印
DbgPrint("[Filter = %p]IRP = %d, PreFunc = 0x%p, PostFunc = 0x%p",
pp_fliterList[i],
p_FOR->MajorFunction,
p_FOR->PreOperation,
p_FOR->PostOperation
);
// 获取下一个消息回调信息
p_FOR = (PFLT_OPERATION_REGISTRATION)((UCHAR*)p_FOR + sizeof(FLT_OPERATION_REGISTRATION));
}
}
// 释放内存
ExFreePool(pp_fliterList);
return STATUS_SUCCESS;
}