【问题标题】:Delphi programs blocked by antivirus programs [closed]Delphi程序被防病毒程序阻止[关闭]
【发布时间】:2010-09-17 09:03:26
【问题描述】:

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

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

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

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

我曾尝试寻求支持,但无法在卡巴斯基找到真正的人与之交谈。他们所谓的“支持”实际上是一个常见问题解答数据库。当然,它谈到了如何安装产品和相关的东西。与编程相关的问题一无所获。有什么想法吗?

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 是否正在运行,如果是,则在每次写入磁盘后延迟。或者至少,让用户知道可能存在问题。有人知道如何检测服务是否正在运行吗?
  • 我添加了 650 毫秒的延迟(在每个文件创建之后),并且错误仍然存​​在)。因此,与写入磁盘的速度无关,而与写入的文件数量有关。
  • 刚刚卸载了 KIS 2011。问题不再出现。
  • 刚刚重新安装了良好的旧 KIS 2010。该错误仍然存​​在,但很少出现(大约每 300 个文件,而不是像 KIS 2011 中的大约 30 个文件)。
  • 问题已在第二台计算机上确认。
  • 新闻:崩溃出现在 TFileStream.Create 中,但它可能是由之前调用的函数引起的:TestWriteAccess。如果我禁用此功能,则 TFileStream.Create 不会再失败。嗯,这并没有改变太多。无论哪一行代码产生错误,在卡巴斯基运行时程序仍然无法(随机)将文件写入磁盘。
  • 仍在等待来自卡巴斯基的真人的回复...
  • 从卡巴斯基支持收到更多自动回复(我向多个国家/地区的支持发送了电子邮件)。都指向一个常见问题数据库。
  • 我将自己的状态从卡巴斯基粉丝(和客户)更改为卡巴斯基仇恨者,因为我终于收到了来自卡巴斯基支持的真人的答复,而且这简单而令人讨厌。

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

2013 年更新

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

2017 年更新

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


德尔福 7、Win 7 (32)、KIS 2011

