minifilter vs. API挂钩文件系统操作监控\过滤

时间:2011-09-16 19:22:04

标签: winapi driver api-hook minifilter

我需要开发一个监视并可能过滤(拒绝调用)文件操作的应用程序。

开发微过滤器似乎是“标准”解决方案。 另一种可能的方法是使用API​​钩子。

这些是相关的解决方案吗? (我在某些地方读过API挂钩可能不合适 - 但没有给出解释)

还有其他选择吗?

6 个答案:

答案 0 :(得分:4)

微软软件基本上不支持API挂钩(至少在内核空间中)。在x64上(从Vista及以上开始),如果检测到SSDT挂钩或系统关键组件发生任何变化,则patchguard通常会终止该计算机。 API挂钩非常难以在系统范围内进行,因为Windows使用的同步原语不会被导出,因此即使您设法挂钩代码,也不能保证机器不会因为EIP的时髦值而崩溃在给定时刻(当您卸载已挂钩函数的驱动程序时,这尤其有效。)

可能你最好的选择 - 不使用minifilter驱动程序就是尝试和内存内核对象挂钩。您可能希望查看OBJECT_TYPE_INITIALIZER definition结构,其中每个对象窗口都有(FILE,EVENT,PORT等 - 谷歌可以看到它们)作为其成员。您对* Procedure函数指针特别感兴趣。

答案 1 :(得分:1)

这一切都取决于你想要/需要完成的事情。

如果你只需要文件操作(在内核级别,文件打开/文件关闭),你需要它在系统范围内,而不是我用minifilter。这是一条漫长,乏味且耗时的道路,但更安全(查看Sysinternals procmon,看看你能用这种方法得到什么)。

如果您需要更多特定于应用程序的控件,或者您希望控制WINAPI级别,请使用API​​挂钩。开发起来比较容易,但是在路上有很多“地雷”在你的脸上爆炸(看看EasyHook,它做得很少,工作量很少)。

祝你好运!

答案 2 :(得分:1)

如果从安全角度阻止用户访问某些资源(文件),则正确的方法是minifilter。这是因为这是您确定用户无法访问已过滤资源的唯一方法。

如果您使用API​​挂钩,您可以拦截kernel32.dll(CreateFileW,FindFirstFile等等)的调用,但攻击者可以使用Native API(ntdll.dl)。当然,您可以在Native级别进行拦截(由于它没有记录,因此更加困难)但攻击者可以在内核交换机级别使用不同的API。在那个级别,钩子不便携。阻止创意攻击者使用API​​钩子访问资源几乎是不可能的,这就是为什么它不推荐用于安全软件。

在我看来,API挂钩是监控的一个很好的选择。如果你想看看应用程序在做什么,那么使用API​​钩子是非常好的,因为你可以拦截更高级别的函数而不是内核模式。

答案 3 :(得分:0)

如果你可以在没有钩子的情况下完成任务 - 那就去做吧。因为挂钩不是开发应用程序的支持方式。有很多陷阱,防病毒软件会将您的应用程序视为更危险。此外,您可能会遇到新版/旧版操作系统的问题。

但是考虑到用户模式代码比内核模式容易得多。因此,如果用户模式挂钩可以满足您的要求,那么您可以考虑它们。

答案 4 :(得分:0)

我通过邮件得到了一个跟进问题,所以我在这里添加了我们使用的解决方案

该项目在它没有生效之前被取消了,但我们评估了一个允许使用用户空间代码编写内核过滤器的产品(Eldos CallbackFilter)。

该产品具有通用内核驱动程序,可与定义过滤逻辑的用户空间代码进行通信。

答案 5 :(得分:-1)

我必须与 LordDoskias 相矛盾,因为 OBJECT_TYPE_INITIALIZER 不是一个记录在案的对象,而且这可以,有,并且会随着操作系统补丁和更新而改变。 不要解决这个问题,因为它只会导致更多问题而不能解决任何问题。 如果你修改系统结构,更不用说将 BSOD 系统的补丁防护。 如果您想限制对文件的访问,那么除了简单地使用微过滤器之外没有任何办法。有几个Microsoft示例here,您可以从中汲取灵感,并学习如何以正确和支持的方式实现您的驱动程序。 最后,更重要的是认为你可以通过挂钩技术来阻止你想要的一切,这是虚幻的,我将只给你一个例子:映射文件。 这是一个涉及记事本的场景,它使用映射文件将其数据写入磁盘。

  1. CreateFile - >获取文件句柄 - >你看这个
  2. CreateFileMapping - >获得映射句柄 - > 你没看到这个
  3. CloseHandle(FileHandle) - >你看这个
  4. MapViewOfFile返回由文件页面支持的内存缓冲区 - > 你没看到这个
  5. 修改内存缓冲区 - > 你没看到这个
  6. 取消映射并关闭FileMappingHandle - > 你没看到这个
  7. 异步内存管理器的系统工作线程对文件进行分页写入以使其保持同步。即使在所有句柄都已关闭或缓冲区内存更改期间,取决于操作系统是否需要。 - > 你没看到这个
  8. 这是钩子所缺少的。这只是一个场景。他们有很多,所以请以正确的方式做事。 如果你使用微型过滤器会如何改变? 您当然也会捕获CreateFile,CreateFileMapping(检查FltAcquireForSectionSynchronization回调),然后从minifilter中您将看到来自Write dispatch回调的所有PAGING_WRITE来自内存管理器(请参阅IoGetTopLevelIrp())。

    祝你好运。