杀毒软件将编译的C++文件检测为特洛伊木马

11

我已经在Windows上安装了一个使用MinGW的C ++编译器。 我试图制作一个简单的程序:

#include <iostream>
using namespace std;

int main() {
   cout << "Hello World!";
   return 0;
}

我把文件保存为try.cc,然后在文件夹中运行了g++ try.cc -o some.exe。它生成了some.exe但我的杀毒软件(avast)认为它是恶意软件。虽然我觉得这可能是误报,但它明确指出它是特洛伊木马。

我从病毒库中删除了该文件,并将其上传到“https://www.virustotal.com/”

结果:

https://istack.dev59.com/jC2oz.webp

72个引擎中有24个检测到它是恶意软件,其中很多都是特洛伊木马。

这是否是误报?为什么会被检测为特洛伊木马?如果是,请问我如何避免每次创建新程序时都收到此警告?

编辑:

感谢大家提供的帮助,我使用了两个杀毒软件对计算机进行了全面扫描,一切看起来都很干净。我还对MinGW文件夹进行了扫描,也没有发现问题。

每次我创建新的C++程序时问题仍然存在。我尝试修改代码和名称,但是杀毒软件仍然将其检测为病毒。有趣的是,更改代码会改变杀毒软件报告的病毒类型。

我仍然不确定编译器是否干净,所以我不知道是否应该忽略它并运行程序。我从“https://osdn.net/projects/mingw/releases/”下载了MinGW。

如果有人知道如何完全确定生成的可执行文件不是病毒,而只是误报,请分享一下。

编辑2:

我想到了一个想法,如果编译器受到感染并添加了代码,那么我可能可以通过反汇编器来查看它,将可执行文件输入到它中。我在这里找到了一个c++反编译器“snowman”并将其用于文件。问题是原始可执行文件中的7行代码变成了5265行,有点难以理解。如果有人有关于逆向工程的经验,原始文件的链接在下面的评论中。


4
除非您的工具链已被感染以使其生成特洛伊木马,否则不必担心。您的exe只是碰巧与某些特洛伊木马共享相同的指纹。尝试使用g++ -O3 -g0 try.cc -o some.exe命令,查看是否有所不同。 - Ted Lyngmo
5
看起来是真正的阳性(多个不相关的引擎都检测到了)。也许你下载了一些附带免费恶意软件的可疑Mingw捆绑包。立即扫描你的电脑。 - user14215102
2
你到底是怎么安装mingw的? - Peter - Reinstate Monica
1
Avast在开发机上不是一个可用的产品。 - Hans Passant
3
此外,https://security.stackexchange.com/questions/229576/program-compiled-with-mingw32-is-reported-as-infected。 - Peter - Reinstate Monica
显示剩余5条评论
3个回答

4

这可能是由两个原因引起的:

  1. 它确实是一个特洛伊木马,你从某些地方下载了你的mingw,它们的代码被修改以在你创建的每个程序中添加病毒。几乎所有商业编译器都会这样做,“免费”(破解版)版本也会在其中添加这段代码,每次编译代码时,病毒都会添加到你的exe文件中。

  2. 你的exe文件哈希值出于某种原因与现有病毒匹配。你可以通过更改代码中的一个字符来确认这一点,例如将“hello world!”改为“hello world?”并查看是否仍然被认为是病毒。如果是,你的编译器很有可能会向你的程序中添加病毒。


7
你能否提供有关此类被攻击的编译器的具体案例的报告? - Peter - Reinstate Monica
这两点很难相信。你有任何参考资料吗? - akop
第一个方法非常容易实现,例如,如果您的病毒是一个函数,在编译时,您可以在后台将main重命名为oldmain,然后您的病毒main在执行后调用main。您还可以运行两个线程(主程序和病毒),您可以使用病毒创建自定义库(例如:将printf替换为callVirusCode,然后printf)这些只是示例。 对于第二个理论,它被称为“冲突”(当两个哈希匹配时)。 - phoenixstudio
1
  1. 对于第一点:是的,但我从未听说过这种攻击。我认为这种攻击并不真正有价值。这只是一个猜测吗?
  2. 对于第二点:是的,但每个编译程序超过24个碰撞?哈希碰撞非常罕见...
- akop
对于第一句话:“你”从未听说过并不意味着它不存在。对于第二句话,这取决于使用的哈希大小和病毒数量。 - phoenixstudio

4
这个问题以前就出现过。使用mingw编译的程序往往会引发偶发的虚假警报(即,杀毒软件)。这可能是因为mingw是病毒作者常用的工具链,因此其输出匹配真正阳性中出现的通用模式。这一问题一再出现,也在SE上讨论过(例如https://security.stackexchange.com/questions/229576/program-compiled-with-mingw32-is-reported-as-infected)。
[rant]在我看来,这证明了杀毒软件公司的无能,因为这很容易修复,这让你想知道他们的程序的核心功能是否更好地实现了。[/rant]
不过你的情况有些可疑,因为触发的AV程序数量太多了。虽然我从未听说过被攻击的mingw,而且粗略的谷歌搜索也没有改变这一点,但这并非不可能。攻击编译器肯定是传播病毒的有效方法;最著名的例子是Ken Thompson hack,它增加了一个间接层级。

很有可能你的电脑被感染了一种非mingw来源的病毒,它会在发现新的可执行文件时将自己插入其中。这可以通过常规手段轻松找出来。一个起点是对几个其他(非mingw)的新可执行文件进行在线检查;它们应该触发相同的杀毒程序。

请注意,虽然我有一些普通的IT经验,但我没有专门的IT安全知识;请把我说的话仅作为你自己研究和行动的起点。


4

更新:

实际上是一种哈希碰撞,编译器并没有被感染。我确实像建议的那样多次更改了打印函数中的字符串,甚至添加了换行符,但每次我的 AV 都将其检测为恶意软件。我还尝试删除一些代码行(包括包含语句和打印语句),它也将其检测为恶意软件。

有趣的是,当我添加更多代码行时,AV 就停止识别它为病毒。这让你思考所使用的哈希函数如何工作,以及它如何与程序的实际内容相关。

所以问题解决了,一切正常,只是一些 AV 程序的疏忽(我想它们也有它们的原因)。


1
有趣,也很值得知道。但你确定这是哈希冲突吗?哈希对代码中最微小的变化都敏感。我认为这可能是某种其他形式的模式识别。例如,可能存在这样的想法:有用的程序不能小于某个最小大小,这使得杀毒程序对小程序有偏见。 - Peter - Reinstate Monica
是的,你可能是对的,但请记住,删除代码行会改变检测到的病毒类型,因此它不仅仅是可执行文件的大小。我在想,在计算哈希函数之前,忽略编译后程序的字符串有多难。这可能解释了为什么打印中的更改没有影响(但我猜它可能被插入字符串中的代码所利用),但我不确定。 - gabriel
如果发生哈希冲突,只会有一个匹配的AV。发生冲突的概率非常非常低。@Peter Reinstate Monica 的猜测更好。 - akop
每次编译C++代码时,MinGW都会向其中添加固定的代码。这段代码只是可执行文件的一小部分,但随着可执行文件大小的减小,原始代码的比例也会减少。这意味着如果有任何使用MinGW的小型恶意软件,那么随着我的程序变得更小,与恶意软件相同的代码百分比就会增加。如果任何杀毒软件对代码的某些部分应用哈希函数(这可以帮助检测多态病毒),然后检查匹配项,高度相似性可能会导致误报。 - gabriel

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