为什么这个微不足道的C程序被检测为病毒?

时间:2013-10-18 20:54:25

标签: c antivirus

我在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进行编译。

提前致谢。

3 个答案:

答案 0 :(得分:5)

显然,这是假阳性。生成的机器代码恰好类似于恶意软件数据库中的代码。这与使用puts()无关。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

printf()有一个Uncontrolled format string security risk

你应该使用puts()

也发现了这个:

请参阅What is the difference between printf() and puts() in C?

中的评论

关于使用printf而不是puts的说明:never,永远不要用printf(变量)来打印字符串。使用puts(变量)或printf(“%s”,变量)。使用变量格式字符串存在安全风险:如果变量可以由攻击者编写,则可以使用格式字符串攻击程序。 - Zan Lynx Dec 1'12 at 9:05