这是我在程序员生涯中遇到过的最奇怪的事情之一。
我正在开发一个MFC项目,最近我的防病毒软件BitDefender将我的可执行文件视为病毒" Gen:Variant.Razy.47148
"
以下是virustotal.com
Antivirus Result Update
ALYac Gen:Variant.Razy.47148
Ad-Aware Gen:Variant.Razy.47148
Arcabit Trojan.Razy.DB82C
BitDefender Gen:Variant.Razy.47148
Emsisoft Gen:Variant.Razy.47148
F-Secure Gen:Variant.Razy.47148
GData Gen:Variant.Razy.47148
eScan Gen:Variant.Razy.47148
*其余的都是明确的结果
我有一些配置,这只发生在其中一个配置中。所以我然后比较设置差异,结果Linker--Debugging--Generate Debug Info
是问题所在。当它是"否",而不是病毒,当它是,是病毒
然后我看看它究竟是做什么的,它说"这个选项可以创建.exe文件或DLL的调试信息。"
MS https://msdn.microsoft.com/en-us/library/xe4t6fc1.aspx的详细描述
我没有看到任何可能的方式使我的可执行文件成为病毒。
您可能想问更多:
多个众所周知的防病毒程序扫描硬盘驱动器。
如果我将其转为" No"可执行文件是明确的。没有做任何其他改变。这意味着我所包含的所有.c和.h都很清楚。
我知道这有点像假阳性病毒,因为只有一些"未命名的"防病毒软件报告此事。但不幸的是,我必须使用BitDefender,我的程序运行的那些计算机也正在使用它。(我的程序只是一个内部使用的调试工具)
答案 0 :(得分:2)
如果您的防病毒软件中没有其他内容被防病毒软件标记为恶意软件,则此“检测”很可能是因为程序中的某些触发了AV内的启发式检测例程。 / p>
这个“东西”可能是您使用的字符串,特定的机器指令序列,甚至是函数名称。当您关闭调试信息时AV不再标记您的程序这一事实可能表明触发器确实会在非调试版本中被剥离(例如函数名称)。
这不是编译器错误或可由他们解决的问题。您可以(并且应该)将可执行文件报告为AV供应商的误报(报告为有病毒的确切文件。)
正如我之前所说,这不是 - 很可能 - 是真正的感染,所以在你已经采取的步骤之后你不必担心。
您已经提到过,在没有调试信息的情况下构建程序时,防病毒软件不会对其进行标记或报告。您可以在没有调试信息的情这就是几乎所有软件无论如何都要分发的方式。如果可以,那么您与用户保持清醒;您的无调试信息的程序不会被报告为病毒。
答案 1 :(得分:0)
@Peter,非常感谢您关于“链接器 - 调试 - 生成调试信息”的提示。如果对这是一个误报问题有任何疑问,我试图证明我没有感染我的工作站时遇到了这个问题。当我创建一个简单的VS2015项目(Win32控制台应用程序)而没有添加ATL或MFC的标头时,就会出现问题。该程序仅包含模板生成的样板代码。
Symantec Endpoint Protection将病毒检测为Heur.AdvML.B。
奇怪的是,为ATL和/或MFC添加标题会产生一个“没有病毒”的exe。
此外,在VS2013中创建一个类似的项目(没有ATL / MFC)也会产生一个“干净”的exe。
希望这有助于其他人不要浪费半天的时间来打猎。
答案 2 :(得分:0)
可能有一些遥测/"电话回家"那个病毒扫描程序正在检测?有关VS2015中该发现的详细信息,请参阅此博客posting。