Win32 WriteFile 因防病毒不返回

Posted

技术标签:

【中文标题】Win32 WriteFile 因防病毒不返回【英文标题】:Win32 WriteFile does not return because of Antivirus 【发布时间】:2012-09-25 08:45:41 【问题描述】:

我的代码是用 Delphi 7 编写的,但我不认为它有什么特殊作用。

我尝试用 WriteFile 覆盖文件的内容。 除非编写“.dll”文件并且防病毒处于活动状态,否则它可以完美运行。

打开文件的句柄还是可以的。 写入被阻止:WriteFile 函数不返回!!!

防病毒软件似乎可以防止覆盖该 dll。 但是,最糟糕的是我必须重新启动电脑,因为我的应用程序被阻止、任务管理器被阻止、Windows 资源管理器被阻止等等。

如何防止这种情况发生?

有什么想法吗?

【问题讨论】:

严肃地说,还有一点信息。你用的是什么杀毒软件? 抱歉,我们无法控制最终用户 PC。 Bitdefender 出现问题。 那就不要做会触发防病毒软件介入的事情。按照安装程序的方式去做。将新内容写入文件,可能没有 dll 扩展名。注册一次运行以用新内容替换 dll 并请求重新启动。 没有编译器可以在装有该 AV 软件的机器上运行。建议换AV。如果这让您没有客户,那么您可能希望联系 AV 供应商。除非您正在编写编译器,否则您的程序看起来很像恶意软件。 @DavidHeffernan:我们在工作中使用 BitDefender,它通常不会干扰 Delphi。但你是对的,这是迄今为止我见过的最烦人的 AV 解决方案。一旦当前订阅用完,我们将转向其他内容,这一次我不会相信德国 c't 杂志的 AV 测试。 【参考方案1】:

除了其他人所说的如何解决防病毒问题之外,在您的代码中,您还可以使用重叠 I/O 来设置 WriteFile() 的超时时间,以确保您的代码在出现此问题时不再死锁又是它丑陋的脑袋。如果重叠操作超时,您可以通过CancelIo() 取消,然后向用户报告问题。

【讨论】:

但是 WriteFile 变成了异步的,不是吗? 是的,但这并不意味着你让你的调用代码也异步运行。您可以使用FILE_FLAG_OVERLAPPED 标志打开文件,然后声明一个OVERLAPPED 结构并用来自CreateEvent() 的等待事件填充它,然后像往常一样调用WriteFile(),但将OVERLAPPED 传递给它,然后使用WaitForSingleObject() 等待事件发出信号。如果 WFSO 报告发出信号,则使用GetOverlappedResult() 获取写入结果,否则使用CancelIo() 中止写入并根据需要处理 WFSO 错误/超时。【参考方案2】:

如果您将数字签名添加到您的可执行文件中,触发防病毒的机会就会减少。很多delphi程序被杀毒软件误杀,D7最差。

不确定您要写入 dll 的内容。防病毒软件不喜欢 PE 之外的额外数据。

如果你只需要更新一个dll,尝试重命名旧dll,并写入一个新文件,然后删除旧的。

【讨论】:

以上是关于Win32 WriteFile 因防病毒不返回的主要内容,如果未能解决你的问题,请参考以下文章

如何杀win32.parite.b病毒?

win32 是啥病毒?

如何在管道上使用 WriteFile 修复乱码文本?

杀毒软件删除 Win32 项目 exe

win32.udiskvir.spath.b病毒处理

Win32.Trojagent.是啥病毒?