我的VBA Excel宏遭受了杀毒软件的误报

8
我刚遇到了一个更为恼人的问题。突然间,Windows Defender 把我从浏览器下载的包含 VBA 宏代码的 Excel 文件标记为病毒。具体报告的病毒是:

Trojan:O97M/Foretype.A!ml

谷歌搜索显示以下信息:

O97M.Downloader 是用于下载其他威胁的 Microsoft Office 宏的通用检测。它们通常包含在其他 Microsoft Office 文档中,并可能通过附件或从网站下载后到达受感染的计算机。

很好,所以一旦 Windows Defender 检测到它,它基本上会销毁该文件,当您尝试打开它时,Excel 会声称该文件已经 "被损坏"。我很想将我的 VBA 文件发布到 http://www.virustotal.com,但它包含大量无法与更广泛的社区共享的专有 VBA 代码。我想知道是否有一个网站可以用不同的条款和条件来完成相同的事情?

这只是最近才开始发生的事情,只影响了少数用户/客户。我不确定安装了这个程序的客户分布情况以及他们正在运行的Windows Defender版本。我担心这种影响会增加,直到我们的许多客户受到影响。更令人不安的是,通常情况下,客户可以无问题地下载一个版本,但当他们从其他来源下载文件(相同的VBA代码)时,就会遇到问题。下载源是否会影响文件被标记的可能性?
主要问题:
是什么导致Excel VBA文件被标记为“O97M”病毒,如何防止其被标记?
相关问题:
如果我签署我的VBA宏,是否会影响病毒检测的可能性?
是否有其他常见做法可以改变误报的可能性?
什么是"Trojan:O97M/Foretype.A!ml"?窗口页面提供的信息非常少,甚至可以说根本不存在。Symantec也没有提供太多帮助(也许我在这里非常无知),是否有病毒检测的集中存储库?我想人们可能不想分享它,并且它可能因产品而异,但我对任何与此相关的信息都很感兴趣...
外部库
我还使用以下外部代码:
我还使用以下窗口函数:

https://gist.github.com/brucemcpherson/3414365/

https://www.thespreadsheetguru.com/the-code-vault/2014/4/23/loop-through-all-excel-files-in-a-given-folder

如何在不关闭调用工作簿的情况下使用VBA SaveAs?

Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Public Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As LongPtr
Public Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Public Declare PtrSafe Function GetWindowRect Lib "user32" (ByVal hWnd As LongPtr, lpRect As RECT) As LongPtr
Public Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hWnd As LongPtr, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As LongPtr
Public Declare PtrSafe Function SetParent Lib "user32.dll" (ByVal hWndChild As LongPtr, ByVal hWndNewParent As LongPtr) As LongPtr
Public Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hWnd As LongPtr) As LongPtr
Public Declare PtrSafe Function GetDeviceCaps Lib "gdi32.dll" (ByVal hdc As LongPtr, ByVal nIndex As LongPtr) As LongPtr
Public Declare PtrSafe Function GetDC Lib "user32.dll" (ByVal hWnd As LongPtr) As LongPtr
Public Declare PtrSafe Function ReleaseDC Lib "user32.dll" (ByVal hWnd As LongPtr, ByVal hdc As LongPtr) As LongPtr
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare PtrSafe Function SetLastError Lib "kernel32.dll" (ByVal dwErrCode As Long) As Long
Public Declare PtrSafe Function GetActiveWindow Lib "user32.dll" () As Long
Public Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As LongPtr) As Long

