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

为什么这个微不足道的C程序被检测为病毒?,c,antivirus,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); } } 关于这一点: printf("Write a number:

我对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);
  }

}
关于这一点:

printf("Write a number: ");
它编译时没有错误,但当编译对象启动时,它会立即停止,并弹出一条反病毒警告,表示它已识别特洛伊木马。在得出任何结论之前,我构建了好几次,在收到相同的消息后,我在virustotal.com上扫描了它,结果是

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

这里怎么了

我使用的是AVG反病毒,Pelles C编译

提前感谢。

printf()有一个

您应该使用puts()

还发现:

请参阅中的注释


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

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

反病毒软件,病毒软件使用的可执行代码中的基本模式是已知的

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


您有两个选项:不使用单个参数调用
printf
(无论如何,您不应该这样做)或者将您的程序作为假阳性提交给声称您的程序是病毒的防病毒供应商,他们可能会更新他们的签名以排除您的程序为假阳性。

这个问题似乎离题了,因为它是关于防病毒软件中的一个错误。AVG就是问题所在。这就是问题所在。或者您已经被感染。在在作者提供的链接中,许多AV工具都将其标记为病毒。这不仅仅是AVG“。如果您使用不同的编译器,是否会发生相同的情况?AVG喜欢将自己检测为病毒。这些格式字符串都不是不受控制的——不管它是多么真实,这在这里是无关紧要的。我知道它们之间的区别。还是觉得没什么意义…谢谢!以OP的方式使用printf有什么问题?这里printf的参数是字符串文字。我看不出有什么问题。@Raja问题在于它会导致抗病毒药物的假阳性。如果有一种替代方法不会导致误报(
puts
),我会用它来代替。是的,我得到了那部分——但为什么这会很危险(或者这是如何成为病毒特征的?)@Raja就像我说的,我试图找到任何误报的解释,看看它们是否匹配,但我找不到。我不知道它们匹配的是什么,但编译后的代码匹配了它。当然这与puts有关。它的意思是,编译后生成的代码在恶意软件数据库中被识别。但我明白你的意思。不管怎样,它应该起作用,但它不起作用,这就是重点。
printf("Write a number: ");