【问题讨论】:

  • 问题:您是否有任何数据表明此问题是 Delphi 编写的应用程序特有的问题,而不是 KIS2011 的一般问题?
  • 也许这个问题不仅仅影响Delphi用户:你试过其他编程语言/编译器(C、C++、C#、Java)吗?一个几乎会影响每个软件开发人员的问题可能会得到更广泛的关注。您的问题也可以使用这些编译器的标签来提高可见性...
  • 对不起。我只有德尔福。但是,如果其他人可以编译一个创建 1000 个文本文件的小程序(每个文件中只放 100 个字节),我将在我的计算机上对其进行测试。但请使用类似于 TFileStream 的东西。
  • @Omair - “大多数人不会知道他们是误报,实际上会认为 KIS 在识别恶意软件方面做得很好” - 我完全同意你的看法!不过,我已经在所有防病毒程序中看到了它。他们不想纠正误报,因为这对他们的销售有好处!!!!!!我的申请多次被列为误报。
  • @altar 但好消息是:卡巴斯基互联网安全只有 4.48%,卡巴斯基杀毒软件只有 2.43 的市场份额!(来源:thewindowsclub.com/…)查看这份报告,您是否遇到了问题kis 或其他 av 的呢?您确实知道您可以在 virustotal.com 和 novirusthanks e.t.c 上发送您的程序以获取完整的 av 报告(针对所有 av 和反木马)

标签: delphi


【解决方案1】:

您需要告知您的用户,即卡巴斯基的客户,卡巴斯基正在干扰您的软件运行,并且他们应该报告。表达您对作为开发人员无法接触到真实人类的挫败感。这是反恶意软件公司做出反应的唯一方式 - 与付费客户进行糟糕的公关。

【讨论】:

  • 这有点不适合现实生活。当防病毒软件说它可疑时为您的程序提供反 PR,而不是当您说它无法正常工作时为您的程序提供反 PR。您(开发人员)应该联系 AV 供应商,他们支持这种情况。当然他们不会为你改变他们的 AV 但他们可能会给你有用的指导如何防止警报。
  • @Andrey,我不同意。 AV 供应商应该分担他们的粗心大意造成的一些痛苦。
  • @Chris,您可以随心所欲地反对,但是如果您的软件没有按照应有的方式执行或被报告为病毒,客户会认为您的软件很糟糕。这就是现实。
  • @Andrey:他到底得到了什么安全保障?实际上,他得到了消极的安全感——他认为他受到了保护,所以他会稍微放松一下。 (另外,我想我听说卡巴斯基对这种事情特别不好。)
  • @Andrey - “误报(你的情况)” - 不,这不是误报,因为 KIS 没有显示警告/消息。如果我的“错误”代码不在 TRY EXCEPT 子句中,它只会使程序崩溃。正因为如此,我开始怀疑:有多少其他显示错误的程序实际上是错误的,有多少是好的,但卡巴斯基让它们表现得很糟糕。我的电脑没有损坏器(使其他程序出错的程序)更好。其他用户也可能受益于切换到漏洞较少的防病毒软件(没有迹象表明 KIS 提供的安全性可以弥补其漏洞)。
【解决方案2】:

卡巴斯基 = 海盗公司?也许是,也许不是。也许只是另一家产品糟糕且不存在支持的公司。他们的“支持”包括一个常见问题数据库和一个自动电子邮件应答程序。电话也与答录机相连。他们的自动回答不断向我解释如何将我的程序添加到 KIS“异常”数据库中。我一直在回复那些愚蠢的电子邮件,说我不能亲自去找我家里的所有客户,把我的程序放在“异常”数据库中,如果他们能修复这个错误会更好。

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

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

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

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

结论
当我在 StackOverflow 上发布此内容时,我没有意识到问题的严重性,也没有意识到它会与最初的课程有很大的不同。我仍然认为这完全符合 StackOverflow 的目的。我们都知道,有时程序中的问题可能不是由我们的错误代码引起的,我们也无法控制这些问题的根源(21 人投票赞成这个问题 - 这意味着很多其他人遇到了 KIS 问题)。 我们只能希望在非常低的水平上与用户系统交互的设计不佳的程序(例如 KIS 防病毒程序)将很快得到修复,因此我们的销售不会(太多)受到影响。

当您的程序被标记为“错误”并且您无能为力时,这令人沮丧!

【讨论】:

  • 卡巴斯基在您的文件写入请求和 Windows 之间放置了一个“软件管道”。由于它分析内容,因此处理这么多文件写入请求的速度很慢,因此您的某些写入请求被拒绝。指责他们的这种行为是对的。
【解决方案3】:

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

如果您的程序不太复杂,您可能想尝试 Lazarus/FPC。不如Delphi,不过我用了好几年了,在Windows/MacOS/Linux下都取得了不错的效果。

【讨论】:

  • 卡巴斯基支持无法找到真人。他们仅通过论坛板提供支持。只有不理解问题的普通用户(提供非常愚蠢/基本的答案)才会在那里回答。我刚刚从“错误报告”区域中删除了我的帖子。显然,他们不会接受这是他们软件中的错误。所以,您可能是对的:我们对卡巴斯基无能为力。但至少我们将这个大问题告知 Delphi 社区。​​span>
  • 有多种反病毒产品经常将 Delphi 可执行文件标记为恶意软件,因为遗憾的是,它们的分析例程检测到出现在病毒中的相同字节序列的高发生率,也出现在您的代码中。这些字节称为 Delphi RTL(运行时库)。当然,同样的问题会影响 Visual C++,但卡巴斯基的白痴在 VC++ 中构建了他们的应用程序,因此他们将 Visual C++ RTL 列入白名单。
【解决方案4】:

当我尝试使用 d2010 的新 TFile.Copy() 以及原始 api 函数将我的 prog 添加到 windows 启动时,我遇到了与 kaspersky 2011 类似的问题:

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

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

【讨论】:

  • 这真是愚蠢。看起来他们(KIS)阻止了将应用程序添加到启动的正常方式。你实际上所做的是在欺骗 KIS。
  • 嗨,奥马尔。为什么您的解决方案有效?看起来 KIS 无法控制 .Net 应用程序??
  • PS:最近我发现 KIS 2011 默默地切断了我的程序从互联网上读取更新。它在 KIS 2010 上运行良好。我想我开始不喜欢卡巴斯基(所有版本)。
  • @Andrey:在什么世界中将 EXECUTABLE 复制到启动文件夹是使其自动启动的正常方法?正常的方法是复制一个快捷方式。这可能就是卡巴斯基认为这很可疑的原因。
  • @himself 我的意思是这是正常的,因为他将它复制到开始菜单,用户可以看到它。我同意应对/创建快捷方式更好,但这不是防病毒的问题。病毒也可以添加快捷方式。
【解决方案5】:

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

【讨论】:

  • 我已尝试“fmCreate OR fmShareDenyNone”,但仍然出现错误。
  • 实际上,反病毒制造商有时会在他们的数据库中放入与来自特定(发布)开发工具的运行时库相匹配的签名,只是因为某些恶意软件是使用该工具制作的......
  • @SamB:这里不太可能出现这种情况,因为(afaict)OP 没有从防病毒软件中弹出,只有文件创建失败。
【解决方案6】:

如果问题只是卡巴斯基的问题,那么只需让您的程序检测它是否正在运行。如果是这样,请将您的文件创建/写入缩减为通过检测的任何内容。确保在某处有一些小的状态消息告诉用户为什么事情变慢。顺便说一句,病毒编写者已经知道这一点,这就是为什么这些启发式方法根本不起作用的原因。

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

这会解决您当前的问题,并将给您和卡巴斯基时间来找出长期解决方案。

或者,您可以简单地关闭 kapersky。只要确保在此过程中抓住他们所有的看门狗。但这往往更具战斗性。

【讨论】:

  • 他说他无法联系卡巴斯基。你真的不能关闭它,他们以某种方式阻止它。是的,即使有看门狗。再加上这在不告诉他的情况下关闭用户防御是不好的。普通应用不应该这样做。
  • 我同意。大多数防病毒程序都不会被关闭。并且用户可能不喜欢它。但是,事实上,当我无法写入磁盘时,我已经添加了一条消息来通知用户该问题。
【解决方案7】:

创建大量文件听起来不一定是好事,但您可能有自己的理由 :)

