文件监控(教学版)

简介: <p>参考FileSpy写的文件监控程序,但比它的抽象多了。可能瑞星的文件驱动也是这样写的,否则它为什么老阻止我安装驱动呢。测试程序是一个命令行小程序,负责打开设备,开启监控和关闭监控,运行时开启和关闭两次。</p> <p> </p> <p>在DebugView中查看输出信息,我只是想看看能不能达到目的,所以信息量很少。</p> <p> </p> <p>在驱动程序中开启和关闭监控的

参考FileSpy写的文件监控程序,但比它的抽象多了。可能瑞星的文件驱动也是这样写的,否则它为什么老阻止我安装驱动呢。测试程序是一个命令行小程序,负责打开设备,开启监控和关闭监控,运行时开启和关闭两次。

 

在DebugView中查看输出信息,我只是想看看能不能达到目的,所以信息量很少。

 

在驱动程序中开启和关闭监控的代码:

 

VOID AttachedToDeviceByName (__in PWSTR DeviceName, __in BOOLEAN attach)

{

  UCHAR tmp_buf1[50];

  UNICODE_STRING volumeName;

  NTSTATUS status;

  OBJECT_ATTRIBUTES objectAttributes;

  IO_STATUS_BLOCK openStatus;

  HANDLE fileHandle;

  PDEVICE_OBJECT volume_obj, fs_obj, spy_obj;

  PFILESPY_DEVICE_EXTENSION devExt;

  ULONG i;

  LARGE_INTEGER interval;

  PDEVICE_OBJECT current_obj, next_obj;

  PAGED_CODE();

 

  //应用程序传过来的盘符

  RtlInitEmptyUnicodeString(&volumeName, (PWSTR)tmp_buf1, sizeof(tmp_buf1));

  RtlAppendUnicodeToString(&volumeName, L"\\DosDevices\\");

  status = RtlAppendUnicodeToString(&volumeName, DeviceName);

 

  InitializeObjectAttributes( &objectAttributes,

                &volumeName,

                OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,

                NULL,

                NULL );

  status = ZwCreateFile( &fileHandle,

               SYNCHRONIZE|FILE_READ_DATA,

               &objectAttributes,

               &openStatus,

               NULL,

               0,

               FILE_SHARE_READ|FILE_SHARE_WRITE,

               FILE_OPEN,

               FILE_SYNCHRONOUS_IO_NONALERT,

               NULL,

               0 );

  status = ObReferenceObjectByHandle( fileHandle,

                    FILE_READ_DATA,

                    *IoFileObjectType,

                    KernelMode,

                    &volume_obj,

                    NULL );

  fs_obj = IoGetBaseFileSystemDeviceObject( volume_obj );

  ObReferenceObject( fs_obj );

 

  if(attach)

  {    

    ObDereferenceObject( volume_obj );

    ZwClose( fileHandle );

 

    status = IoCreateDevice( gFileSpyDriverObject,

                sizeof( FILESPY_DEVICE_EXTENSION ),

                NULL,

                fs_obj->DeviceType,

                0,

                FALSE,

                &spy_obj );

 

    devExt = spy_obj->DeviceExtension;

    devExt->AttachedToDeviceObject = NULL;

 

    ASSERT( IS_FILESPY_DEVICE_OBJECT( spy_obj ) );

 

    SetFlag( spy_obj->Flags, FlagOn( fs_obj->Flags, (DO_BUFFERED_IO | DO_DIRECT_IO | DO_SUPPORTS_TRANSACTIONS)));

    SetFlag( spy_obj->Characteristics, FlagOn( fs_obj->Characteristics, (FILE_DEVICE_SECURE_OPEN) ));

 

    for (i=0; i < 8; i++)

    {

      status = IoAttachDeviceToDeviceStackSafe( spy_obj, fs_obj, &devExt->AttachedToDeviceObject );

      if (NT_SUCCESS(status) )

      {

        break;

      }

      interval.QuadPart = (500 * DELAY_ONE_MILLISECOND);

      KeDelayExecutionThread( KernelMode, FALSE, &interval );

    }

 

    ClearFlag(spy_obj->Flags, DO_DEVICE_INITIALIZING);

    ObDereferenceObject( fs_obj );

  }

  else

  {

    current_obj = IoGetAttachedDeviceReference( fs_obj );

 

    while (NULL != current_obj)

    {

      if (IS_FILESPY_DEVICE_OBJECT( current_obj ))

      {

        spy_obj = current_obj;

        break;

      }

      next_obj = IoGetLowerDeviceObject( current_obj );

      ObDereferenceObject( current_obj );

      current_obj = next_obj;

    }

 

    ObDereferenceObject( volume_obj );

    ZwClose( fileHandle );

 

    devExt = spy_obj->DeviceExtension;

    IoDetachDevice( devExt->AttachedToDeviceObject );

 

    IoDeleteDevice( spy_obj );

    ObDereferenceObject( spy_obj );

    ObDereferenceObject( spy_obj );

    ObDereferenceObject( spy_obj );

 

    interval.QuadPart = (5 * DELAY_ONE_SECOND); //等5秒

    KeDelayExecutionThread( KernelMode, FALSE, &interval );

    ObDereferenceObject( fs_obj );

  }  

}

