邪恶八进制信息安全团队技术讨论组's Archiver

sunwear 2006-9-1 02:24

[转载]挂接 FSR 监视新增卷

文章作者:sinister
信息来源:[url]http://www.whitecell.org[/url]

Author:  sinister
Email:  [email]sinister@whitecell.org[/email]
Homepage:[url]http://www.whitecell.org[/url]
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 主页:[url]http://www.whitecell.org/[/url]
WSS 论坛:[url]http://www.whitecell.org/forums/[/url]

页: [1]
© 1999-2008 EvilOctal Security Team