当你在 Delphi 中得到错误代码时,KAV 会弹出任何启发式警告,还是完全静默?得到一个启发式的“天哪,那个应用程序做错了!”并不奇怪。从创建大量新文件,但如果 KAV 保持沉默,我会说这是一个错误。

您能否发布一个包含最少量代码的 delphi 可执行文件来重现该错误?还有一个执行相同步骤但只创建一个文件的版本,使用 SysInternals 的 ProcMon 进行跟踪可能会很有趣。

【讨论】:

  • 数量并不大:10到100。我只是在测试中使用了1000个文件,以使错误经常出现,以便我观察它。不,KIS 根本不显示任何消息。这是一个错误,因为即使我将我的应用程序设置为受信任,它也会阻止应用程序!!!!!!
  • 更新 - 我的输出必须有一个特殊的格式。我不能只是将所有文件合并在一起(想象一下将几个 mp3 文件合并在一起 - 没有意义 - 对吧?)
【解决方案8】:

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

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

  1. 您创建文件并打开它,增加引用计数。
  2. 卡巴斯基驱动程序注意到这一点并打开文件。即使您设置共享模式拒绝,作为驱动程序,它也可能无论如何都有权打开它(如果卡巴斯基无法绕过共享拒绝,任何病毒都可能使用相同的技巧来隐藏其数据!)。
  3. 您关闭文件并将其删除。当您删除该文件时,系统只是将其标记为“FILE_FLAG_DELETE_ON_CLOSE”,但该文件仍然存在,直到它的所有句柄都被关闭。
  4. 卡巴斯基继续扫描文件,仍未释放句柄。
  5. 因此文件仍然存在。
  6. 您尝试创建新文件但调用失败,因为旧文件仍未删除。

当然,造成所有这些混乱的部分原因是卡巴斯基的检查机制,但他们在这里并没有做错什么。无论如何,卡巴斯基都需要扫描文件,对此几乎无能为力 - 它是杀毒软件,需要大声喊叫。另一方面,通过创建然后删除文件来检查权限(可能)非常非常错误。所以我猜,你是这里的错。

【讨论】:

  • "Can't you just check the permission directly" - 你能举一个函数的例子吗(比如说叫做 CanWrite(Path: string) )如果文件可以被写入则返回 TRUE 否则返回 FALSE ?
  • “卡巴斯基继续扫描文件,仍然没有释放句柄” - 该文件是该死的空文件。没有什么可扫描的! KIS 不应该先验证这一点吗?
  • “卡巴斯基继续扫描文件,仍然没有释放句柄” - 如果我想在文件中的随机位置读/写数据怎么办?我应该延迟 5 秒并希望 KIS 释放手柄吗?
  • 卡巴斯基为什么要锁定该死的文件?不锁定就不能扫描病毒吗?如果文件被删除(没有回收站),保持锁定有什么意义?文件已删除!没有病毒可以利用它。
  • 即使我的方法不优雅——它也没有错!!程序员如何猜测用户计算机中可能安装了什么样的奇怪/错误软件?显示我们在每行代码后放置 5 秒延迟? - - - 实际上我的代码很优雅,除非其他人有更好的解决方案。 :)
【解决方案9】:

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

【讨论】:

  • PS:不要保存和加载kis设置。
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 2016-04-08
相关资源
最近更新 更多