写的时候遇到一个有趣的问题是,驱动安装卸载一次,然后再安装,应用程序就不能访问它了,GetError()提示说系统找不到指定的文件。原来是卸载的时候没有卸干净,所以第二次不能用,程序中有相连的三句话“ObDereferenceObject( spy_obj);”正是我担心spy_obj不释放才出此下策。

相关文章
|
8月前
|
监控 安全 Shell
防止员工泄密的措施:在Linux环境下使用Bash脚本实现日志监控
在Linux环境下,为防止员工泄密,本文提出使用Bash脚本进行日志监控。脚本会定期检查系统日志文件,搜索敏感关键词(如&quot;password&quot;、&quot;confidential&quot;、&quot;secret&quot;),并将匹配项记录到临时日志文件。当检测到可疑活动时,脚本通过curl自动将数据POST到公司内部网站进行分析处理,增强信息安全防护。
199 0
|
6月前
|
监控 Linux 测试技术
【实战技巧】使用inotify实现实时文件监控
`inotify`是Linux内核提供的文件系统监控机制,用于实时捕获文件和目录的创建、删除、移动和修改等事件。通过`inotify_init`初始化,`inotify_add_watch`添加监视点,如`. IN_ACCESS`, `. IN_MODIFY`等,及`inotify_rm_watch`移除监视。示例代码展示了监听指定路径下文件修改事件,当事件发生时打印信息。使用`inotify`能高效地构建实时应用,如文件同步和日志监控,简化系统编程。
1232 16
|
监控 C#
C#编程-123:文件监控之FileSystemWatcher控件
C#编程-123:文件监控之FileSystemWatcher控件
138 0
C#编程-123:文件监控之FileSystemWatcher控件
|
监控 安全 API
使用UnhookMe分析恶意软件中未受监控的系统调用问题
关于UnhookMe UnhookMe是一款通用的Windows API动态解析工具,可以帮助广大研究人员分析和处理恶意软件中未受监控的系统调用问题。 在这个侵入式反病毒产品和EDR产品盛行的年代,很多网络攻击者必须拥有强大的工具来绕过这些安全防御工具。而动态导入解析器能够在运行中取消已用函数的钩子,这也是增强攻击者攻击能力的又一方法。 而UnhookMe可以帮助广大研究人员在编译的可执行文件的PE头中保持可视性。
199 0
|
监控 测试技术 网络安全
WMI监控碰到错误号53的问题定位
Spotlight On Oracle这款监控工具可以用来监控Windows操作系统,监控的原理是通过WMI远程访问协议,有时候监控会出现连接报错,比如报"错误号53,找不到网络路径”,或者是报别的错误,只要我们遵循以下的分析思路就能找到问题的根源
1711 0
|
安全 .NET PHP
如何解决您的虚拟主机中有文件触发了安全防护报警规则,可能存在webshell网页木马
早上刚上班就有新客户咨询我们Sinesafe安全公司反映说收到一条阿里云的短信过来,内容为:网站木马文件提醒018-06-20 09:20:49尊敬的***网:您的虚拟主机中有文件触发了安全防护报警规则,可能存在webshell网页木马,您可以登录虚拟主机控制台-对应主机的"管理"文件管理-网站木马查杀功能确认是否为恶意文件,相关帮助文档请参考网站木马查杀帮助。
2503 0

热门文章

最新文章