我需要开发一个监视并可能过滤(拒绝调用)文件操作的应用程序。
开发微过滤器似乎是“标准”解决方案。 另一种可能的方法是使用API钩子。
这些是相关的解决方案吗? (我在某些地方读过API挂钩可能不合适 - 但没有给出解释)
还有其他选择吗?
答案 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,您可以从中汲取灵感,并学习如何以正确和支持的方式实现您的驱动程序。 最后,更重要的是认为你可以通过挂钩技术来阻止你想要的一切,这是虚幻的,我将只给你一个例子:映射文件。 这是一个涉及记事本的场景,它使用映射文件将其数据写入磁盘。
这是钩子所缺少的。这只是一个场景。他们有很多,所以请以正确的方式做事。 如果你使用微型过滤器会如何改变? 您当然也会捕获CreateFile,CreateFileMapping(检查FltAcquireForSectionSynchronization回调),然后从minifilter中您将看到来自Write dispatch回调的所有PAGING_WRITE来自内存管理器(请参阅IoGetTopLevelIrp())。
祝你好运。