Delphi - 如何检测防病毒软件的存在?

Posted

技术标签:

【中文标题】Delphi - 如何检测防病毒软件的存在?【英文标题】:Delphi - How can I detect presence of Anti-Virus Software? 【发布时间】:2010-08-27 20:37:39 【问题描述】:

在安装我的软件期间运行防病毒软件时,某些组件未正确安装。我总是告诉用户先把它关掉。但是,他们忘记了,然后我绞尽脑汁想弄清楚哪里出了问题。是否有任何人都知道的 Delphi 功能可以检测 AntiVirus 软件是否正在运行,以便在安装开始之前提醒用户?

【问题讨论】:

有趣的问题——你在写什么样的软件? 如果这是一个反复出现的问题,我会说问题可能是您的安装程序。请注意,由于 Delphi 在创建不需要臃肿运行时的独立 exe 方面非常出色,因此其中编写了许多 virii 和恶意软件。因此,防病毒软件经常会识别出在其他德尔福程序中也发现的病毒的某些部分。简单地关闭你的杀毒软件是没有用的——它只会在重新打开时干扰。 @GrandmasterB: ...delphi 不依赖臃肿的运行时,而是生成超级臃肿的单个可执行文件——这当然比单个大型运行时和微小的单个可执行文件要棒得多。 @snemarch:不像你想象的那么臃肿。 Delphi 的智能链接器能够删除运行时库中可执行文件不需要的部分,从而减小它们的大小。 snemarch:与流行的观点相反,单独的运行时并没有节省那么多,通常是因为主二进制文件中也添加了小的存根、版本控制和解析代码。您通常需要的不仅仅是一堆二进制文件才能达到收支平衡(因为您也需要在运行时补偿未使用的代码),并且除了操作系统的二进制文件和一些非常大的套件之外,通常没有那么多二进制文件在系统上,因为运行时库也是版本化的。 【参考方案1】:

从 XPsp2 开始,如果存在已知的防病毒软件,安全中心就会进行注册。

Afaik 这个函数通过 WMI api 实现,可以通过 Winapi 访问。 (绝地有它的标题)。

我在这里找到了一些 VBScript:http://blogs.msdn.com/b/alejacma/archive/2008/05/12/how-to-get-antivirus-information-with-wmi-vbscript.aspx

另一个提示:尝试以任何可能的方式与您的用户交流,以尽可能关闭启发式扫描。这些通常是误报的原因,而且它可能比一起杀死防病毒软件更容易传达。

【讨论】:

确保您阅读了 cmets,因为从 Vista SP1 开始,那段代码将无法正常工作 - 他们删除了您需要的命名空间。 cmets 中也有替代品。没有一个是漂亮的,但整个情况都不是。 (正如我已经说过的,安装和“开启”也是不同的东西) 我必须公开承认我投了反对票。让用户减少他们的防病毒软件提供的保护量是一个可怕的想法。请记住:100 个误报仍然比一个误报要好,而且通常启发式方法很好 启发式方法主要是为了给消费者一种防病毒软件有效并且他们花钱正确的感觉。安全价值值得怀疑,用户将基于签名和启发式的真实混为一谈的风险。许多企业版没有或仅启用了最安全的启发式算法【参考方案2】:

我刚刚在我的博客上写了一篇文章,告诉你如何在 Windows 桌面版(XP、Vista 和 7)中检测防病毒软件的存在。

Getting the installed Antivirus, AntiSpyware and Firewall software using Delphi and the WMI

【讨论】:

【参考方案3】:

某些组件没有正确安装

说明您正在安装哪些组件、您是如何安装这些组件的,以及它们的安装是如何失败的,这样会更容易推荐解决方案。另外,您使用的是安装程序产品,还是您自己的安装代码?如果是您自己的安装程序,或者您可以在安装程序后自动运行您自己的代码,您可以进行自己的程序检查以确认您的安装 100% OK,如果不是,则报告失败并提醒用户关闭杀毒软件东西并重试安装。

【讨论】:

【参考方案4】:

我看到这是一个“老”问题,但是... 我找到了 Retreive Antivirus Information using WMI

【讨论】:

虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。【参考方案5】:

通过检查我们事先确定为 AV 程序的任何进程的运行进程,我们取得了成功。 (您可以使用一些简单的代码枚举进程列表,您可以通过谷歌搜索 List Running Processes Delphi 找到这些代码)

如果我们找到了,我们会告诉用户并拒绝继续...

为了构建我们知道是 AV 的进程列表,我们安装 AV 程序的试用版,然后查看进程列表(在任务管理器中或使用我们的枚举进程代码)。这并不难发现它们...然后您可以关闭 AV 程序并查看您识别的进程是否消失。 (进程资源管理器很有帮助:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)

例如,我们目前寻找的一些进程包括 MCShield (McCaffe)、NPROTECT (Norton)、PCCNTMON (Trend Micro) 等。

显然,这不会捕获所有的 AV 程序,但如果您与主要供应商(Norton、McCaffe、Trend Micro、ZA 等)进行上述操作,您将拥有该领域的大部分 AV 程序覆盖。

这样做的好处是它很容易实现并且不需要任何非常低级的 Windows API 调用,除了枚举当前正在运行的进程...

【讨论】:

非常脆弱 - 你最好总是显示启动画面(不像看起来像 EULA 或其他什么)告诉运行防病毒软件的用户在安装过程中可能会出现问题。

以上是关于Delphi - 如何检测防病毒软件的存在?的主要内容,如果未能解决你的问题,请参考以下文章

如何针对流行的病毒扫描程序测试我的应用程序?

Delphi 7 中的病毒

使用 C# 在 Windows 上检测防病毒软件 [关闭]

前端防病毒扫描文件上传

检测并卸载防病毒软件

检测请求是不是来自防病毒软件