1
我不确定在没有看到代码的情况下,这里的任何人都能提出什么触发器建议。你可以向微软报告它是误报,但他们可能也会要求你的代码。杀毒公司对于他们的启发式算法非常谨慎,所以通常不会透露太多信息。 - Comintern
你是否实现了类似于这个的东西(https://dev59.com/J1UK5IYBdhLWcg3w_z20)? - Comintern
@Comintern 是的,这是一个很大的文件,虽然我认为分享全部内容并不好,但我肯定可以分享一些片段。嗯,我会联系万能的微软并与他们分享。虽然隐藏细节是可以理解的,但诊断误报就变得困难了 :( - David Rogers
@FreeMan 我希望我不必采取那种措施,现在他们只需单击链接即可下载文件。我可以这样做,但有数百/数千个用户,如果没有经过良好实践的话,可能会相当困难(我想)。 - David Rogers
我遇到了同样的问题,甚至更加困惑,因为根据下面微软文章中的可用性部分,AMSI不应该扫描该文件,因为(a)它使用合法的根授权代码签名证书进行签名,被标记为受信任的发布者,(b)它在受信任的位置中被标记为受信任的文档。 https://www.microsoft.com/security/blog/2018/09/12/office-vba-amsi-parting-the-veil-on-malicious-macros/ - Jamie Garroch - MVP
显示剩余3条评论
6个回答

3

我们联系了微软,他们回复了以下信息(由于某些原因无法复制为文本):

enter image description here

所以我猜这就是JSON VBA逻辑,我想它已经解决了(我没有看到这种情况再次发生),虽然很难说。


1

最近几天(2018年10月29日)我也遇到了一个xlsm文件的同样问题。我从头开始制作了这个文件,所以我知道它不含病毒。

我不知道Windows Defender是否会对以下某一项做出反应:

  1. 文件存储在我的OneDrive上
  2. 它包含用于从网络下载的代码(JSON数据和图像)

唯一我没有自己制作的是我正在使用的这段代码:https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas

我猜想Windows Defender对JsonConverter代码做出了反应,“Trojan:O97M/Foretype.A!ml”可能使用了类似的代码。


1
是的,我同意,我没有使用那个库,但我在这里使用了类似的代码片段(类似JSON类型逻辑),我想知道它是否会触发... - David Rogers

0

在过去的几年中,我在其他几个具有类似条件的文件中遇到了这个问题,以下方法帮助我解决了这些问题:

  1. 删除和联系供应商 - 删除所有有问题文件中除VBA代码之外的所有部分,然后逐步消除除该文件代码以外的所有代码,直到您确定导致反病毒软件标记您的文件的具体代码部分为止。(通常,此代码部分非常小) 您可以安全地上传此逻辑到VirusTotal,而不分享您文件IP的大部分。 然后,您将能够确定哪个供应商错误地标记了您的文件。 用您文件的“最小化”版本与他们联系,请他们从其数据库中删除它(通常需要几天,但他们会这样做)。

  2. 代码签名证书 - 我曾经使用代码签名SSL证书对我的文件进行数字签名,并与一些反病毒软件供应商取得了成功。 我知道其他人没有采用这种方法,我认为这将取决于供应商,有些供应商会尊重它,而另一些则不会。

  3. 混淆 - 我的文件作为下载提供在我的网站上,因为每个用户在打开文件之前都要点击“下载”,所以我有机会在用户打开文件之前修改每个下载的文件。如果您没有选择方案2,则有一种较低质量的选择,即在每个下载的文件之上实现简单版本的混淆,为每个下载它的用户生成“不同”的文件版本。这是一个有点像武器竞赛的方法,但我用这种方法获得了成功。最大的优点是当您的新文件被标记时,他们只会标记混淆后的文件,而不是用于混淆的原始文件,在许多情况下,他们不会察觉到被原始文件覆盖的VBA部分,即仅检测到已标记的文件,所有其他用户都不受影响。

  4. 绕过问题- 在可能的情况下,您可以绕过这个问题,例如使用this sort of thing等不同的存储VBA的方法。我将我的方法与异步网络调用密切结合,使我的业务逻辑免受VBA代码干扰。长期解决方案是通过使用VSTO永久退出VBA环境来解决问题,尽管这种方法肯定存在缺点。


0

寻找如何控制Windows Defender的提示,我发现了这个页面。 Windows Defender因误报而喜欢删除我的机器上的插件:最近出现了Trojan:O97M/Sadoca.C!ml。 其中一些文件已经一年甚至更久,并且它们都使用我的官方代码签名证书进行签名。它们是.ppam和.xlam格式的。其中一些是混淆的,另一些是纯文本VBA代码。

在失去所有工作之前,我关闭了Windows Defender。Windows Defender会在随机时间间隔内将这些文件添加到隔离区,但它不会列出这些操作来让我允许这些“威胁”。所以现在看来Windows Defender是有问题的。这是一场噩梦,没有简单的解决方法。我不介意向Microsoft发送一个签名和混淆的文件。仍在寻找联系方式。也许这里有相关信息:https://learn.microsoft.com/en-us/microsoft-365/security/defender/m365d-autoir-report-false-positives-negatives?view=o365-worldwide。明天会再次检查。

这些插件在公司的许多机器上全天运行,所以并不好笑。如果Windows Defender开始将这些插件隔离,将会是一场灾难/停止整个生产线。我现在很担心!必须有更好的流程来纠正误报;无论是你自己的工作还是如果Windows Defender开始删除由Microsoft签名的Windows系统文件,就像其他网站上的一些人报告的那样。我们过于依赖IT,冒着恶意软件或安全软件使我们失去业务的风险。


0

在尝试编辑旧的XLSM Excel文件中的VBA代码时,我收到了“文件未找到”的打开错误。当我继续打开时,我发现我的所有5个VBA模块都被剥离了。研究发现Bitdefender已报告Trojan.Valyrian.3644。我还发现Bitdefender已剥夺了所有备份文件和同一文件的版本。当我尝试让文件通过电子邮件发送回给我时,BD删除了整个电子邮件并引用了同样的Trojan。

我能够得到模块的记事本列表。我逐个将这5个模块复制到新模块中,并发现只有1个导致了问题。然后,我逐行恢复该模块,直到BD再次出现问题。问题在于一个使用逗号分隔的几个变量的单DIM语句(DIM X,Y,Z等等)。将该DIM语句拆分为3行解决了问题。

我不明白的是为什么自2013年以来,同样的Excel文件一直在使用,却从未出现过问题。问题只在2021年1月我尝试编辑它时才出现。原来,另一个位置的最终用户今年也遇到了文件的问题。使用该文件的所有人现在都使用Office 365,尽管VBA代码是使用excel 2013开发的。


0

我之前也遇到了同样的问题,后来通过将文件保存为xlsb格式解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接