19

我对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 上扫描了它,结果就是这样

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

这里有什么问题?

我正在使用 AVG 防病毒软件和 Pelles C 进行编译。

提前致谢。

4

3 回答 3

6

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

于 2013-10-18T22:48:52.277 回答
5

防病毒软件处理签名,这些签名基本上是病毒软件使用的可执行代码中的已知模式。

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

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

于 2013-10-18T22:50:33.897 回答
1

printf() 具有不受控制的格式字符串安全风险

你应该使用 puts()

还发现了这个:

请参阅C 中 printf() 和 puts() 的区别是什么?

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

于 2013-10-18T22:35:16.770 回答