最近研究驱动略有所得,记录下来供参考。本代码通过内核态回调函数和文件系统过滤驱动实现禁止某程序的功能(例子中是拒绝访问WINOBJ.EXE)。主要运行环境是Windows XP,由于Windows7后一些回调函数名字和结构有变化,所以驱动通用性不强。
1)微文件系统过滤的注册
DriverEntry函数中,通过FltRegisterFilter注册一个微过滤器;另一个是用FltStartFiltering开始过滤。FltRegisterFilter函数通过输入驱动对象和注册信息的结构返回微过滤器句柄,而FltStartFiltering函数实现开启过滤功能
NTSTATUS
DriverEntry (
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
PSECURITY_DESCRIPTOR sd;
OBJECT_ATTRIBUTES oa;
UNICODE_STRING uniString;
UNREFERENCED_PARAMETER( RegistryPath );
//向过滤管理器注册一个过滤器
status = FltRegisterFilter( DriverObject,
&FilterRegistration,
&gFilterHandle );
ASSERT( NT_SUCCESS( status ) );
//开启过滤行为
if (NT_SUCCESS( status )) {
status = FltStartFiltering( gFilterHandle );
//如果开启失败,取消注册
if (!NT_SUCCESS( status )) {
FltUnregisterFilter( gFilterHandle );
}
}
status=FltBuildDefaultSecurityDescriptor(&sd,FLT_PORT_ALL_ACCESS);
RtlInitUnicodeString( &uniString, MINISPY_PORT_NAME );
InitializeObjectAttributes( &oa,
&uniString,
OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,
NULL,
sd );
FltFreeSecurityDescriptor( sd );
return status;
}
2)微过滤器数据结构