Delphi程序被防病毒程序阻止

时间:2010-09-17 09:03:27

标签: delphi

我有一段代码试图在一秒钟内写入磁盘上的许多文件。但是,我已经安装了Kaspersky Anrivirus 2011,它失败了。

Stream:= TFileStream.Create(sName, fmCreate); 

该代码完全适用于卡巴斯基2010,如果我禁用其扫描仪(它不能完全从内存中卸载 - 除非它已卸载),它也适用于卡巴斯基2011。如果(Kaspersky 2011正在运行并且我懒散地写入磁盘),代码也可以工作。所以它显然不够快,无法处理我的磁盘请求。

我得到的错误是EFCreateError('无法创建xxx文件blablabla')。错误是随机的。大多数文件都写入磁盘。大约10%失败。

我曾试图获得支持但却无法在卡巴斯基找到真正的人与之交谈。他们所谓的“支持”实际上是一个FAQ数据库。当然,它讲的是如何安装产品和相关的东西。关于编程相关问题没有任何内容。有什么想法吗?

PS:这对整个Delphi社区都有影响!如果他们使用KIS 2011作为防病毒软件,我们所有客户都将无法使用Delphi软件。目前我建议我的用户禁用他们的防病毒软件,但我需要一个真正的解决方案。

如果有KIS 2011的人可以确认问题,那就太好了。只需创建一个小程序,使用TFileStream将200个小文件写入磁盘。

更新:

  • 仅当文件不存在且创建(创建而不是覆盖)时,问题才会出现。
  • 类似报道:https://forums.embarcadero.com/thread.jspa?threadID=32751&tstart=15
  • 类似报道:http://forum.kaspersky.com/index.php?showtopic=120561
  • 我想到的一个可能的解决方案是检测KIS是否正在运行,如果是,则在每次写入磁盘后都要延迟。或者在leat,让用户知道可能存在问题。有谁知道如何检测服务是否正在运行?
  • 我添加了650毫秒的延迟(在每个文件创建之后)并且错误仍然存​​在)。所以不是关于你写入磁盘的速度有多快,而是你写的文件数量。
  • 刚刚卸载KIS 2011.问题不再出现了。
  • 刚重新安装好的旧KIS 2010.该错误仍然存​​在,但很少出现(大约每300个文件,而不是KIS 2011中的大约30个文件)。
  • 问题已在另一台计算机上得到确认。
  • 新闻:崩溃出现在TFileStream.Create中,但它可能是由之前调用的函数引起的:TestWriteAccess。如果我禁用此功能,TFileStream.Create不会再失败。嗯,这不会改变太多事情。无论哪一行代码生成错误,程序仍然会(随机)在Kaspersky运行时将文件写入磁盘。
  • 还在等待卡巴斯基的真人的回复......
  • 从卡巴斯基支持部门收到更多自动回复(我在几个国家/地区发送了电子邮件支持)。所有人都指向FAQ数据库。
  • 我将我的状态从卡巴斯基的粉丝(和客户)改为卡巴斯基的仇恨者,因为我终于收到了来自卡巴斯基支持的真人的答案,这简直令人讨厌。

要测试代码,请尝试在循环中使用代码来创建1000个文件。该程序创建了一堆文件(随机数),然后在StreamFile:= TFileStream.Create失败。 更新:可以通过在创建每个文件后输入一个小延迟来解决此问题 https://docs.google.com/forms/d/1H3_O1z1iEqfh9ZT9u3B0R1tGEj-Hc9o7rAE0LKPr33Y

2013年更新

从今天下午开始(更新后)KIS与Delphi发生冲突。 每次编译项目时,KIS都会达到100%的CPU利用率。我将不得不卸载它。

2017年更新

从2017年开始,我所有的Delphi程序都会神奇地消失所有误报警。似乎卡巴斯基这样的程序就足以从其病毒列表中删除Delphi生成的可执行文件;所有其他较小的防病毒程序紧随其后。


Delphi 7,Win 7(32),KIS 2011

9 个答案:

答案 0 :(得分:10)

您需要告知您的用户,即卡巴斯基的客户,卡巴斯基正在干扰您的软件操作,并且他们应该报告它。表达您的挫败感,作为开发人员,您无法访问真正的人类。这是反恶意软件公司做出反应的唯一方式 - 与付费客户的公关不良。

答案 1 :(得分:4)

不是解决问题的答案,但你应该告知卡巴斯基,可能他们不知道有一个与Delphi库相关的病毒签名。

如果您的程序不是太复杂,您可能想尝试Lazarus / FPC。它不如Delphi好,但我已经使用它好几年了,并且在Windows / MacOS / Linux中取得了很好的效果。

答案 2 :(得分:3)

我在使用d2010的新 TFile.Copy()以及原始api功能时尝试将我的编程添加到Windows启动时遇到类似的卡巴斯基2011问题:

 CopyFile(PChar('C:\chellenger.exe'), PChar('C:\Documents and Settings\Omair\Start Menu\Programs\Startup\chellenger.exe'), False);

我的解决方案是将我的delphi应用程序作为资源放在vb.net应用程序中,vb.net应用程序将其解压缩并将其启动而不会出现误报。为您的问题混合使用两种语言也可以解决您的问题(1种可能的解决方案,但我承认这是一种非常丑陋且非专业的解决方案)

