#include<stdio.h>
#include<conio.h>
union abc
{
int a;
int x;
float g;
};
struct pqr
{
int a;
int x;
float g;
} ;
void main()
{
union abc b;
struct pqr c;
clrscr();
b.a=10;
textbackground(2);
textcolor(6);
cprintf(" A = %d",b.a);
printf("\nUnion = %d",sizeof(b));
printf("\nStructure = %d",sizeof(c));
getch();
}
我已将此程序保存为virus.cpp。我正在使用Turbo C编译器编译该程序并从Turbo C(Ctrl + F9)运行。
我使用的是Windows 7,我安装了Avira AntiVir病毒系统。
当我尝试运行上面的程序时,它会创建一个蠕虫(DOS / Candy)。我相信程序没有错。
现在这里有一些特别的东西。执行相同的程序,但有以下区别。这里唯一的区别是\n
:
#include<stdio.h>
#include<conio.h>
union abc
{
int a;
int x;
float g;
};
struct pqr
{
int a;
int x;
float g;
} ;
void main()
{
union abc b;
struct pqr c;
clrscr();
b.a=10;
textbackground(2);
textcolor(6);
cprintf(" A = %d",b.a);
printf("\n Union = %d",sizeof(b));
printf("\n Structure = %d",sizeof(c));
getch();
}
区别仅在于\ n和空格。我的问题是,为什么我的简单程序被检测为病毒?
这是另一个代码示例,这次是C ++:
#include<iostream.h>
#include<conio.h>
class A
{
int a,b;
public:
A()
{
a=0;b=0;
}
A(int x)
{a=x;
b=0;
}
A(int x,int y)
{
a=x;
b=y;
}
~A()
{
cout<<"All things are deleted.";
}
void get()
{
cout<<"\nA = "<<a;
cout<<"\nB = "<<b;
}
};
void main()
{
A a1(5,10);
clrscr();
a1.get();
getch();
}
当我运行此程序时,它会发出“病毒警告” - 即使它不是病毒。现在,悲剧是当你删除析构函数时,它不会将其检测为病毒。
这是屏幕截图和类似的问题:
C Language - \n - creating virus
问题是如何以及为什么?
答案 0 :(得分:19)
病毒扫描程序使用启发式扫描和签名来检测漏洞。误报是不可避免的。你的程序似乎触发启发式。据推测,它的校验和,文件大小或其他特征与已知病毒相匹配。这是因为一个小的变化足以解决问题。
编辑调用您的应用程序 Virus.exe 是一个非常不幸的选择,我认为它会快速触发大多数病毒扫描程序(尽管它肯定不是一个完美的名称对于真正的病毒......)。
答案 1 :(得分:12)
看起来像假阳性。因为现代病毒使用多态来隐藏反病毒程序,所以反病毒程序必须报告部分匹配,显然你的编译器使用给定的源代码会产生与该恶意软件的部分匹配。
答案 2 :(得分:3)
我认为你在某个地方有一个真正的病毒,它可能修改了标准库:D 或者只是防病毒软件检测到可执行文件中的模式。
答案 3 :(得分:3)
请参阅http://www.viruslist.com/en/viruses/encyclopedia?virusid=1857。
我的猜测是Antivir扫描DOS / Candy包含的文本字符串,并且由于第二段代码中的那个就像它正在寻找的那个,Antivir将已编译的可执行文件检测为病毒。