2011-09-16 37 views
1

我需要开发一个应用程序来监视和可能的过滤(拒绝调用)文件操作。微过滤器与API挂接文件系统操作监视过滤

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

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

还有其他选择吗?

回答

4

API钩子(至少在内核空间中)基本上不被微软支持。在x64上(从Vista开始),如果检测到SSDT挂钩或系统关键组件发生任何变化,patchguard通常会终止该机器。由于窗口使用的同步原语不会被导出,所以即使设法挂钩代码也不能保证机器不会因EIP的时髦值而崩溃,因此API挂钩在系统级别上很难获得在某个特定时刻(当你卸载一个已经挂钩函数的驱动程序时,这是特别有效的)。

也许你最好的选择 - 不使用minifilter驱动程序是尝试和直接记忆内核对象挂钩。您可能需要查看OBJECT_TYPE_INITIALIZER definition每个对象窗口所具有的结构(FILE,EVENT,PORT等 - 谷歌周围以查看它们)作为其成员。你对* Procedure函数指针特别感兴趣。

0

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

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

+0

Hot patch hooking * is *支持从Microsoft连接的方法,但仅用于运行时修补。 – Necrolis

+0

@Necrolis它是一种支持钩子的方法,但钩子不是开发应用程序的支持方式。 –

+0

哦,它支持应用程序开发,请参阅MSVC中的'/ HOTPATCH'标志(或高级的'/ FUNCTIONPADMIN'),另​​外,AV的确需要操作。但是,你会是对的,在这种情况下,它可能不是首选的开发方式。 – Necrolis

1

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

如果您只是需要文件操作(在内核级别,文件打开/文件关闭),并且您需要它在系统范围内比我使用微过滤器。这是一个漫长而乏味且耗时的道路,但更安全(请查看Sysinternals procmon,了解使用此方法可以获得什么结果)。

如果您需要更多特定于应用程序的控件,或者您想要控制WINAPI级别,请使用API​​挂钩。开发起来比较容易,但是在这个过程中会出现很多“地雷”(请查看EasyHook,它在做最小的工作时做得很好)。

祝你好运!

1

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

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

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

0

我邮寄一个跟进的问题,所以我在这里加入我们使用

它wen't生活之前该项目被取消的解决方案,但我们评估一个产品(Eldos CallbackFilter),允许编写内核使用用户空间代码过滤。

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

0

我将不得不违背LordDoskias如,OBJECT_TYPE_INITIALIZER不是文档对象,这可以了,已经和将操作系统补丁和更新改变。 不要接近这个问题,因为它只会导致更多的问题,而不是解决任何问题。 更不用说修补程序后卫,它将BSOD系统如果您修改系统结构。 如果您想要限制对文件的访问,则无法实现简单的使用微过滤器。有几个微软示例here,您可以从中吸取灵感并学习如何以正确和支持的方式实现您的驱动程序。 最后,更重要的是认为你可以通过钩住技术来阻止你想要的一切,这只是一种幻想,我只会给你一个例子:映射文件。 这是一个涉及记事本的场景,它使用映射文件将其数据写入磁盘。

  1. 的CreateFile - >获得的文件句柄 - >你看这
  2. 的CreateFileMapping - >获得映射手柄 - >你没有看到这个
  3. CloseHandle的(文件句柄) - >你看这个
  4. MapViewOfFile返回由文件支持的内存缓冲区正在浏览的页面 - >你没有看到这个
  5. 修改内存缓冲区 - >你没有看到这个
  6. 取消映射,并关闭FileMappingHandle - >你没有看到这个
  7. 异步内存管理器的系统工作者线程使分页写入到文件,以保持同步。即使在所有的句柄已经关闭之后,或者在缓冲区的内存中改变期间,取决于OS的需要。 - >你看不到这个

这就是你所缺少的挂钩。这只是一种情况。有很多,所以请以正确的方式做事。 如果您使用微过滤器,这将如何改变? 你当然会赶上的CreateFile,的CreateFileMapping以及(检查FltAcquireForSectionSynchronization回调),然后从微过滤器,你会看到所有的PAGING_WRITE从内存管理器来(见IoGetTopLevelIrp())在你写调度回调。

祝您好运。