【问题标题】:How does a Windows antivirus hook into the file access process?Windows 防病毒软件如何与文件访问过程挂钩?
【发布时间】:2012-06-20 21:14:05
【问题描述】:

主题说明了一切。普通的防病毒软件必须拦截所有文件访问,扫描文件,然后选择性地拒绝对文件的访问(甚至可能向用户显示提示)。如何做到这一点?

我知道一种称为 API 挂钩的方法,但这是一种非常肮脏的无证 hack,因此并不可靠。这样做的“官方”方式是什么?

另外,我有兴趣拦截可执行模块(.DLL、.EXE 等)的加载,而不仅仅是任意文件读取。

【问题讨论】:

  • 这取决于正在运行的 Windows 版本。你会发现他们做了很多不受支持的事情,尤其是在旧版本的 Windows 上。我相信较新的版本有一个 API ......但我不熟悉它,所以我会让其他人回答。
  • “病毒”和“防病毒”之间只有一线之隔。为了完成他们的工作,他们做了很多同样肮脏的伎俩。
  • 以前从未在 Anivirus 软件上工作过,但我认为它们被实现为 File System Filter Driver
  • 顺便提一下,防病毒软件使用的技术与编写软件的那些片段所利用的技术几乎相同。
  • @MareInfinitus 谢谢,没有发现防病毒标签

标签: windows antivirus


【解决方案1】:

通过File System Filter Drivers。然而,实现这样的驱动程序是相当复杂和“脆弱的”。

【讨论】:

    【解决方案2】:

    在最近的 Windows 版本中(至少从 XP 开始)有一个概念“过滤器”,可以使用 MS 过滤器管理器查看,(命令提示符下的 fltmc.exe)

    这提供了一个低级 I/O 挂钩,AV 程序可以访问并自动注册以将所有 I/O 请求传递给文件系统。这是一个工具包,您可以获取驱动程序以开发您自己的过滤器。

    http://www.microsoft.com/whdc/driver/filterdrv/default.mspx 是获取深度信息的起点。

    【讨论】:

    • windows中是否有其他过滤驱动api实现(网络和文件系统除外)?
    【解决方案3】:

    正如您已经指出的,挂钩是具有“实时”保护功能的现成 AV 软件的关键。

    你可以看看(广泛讨论的)winpooch,它已经做了 API Hooking, 但该软件存在一些重大缺陷。 Sourceforge of Winpooch

    Codeproject 上也有一篇关于 API hooking 的文章,提供了一些库 做“三层”挂钩。 DLL注入有点难,你可以 图片。 CodeProject: EasyHook, reinvention of API Hooking

    由于您可能对防病毒策略感兴趣,我也建议您拥有 看看 ClamAV 或 WinClam,它是开源的(在 GPL 下)ClamAV for windows

    但我不知道如何使用 C# 进行 API 挂钩,我不得不承认。 在 C / C++ 中,这(相当)容易......

    添加 您可能对 FileMon 的来源感兴趣,这是一个广为人知的 FileSystem Monitor,曾经由 SysInternals 出品,现在由 Microsoft 出品: 它使用了微软的 Driver-Filter API,它至少被称为脆弱的。

    Link may be found here in Sysinternals forum

    【讨论】:

    • 善意回复:FileMon。具有讽刺意味的是,我使用它,但甚至没有想到它。我正在阅读您的其他链接
    【解决方案4】:

    您可以从 microsoft 阅读有关 the detours library 的信息并免费试用 - 它允许您在 c# 中编写用户模式挂钩。无需您了解驱动程序:]

    但是 - 对于内核模式挂钩 - 您需要了解 c 并使用 DDK - 至少 afaik :[

    而且大多数现代防病毒软件会拦截很多调用——注册表 API、线程和进程 API 等——而不仅仅是文件系统 API。再次 - afaik。

    编辑:还有一些开源 rootkit - 用谷歌搜索它们,看看它们是如何执行钩子的,我想这会很有教育意义。

    【讨论】:

    • 感谢 detours 库的信息 - 我现在正在阅读,并提出了很好的建议:rootkits
    • "DDK" - 我假设是驱动程序开发工具包?我在谷歌上看不到任何东西(但我确实找到了 WDK - Windows Driver Kit)
    • 糟糕——我的错。它曾经是很久以前的DDK。你是对的 - 它是 Windows 驱动程序包。
    • 最后,detours 库看起来是执行此操作的最强大和最可靠的方法 - 特别是因为它是由 MS 支持的。我确实喜欢@MareInfinitus 的 EasyHook 的外观,但它非常明确地说明了为什么它不能在 x64 上运行
    • 商业用途时,Detours 是相当昂贵的。
    【解决方案5】:

    使用filesystem filter driver 监控文件访问,它在内核模式下工作。过滤器驱动程序不仅可以收到有关文件系统操作的通知,还可以更改通过过滤器传递的数据或拒绝文件系统请求。

    您可以自己创建微过滤器,但内核模式代码的维护和支持并非易事,尤其是在没有内核模式开发经验的情况下。问题之一是各种过滤器之间的冲突。

    我们公司提供CallbackFilter 产品,它提供了一个现成的驱动程序,让您可以在用户模式下编写与过滤相关的业务逻辑。

    【讨论】:

      【解决方案6】:

      一般来说,这些产品拦截函数以获取进程的句柄,如 OpenProcess 或 NtOpenProcess。它们还在远程进程中挂钩 CreateRemoteThread 函数和内存分配:VirtualAlloc 和 VirtualProcect。 一些 AV 还挂钩 SetWindowsHookEx 函数来检测全局挂钩以避免键盘记录器。

      挂钩这些 API,他们可以控制哪些模块(或 dll)可以访问远程进程,并且只允许用户知道他们在做什么的那些。

      您可以使用 HookShark 查看每个 AV 产品拦截了哪些用户模式功能。

      要制作自己的用户挂钩,您可以使用 detours 库,但您必须开发一个代理来运行您的进程内挂钩,然后与代理服务器通信。 您还可以使用Deviare API Hook,它是一个框架,可以让所有复杂的人员组成,因此您可以使用任何编程语言在自己的流程中编写您的钩子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多