gratis - mcafee
¿Por qué este programa trivial C es detectado como un virus? (3)
Estoy un poco oxidado en C, pero me he encontrado con este extraño problema:
Escribí este programa:
#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);
}
}
Aparentemente no hay absolutamente ningún error de sintaxis, y por lo que pude entender, tampoco hubo ningún error de compilación. Se compila y construye perfectamente. Ahora, si cambio esta línea:
puts("Write a number: ");
Con este:
printf("Write a number: ");
se compila sin errores, pero cuando se lanza el objeto compilado, se detiene de inmediato y aparece una advertencia antivirus que indica que identificó un caballo de Troya. Antes de sacar conclusiones, lo construí varias veces y después de recibir el mismo mensaje lo escanee en virustotal.com y this fue el resultado.
Bueno, sé que las opciones en realidad son más correctas que printf dado el objetivo, pero aún así debería funcionar bien ...
¿Qué está mal aquí?
Estoy utilizando antivirus AVG y Pelles C para compilar.
Gracias por adelantado.
El software antivirus funciona con signatures que son básicamente patrones conocidos en el código ejecutable utilizado por el software antivirus.
Algunos virus en la naturaleza tienen un patrón similar al de la versión printf
del código que escribiste (busqué en todas las personas que te marcaron como virus, desafortunadamente ninguno de ellos publica lo que están verificando sus archivos de firmas). Debido al hecho de que nunca debe llamar a printf
con un solo argumento, es probable que muchos proveedores de software antivirus lo utilicen como parte de su proceso de firma.
Las dos opciones que tiene son no llamar a printf
con un solo argumento (que de todos modos no debería) o enviar su programa como un falso positivo a los proveedores de antivirus que dijeron que su programa era un virus y que pueden actualizar sus firmas para gobernar. su programa como un falso positivo.
Es un falso positivo, obviamente. El código de máquina generado simplemente se parece al código que se encuentra en la base de datos de malware. Esto no tiene nada que ver con el uso de puts()
.
printf () tiene un riesgo de seguridad de cadena de formato no controlado
usted debe utilizar pone ()
También encontré esto:
vea los comentarios en ¿Cuál es la diferencia entre printf () y puts () en C?
Solo una nota sobre el uso de printf en lugar de put: nunca, nunca haga un printf (variable) para imprimir una cadena. Use puts (variable) o printf ("% s '', variable). Existe un riesgo de seguridad al usar una cadena de formato variable: si un atacante puede escribir la variable, puede atacar el programa utilizando cadenas de formato. - Zan Lynx Dec 1''12 a las 9:05