【问题标题】:Antivirus detecting compiled C++ files as trojans防病毒软件将编译后的 C++ 文件检测为特洛伊木马
【发布时间】:2021-02-22 10:07:30
【问题描述】:

我已经为带有 MinGW 的 windows 安装了 c++ 编译器。我试着做一个简单的程序:

#include <iostream>
using namespace std;

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

并将其保存为try.cc。之后我在文件夹中打开 cmd 并运行g++ try.cc -o some.exe。它生成了some.exe,但我的防病毒软件 (avast) 将其识别为恶意软件。我以为它可能是误报,但它明确表示它是木马。

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

72 个引擎中有 24 个将其检测为恶意软件,其中很多是木马。

这是误报吗?为什么它会被检测为木马?如果是,我如何避免每次制作新程序时都收到此警告?

编辑:

感谢大家的帮助,我用 2 次防病毒软件对我的电脑进行了全面扫描,一切看起来都很干净。我还对 MinGW 文件夹进行了扫描,但什么也没有。

每次我编写一个新的 c++ 程序时,问题都会不断出现。我尝试修改代码和名称,但 AV 一直将其检测为病毒。有趣的是,更改代码会改变 av 报告的病毒类型。

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

如果有人知道如何完全确定创建的可执行文件不是病毒,只有误报,我会很高兴他们分享它。

编辑 2:

我突然想到,如果编译器被感染并且它正在添加代码,那么我可能能够通过反编译器/反汇编器看到它,并为其提供可执行文件。我下载了一个我在这里找到的 c++ 反编译器 "snowman" 并在文件上使用它。问题是代码从原始可执行文件中的 7 行变为 5265,并且有点难以理解。如果有人对逆向工程有一定的经验,原始文件的链接在下面的 cmets 中。

【问题讨论】:

  • 除非您的工具链已被感染以使其产生木马,否则我不会担心。您exe 恰好与某些木马共享相同的指纹。看看g++ -O3 -g0 try.cc -o some.exe 是否有所作为。
  • 看起来像一个真正的肯定(多个不相关的引擎检测到它)。也许您免费下载了一些带有额外恶意软件的狡猾的 mingw 包。立即扫描您的计算机。
  • 你到底是怎么安装mingw的?
  • Avast 不是开发机器上可用的产品。

标签: c++ antivirus trojan


【解决方案1】:

更新:

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

有趣的是,当我在代码中添加更多行时,AV 不再将其识别为病毒。让你想知道所使用的哈希函数是如何工作的,以及它与程序的实际内容有何关系。

这样就解决了,一切都很好,只是有些 AV 马虎(我猜这是有原因的)。

【讨论】:

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

这可能是由两件事引起的

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

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

【讨论】:

  • 您能否指出有关此类受感染编译器的具体示例的报告?
  • 这两点都令人难以置信。你有参考吗?
  • 第一个很容易制作,例如如果你的病毒是一个函数,在编译时,在后台,你将main重命名为oldmain,你的病毒main在它之后调用main执行。您还可以运行两个线程(主程序和病毒),您可以创建带有病毒的自定义库(例如:用 callVirusCode 替换 printf,然后是 printf)这些只是示例。其次,该理论被称为“碰撞”(哈希何时匹配)。
  • For 1.:是的,但我从未听说过这种攻击。我认为,这种东西并不真正有价值。这只是猜测吗?对于 2.:是的,但是每个已编译的程序有超过 24 次碰撞?哈希碰撞非常罕见......
  • For 1:“你”没听说过不代表不存在。对于 2,它取决于使用的哈希大小和那里的病毒数量。
【解决方案3】:

这个问题之前出现过。使用 mingw 编译的程序往往会触发偶尔的蛇油(即防病毒程序)警报。这可能是因为 mingw 是病毒作者的流行工具链,因此它的输出与真阳性中出现的通用模式相匹配。这种情况一遍又一遍地出现,在 SE 上也是如此(例如 https://security.stackexchange.com/questions/229576/program-compiled-with-mingw32-is-reported-as-infected)。 [咆哮] 在我看来,这是 AV 公司无能的真实证据,因为它很容易修复,并且让您怀疑他们的程序的核心功能是否得到更好的实施。 [/咆哮]

您的情况有点可疑,因为触发的 AV 程序的数量如此之多。虽然我从未听说过 mingw 遭到入侵,而且粗略的谷歌搜索并没有改变这一点,但这并非不可能。破坏编译器当然是传播病毒的有效方法。增加间接级别的最著名示例是Ken Thompson hack

您的计算机当然也有可能感染了非 mingw 起源的病毒,该病毒只是将自身插入到它在磁盘上找到的新可执行文件中。这应该很容易通过通常的方式找到。一个起点可以是对一些其他(非 mingw)新的可执行文件进行在线检查;它们应该触发相同的 AV 程序。

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

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2012-05-13
    • 2019-02-22
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多