文章作者:sinister
信息来源:
http://www.whitecell.org
Author: sinister
Email:
sinister@whitecell.org
Homepage:
http://www.whitecell.org
Date: 2006-05-03
//
// 驱动对象,用于恢复挂钩
//
PDRIVER_OBJECT g_FsrDriverObject = NULL;
//
// 驱动对象 IRP 例程,用于恢复挂钩
//
PDRIVER_DISPATCH g_pOldFileSystemControl = NULL;
/////////////////////////////////////////////////////////////////
// 函数类型 : 系统函数
// 函数模块 : 监控模块
/////////////////////////////////////////////////////////////////
// 功能 : 处理 IRP_MJ_FILE_SYSTEM_CONTROL 的 IRP_MN_MOUNT_VOLUME
// 与 IRP_MN_LOAD_FILE_SYSTEM 监视新增卷与装载文件系统,
// 并得到其盘符与驱动名
// 注意 :
/////////////////////////////////////////////////////////////////
// 作者 : sinister
// 发布版本 : 1.00.00
// 发布日期 : 2006.05.01
/////////////////////////////////////////////////////////////////
// 重 大 修 改 历 史
/////////////////////////////////////////////////////////////////
// 修改者 :
// 修改日期 :
// 修改内容 :
/////////////////////////////////////////////////////////////////
NTSTATUS
NewFsrFileSystemControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
PIO_STACK_LOCATION IoIrpStack;
PDEVICE_OBJECT MountDeviceObject;
UNICODE_STRING DosDeviceName;
NTSTATUS ntStatus;
IoIrpStack = IoGetCurrentIrpStackLocation( Irp );
FileObject = IoIrpStack->FileObject;
switch ( IoIrpStack->MinorFunction )
{
case IRP_MN_MOUNT_VOLUME:
//
// 从 VPB 中取得设备对象
//
if ( IoIrpStack->Parameters.MountVolume.Vpb &&
IoIrpStack->Parameters.MountVolume.Vpb->RealDevice )
{
MountDeviceObject = IoIrpStack->Parameters.MountVolume.Vpb->RealDevice;
}
if ( MountDeviceObject != NULL )
{
//
// 得到分配盘符
//
ntStatus = RtlVolumeDeviceToDosName( MountDeviceObject,
&DosDeviceName );
if ( ( ntStatus == STATUS_SUCCESS ) &&
( DosDeviceName.Buffer != NULL ) &&
( DosDeviceName.Length > 0 ) )
{
DbgPrint( "IRP_MN_MOUNT_VOLUME:%S\n", DosDeviceName.Buffer );
}
//
// 得到所属驱动名
//
if ( MountDeviceObject->DriverObject->DriverName.Buffer != NULL )
{
DbgPrint( "IRP_MN_MOUNT_VOLUME:%S\n",
MountDeviceObject->DriverObject->DriverName.Buffer );
}
}
else
{
DbgPrint( "IRP_MN_MOUNT_VOLUME: MountDeviceObject is NULL\n" );
}
break;
case IRP_MN_LOAD_FILE_SYSTEM:
//
// 可以在这里进一步监视装载文件系统,如果机器上存在两种不同文件
// 系统或更多,那么只有第一次访问时才会动态加载这个文件系统
//
DbgPrint( "IRP_MN_LOAD_FILE_SYSTEM\n" );
break;
}
return g_pOldFileSystemControl( DeviceObject, Irp );
}
/////////////////////////////////////////////////////////////////
// 函数类型 : 系统函数
// 函数模块 : 监控模块
/////////////////////////////////////////////////////////////////
// 功能 : 挂接 FSR 的 IRP_MJ_FILE_SYSTEM_CONTROL 监视新增卷与
// 装载文件系统
// 注意 : 本监控模块采用的是非 File System Filter Driver 形式,
// 使用挂接 FSR 方法可能更好更方便一些
/////////////////////////////////////////////////////////////////
// 作者 : sinister
// 发布版本 : 1.00.00
// 发布日期 : 2006.05.01
/////////////////////////////////////////////////////////////////
// 重 大 修 改 历 史
/////////////////////////////////////////////////////////////////
// 修改者 :
// 修改日期 :
// 修改内容 :
/////////////////////////////////////////////////////////////////
NTSTATUS
StartFSRMonitor( VOID )
{
UNICODE_STRING DriverName;
PDRIVER_OBJECT DriverObject = NULL;
RtlInitUnicodeString( &DriverName, L"\\FileSystem\\Fs_Rec" );
ObReferenceObjectByName( &DriverName,
OBJ_CASE_INSENSITIVE,
NULL,
0,
( POBJECT_TYPE ) IoDriverObjectType,
KernelMode,
NULL,
&DriverObject );
if ( DriverObject == NULL )
{
DbgPrint( "Get FSR to failed!\n" );
return STATUS_UNSUCCESSFUL;
}
DbgPrint( "FSR DriverObject:0x%x\n", DriverObject );
g_FsrDriverObject = DriverObject;
//
// 保存原始 IRP_MJ_FILE_SYSTEM_CONTROL 并挂钩
//
if ( g_FsrDriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] !=
NewFsrFileSystemControl )
{
g_pOldFileSystemControl = g_FsrDriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL];
g_FsrDriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = NewFsrFileSystemControl;
}
return STATUS_SUCCESS;
}
WSS(Whitecell Security Systems),一个非营利性民间技术组织,致力于各种系统安全技术的研究。坚持传统的hacker精神,追求技术的精纯。
WSS 主页:
http://www.whitecell.org/
WSS 论坛:
http://www.whitecell.org/forums/