Почему эта тривиальная программа C обнаружена как вирус? - программирование
Подтвердить что ты не робот

Почему эта тривиальная программа C обнаружена как вирус?

Я немного ржавый на 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 компилируется.

Спасибо заранее.

4b9b3361

Ответ 1

Это ложное положительное, очевидно. Сгенерированный машинный код просто похож на код, который находится в базе данных вредоносных программ. Это не имеет никакого отношения к использованию puts().

Ответ 2

Антивирусное программное обеспечение работает над сигнатурами, которые являются в основном известными шаблонами в исполняемом коде, используемом программным обеспечением для вирусов.

Некоторые вирусы в дикой природе имеют аналогичную структуру с версией кода printf, которую вы написали (я искал всех людей, которые пометили вас как вирус, к сожалению, никто из них не публикует то, что проверяют файлы подписи), Из-за того, что вы никогда не должны называть printf одним аргументом, вероятно, многие поставщики антивирусных программ могут использовать это как часть процесса подписи.

Два параметра, которые у вас есть, не вызывают printf с одним аргументом (который вы не должны в любом случае) или отправляете свою программу в качестве ложного позитива для поставщиков антивирусных программ, которые заявили, что ваша программа является вирусом, и они могут обновить свои подписи, чтобы исключить вашу программу как ложный.

Ответ 3

printf() имеет Неконтролируемый риск безопасности строки формата

вы должны использовать puts()

также нашел это:

см. комментарии в В чем разница между printf() и puts() в C?

Просто обратите внимание на использование printf вместо puts: никогда, никогда не делайте printf (variable) для печати строки. Используйте puts (переменная) или printf ( "% s", переменная). Существует риск безопасности при использовании строки с переменным форматом: если переменная может быть записана злоумышленником, они могут атаковать программу, используя строки формата. - Zan Lynx Dec 1 '12 в 9:05