我的 VBA Excel 宏中的防病毒误报

Antivirus False positive in my VBA Excel Macro

我刚刚运行变成了even more annoying problem。突然 windows 防御者开始将我的一个包含 VBA 宏代码(从浏览器下载)的 excel 文件标记为病毒。正在记录的特定病毒是:

Trojan:O97M/Foretype.A!ml

谷歌搜索显示以下信息:

O97M.Downloader is a generic detection for Microsoft Office macros that download other threats. They are usually contained in other Microsoft Office documents and may arrive on the compromised computer through attachments or after being downloaded from a website.

很好,所以一旦 windows defender 检测到它,它基本上会粉碎文件,当您尝试打开它时,excel 声称文件有 "been corrupted"。我很想 post 我的 VBA 文件到 http://www.virustotal.com 但是它包含大量无法与更广泛的社区共享的专有 VBA 代码。我想知道是否有一个网站可以用不同的条款和条件来完成同样的事情?

最近才开始,只影响了少数人 users/clients。我不确定安装此软件的客户端的分布以及 windows Defender 的版本 运行。我担心这种影响会增加,直到我们的大量客户受到影响。更麻烦的是,客户通常可以毫无问题地下载一个版本,但是当他们从不同的来源下载文件(相同的 VBA 代码)时,他们会遇到问题,下载源会影响文件被标记的可能性吗?

主要问题

什么原因导致 excel VBA 文件被标记为 "O97M" 病毒?我该如何防止它被标记?

相关问题

应该I sign my VBA Macro's,这会影响病毒检测的可能性吗?

它们是否是我可以更改的其他常见做法,它们会影响误报的可能性?

"Trojan:O97M/Foretype.A!ml" 到底是什么? window 页面包含的信息太少,甚至不存在,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

How to use VBA SaveAs without closing calling workbook?

我还在使用以下 window 函数:

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

几天前 (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" 可能使用了类似的代码。

We reached out to Microsoft 他们回复了以下消息(由于某些原因无法在文本中复制):

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

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

  1. 消除并联系供应商 - 删除除 VBA 代码之外的所有有问题的文件部分,然后系统地消除除 VBA 代码之外的所有代码文件中的代码,直到您确定导致防病毒软件标记您的文件的特定代码部分。 (通常这部分代码非常小)您可以安全地将此逻辑上传到 VirusTotal,而无需共享大部分文件 IP。这将使您能够识别哪个供应商错误地标记了您的文件。使用文件的 "minimized" 版本与他们联系,要求他们将其从数据库中删除(通常需要几天时间,但他们会这样做)。

  2. 代码签名证书 - 我在一些防病毒供应商那里很幸运,他们使用代码签名 SSL 证书对我的文件进行了数字签名。我知道其他人对这种方法没有任何运气,我的意见是它会因供应商而异,有些人尊重它,其他人则不会。

  3. 混淆 - 我的文件在我的网站上提供下载,因为每个用户在打开文件之前都单击 "download",我有在用户打开文件之前修改正在下载的每个文件的机会。如果您不选择选项 2,则还有一个质量较低的选项,也就是说,您在每个下载的文件之上实施了一个简单版本的混淆,为每个下载的用户生成一个 "different" 版本的文件下载它。这有点像军备竞赛,但我用这种方法取得了成功。最大的优势是,当你的新文件被标记时,只会标记混淆文件,而不是用于混淆的原始文件,在许多情况下,他们不会选择原始文件中涵盖的 VBA 部分,即只有被标记的文件会被检测到,所有其他用户不受影响。

  4. 解决问题 - 你总是可以解决这个问题,在可能的情况下你可以使用不同的方法来存储你的 VBA,例如作为 this sort of thing. I heavily abstract my methods into Async web calls, sheltering my business logic from the VBA code. Long term solution is to get around the issue by using VSTO 并永久退出 VBA 环境,认为这种方法肯定有缺点。

在尝试编辑旧 XLSM excel 文档中的 VBA 代码时,我收到了打开时找不到文件的错误消息。当我继续打开时,我发现我的所有 5 个 VBA 模块都被剥离了。研究发现,Bitdefender 报告了 Trojan.Valyrian.3644。我还发现 Bitdefender 删除了所有备份文件和同一文件的版本。当我试图通过电子邮件将文件发回给我时,BD 删除了整封电子邮件,并引用了同一个木马程序。

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

我不明白的是为什么自 2013 年以来一直使用同一个 Excel 文件而没有出现任何问题。这个问题是在 2021 年 1 月我试图打开它进行编辑时才出现的。事实证明,另一个位置的最终用户今年也遇到了文件问题。尽管 VBA 代码是使用 excel 2013 开发的,但每个使用该文件的人现在都有 Office 365。