【问题标题】:Why is this trivial C program detected as a Virus?为什么这个琐碎的 C 程序被检测为病毒?
【发布时间】:2013-10-27 20:11:56
【问题描述】:

我对 C 有点生疏了,但是我遇到了这个奇怪的问题:

我写了这个程序:

#include <stdio.h>

main()
{
  int n;
  n=1;
  while (n>0)
  {
    puts("Write a number: ");
    scanf(" %d",&n);
    printf("This is the number you wrote: %d\n", n);
  }

}

显然绝对没有语法错误,据我所知,也没有任何编译错误。它完美地编译和构建。 现在,如果我切换这一行:

puts("Write a number: ");

用这个:

printf("Write a number: ");

它编译时没有错误,但是当编译的对象启动时,它会立即停止并弹出一个防病毒警告,说它识别出一个特洛伊木马。在得出任何结论之前,我构建了几次,在收到相同的消息后,我在 virustotal.com 中扫描了它,结果是this

好吧,我知道 puts 实际上比 printf 更正确,但它仍然应该可以正常工作......

这里有什么问题?

我用的是AVG杀毒,Pelles C编译。

提前致谢。

【问题讨论】:

  • 这个问题似乎离题了,因为它是关于防病毒软件中的错误。
  • AVG 出了什么问题。就是这样。或者你已经被感染了。
  • 在作者提供的链接中,许多 AV 工具将其标记为病毒。这不仅仅是“AVG”。
  • 如果你使用不同的编译器会发生同样的事情吗?
  • AVG 喜欢将自己检测为病毒。

标签: c antivirus


【解决方案1】:

显然,这是一个误报。生成的机器代码恰好与恶意软件数据库中的代码相似。这与puts()的使用无关。

【讨论】:

  • 当然跟puts有关。它表示,编译后会生成在恶意软件数据库中识别的代码。但是,是的,我明白你的意思。无论如何,它应该工作,但它没有,这就是重点。
【解决方案2】:

防病毒软件在signatures 上工作,这基本上是病毒软件使用的可执行代码中已知的模式。

某些病毒与您编写的printf 版本的代码具有相似的模式(我搜索了所有将您标记为病毒的人,不幸的是,他们都没有公布他们的签名文件正在检查的内容) .由于您永远不应使用一个参数调用printf,因此很可能许多防病毒软件提供商可能会将其用作其签名过程的一部分。

您有两个选项,不要使用单个参数调用printf(无论如何您都不应该这样做),或者将您的程序作为误报提交给防病毒供应商,说您的程序是病毒并且他们可能更新他们的签名以排除您的程序为误报。

【讨论】:

  • 以 OP 的方式使用 printf 有什么问题?这里 printf 的参数是一个字符串文字。我没有看到问题。
  • @Raja 问题在于它会导致防病毒软件出现误报。如果有一个不会导致误报的替代方法 (puts),我会改用它。
  • 是的,我得到了那个部分 - 但为什么这会很危险(或者这最终是如何成为病毒签名的?)
  • @Raja 就像我说的那样,我试图找到任何虚假陈述的解释,以查看它们匹配的内容,但我做不到。我不知道他们在匹配什么,但编译后的代码匹配它。
【解决方案3】:

printf() 有一个Uncontrolled format string security risk

你应该使用 puts()

还发现了这个:

查看What is the difference between printf() and puts() in C?中的cmets

只是关于使用 printf 代替 puts 的说明:永远不要使用 printf(variable) 来打印字符串。使用 puts(variable) 或 printf("%s', variable)。使用可变格式字符串存在安全风险:如果攻击者可以写入变量,他们就可以使用格式字符串攻击程序。 – Zan Lynx Dec 2012 年 1 月 9:05

【讨论】:

  • 这些格式字符串都不是不受控制的——不管它是真的,这在这里无关紧要。
  • 我知道一个和另一个之间的差异。仍然认为这没有多大意义...谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2011-03-15
  • 2010-09-06
  • 1970-01-01
  • 2010-12-01
  • 2021-08-07
相关资源
最近更新 更多