答案 3 :(得分:3)

卡巴斯基=海盗公司?可能是,可能不是。也许只是另一家公司产品不好而且不存在支持。他们的“支持”包括FAQ数据库和自动电子邮件应答程序。电话也挂在了电话答录机上。他们的自动回答一直在向我解释如何在KIS“异常”数据库中添加我的程序。我一直在回复那些我不能亲自去家里的所有客户发送的愚蠢电子邮件,并将我的程序放在“异常”数据库中,如果他们能解决这个问题会更好。

当我终于得到一个非自动的答案(唯一一个)时,支持家伙的家伙尽可能粗鲁。

Delphi程序员的可能解决方案:
*不要检查用户是否具有文件的写权限(为了不触发卡巴斯基错误)
*检查用户是否具有写入权限。如果出现错误,则通知用户Kaspersky会产生问题,并且应该是临时禁用(程序运行时)。使用TRY EXCEPT块执行此操作。

建议(根据我过去的经验):
如果您在程序尝试写入磁盘时收到来自用户的奇怪错误报告,请不要总是责怪您的代码。还要检查外部因素(如卡巴斯基 anti 病毒的存在)。

更新:
我刚申请退款。如果他们不退款,我会去退款(我强烈认为他们不会退款)。

<强>结论
当我在StackOverflow上发布这个时,我没有意识到问题的严重性,我没有意识到它会偏离初始路线。我仍然认为它完全符合StackOverflow的目的。我们都了解到,有时程序中的问题可能不是由我们的错误代码引起的,我们也无法控制这些问题的来源(21人投了这个问题 - 这意味着很多其他人遇到了KIS问题)。 我们可以希望很快就会修复设计不佳的程序,这些程序与用户系统的交互程度非常低(例如KIS防病毒程序),因此我们的销售不会受到太大影响。

当你的程序被标记为“buggy”并且你无法做很多事情时,这真是令人沮丧!

答案 4 :(得分:2)

创建文件时,任何防病毒软件都会对其进行检查。您的应用程序和KAV之间可能存在某种冲突。您是否尝试将fmCreate与共享模式结合使用。您可以在TFileStream.Create的帮助中查看可用模式。

答案 5 :(得分:1)

如果问题只出现在kapersky上,那么只需让程序检测它是否正在运行。如果是这样,缩小文件创建/写入任何通过其检测的通道。确保在某处有一些小的状态消息告诉用户为什么事情变慢。顺便提一下,病毒编写者已经知道这就是为什么这些启发式算法根本不起作用的原因。

完成此操作后,请联系Kapersky并直接与他们合作以解决问题。

这已经超出了您的直接问题,并且会让您和kapersky有时间找出长期解决方案。

或者,你可以简单地关闭kapersky ..只要确保你在这个过程中抓住他们所有的看门狗..但这往往会更加好斗。

答案 6 :(得分:0)

创建大量文件听起来像是一件不太好的事情,但你可能有理由:)

当您在Delphi中获得错误代码时,KAV会弹出任何启发式警告,还是完全无声?获得一个启发式的“omg,应用程序正在做坏事!”并不奇怪。从创建大量新文件,但如果KAV沉默,我会说这是一个错误。

你能用最少量的代码发布一个delphi可执行文件来重现这个bug吗?并且一个版本执行相同的步骤但只创建一个文件,使用SysInternals的ProcMon进行跟踪可能会很有趣。

答案 7 :(得分:0)

首先,您是否真的需要通过创建文件来测试写入权限?你不能直接检查许可吗?我觉得为此目的创建一个文件只是在任何情况下这样做的一种蹩脚方式。

其次,如上所述,在您创建并删除文件之后,卡巴斯基的安全机制可能会有一些干预。可能是驱动程序试图检查您删除的文件的内容,并使其保持活动状态一段时间。像这样:

  1. 您创建文件并打开它,递增引用计数。
  2. 卡巴斯基驱动程序注意到并打开文件。即使你设置共享模式deny,作为驱动程序它也可能有权打开它(如果卡巴斯基不能规避共享拒绝,任何病毒都可以使用相同的技巧隐藏其数据!)。
  3. 关闭文件并将其删除。删除文件时,系统只会将其标记为“FILE_FLAG_DELETE_ON_CLOSE”,但文件仍然存在,直到它的所有句柄都关闭。
  4. 卡巴斯基继续扫描文件,仍未释放句柄。
  5. 因此文件仍在那里。
  6. 您尝试创建新文件但调用失败,因为旧文件仍未删除。
  7. 所有这些混乱的原因当然是部分卡巴斯基的检查机制,但他们在这里没有做任何特别的错误。卡巴斯基无论如何都需要扫描文件,几乎没有任何事情可以做 - 它是防病毒软件,大声喊叫。另一方面,通过创建然后删除文件来检查权限(可能)是非常非常错误的。所以我想,你就是那个有问题的人。

答案 8 :(得分:0)

我遇到了同样的问题。 KIS犯了各种各样的麻烦。直到我重新安装它。所以,这只是一个错误的安装。