许多使用基于签名的恶意软件检测的防病毒程序。这是creating signatures for ClamAV。我可以理解他们如何创建签名,考虑到整个文件是恶意软件,但我无法理解如何在文件正文中找到恶意软件 - 哈希将是另一个。有人知道吗?
答案 0 :(得分:7)
我的答案并非特定于ClamAV;相反,我已经回答了一般意义。也许这对你有帮助。
首先,病毒签名不是必然文件的哈希值。 签名通常是文件中找到的一串位,但哈希值也可以用作签名。
例如,假设病毒包含比特串0x23956a58bd910345
。我们可以将此字符串视为病毒的签名,我们可以在系统上的文件中搜索此签名。 然而,即使我们找到了签名,我们也无法确定我们是否已经发现了病毒,因为其他无辜的文件可能包含相同的字符串。
有趣的是,如果文件中的位是随机的,那么这种错误匹配的可能性在1/2 ^ 64时可以忽略不计。 reference
有许多方法可以为恶意软件检测生成签名和/或功能。 Learn more here.
此外,还有其他方法可以检测病毒:
1 异常检测 - 也称为行为分析 - 可执行文件的活动跟踪:
- 修改或创建的文件
- 注册表修改
- 执行前加载了哪些DLL
- 访问虚拟内存
- 创建流程
- 打开网络连接并传输数据包
- 恶意软件访问的存储区域,安装的服务和内核驱动程序以及其他信息 reference
2 更改检测 - 意外更改的文件可能表示感染。
我们如何检测变化?在这方面,散列函数很有用。假设我们 计算系统上所有文件的哈希值并安全地存储这些哈希值。然后,在 定期,我们可以重新计算哈希值并将新值与之比较 以前存储的值。如果文件在一个或多个位位置发生了变化 - 就像病毒感染的情况一样 - 我们会发现新计算的散列与先前计算的散列值不匹配。
更改检测有许多缺点。系统上的文件通常由于正常的系统功能而不是恶意行为而发生变化。因此,更改检测可能会产生许多误报,这给用户和管理员带来了沉重的负担。如果将病毒插入经常更改的文件中,则可能会通过更改检测方案。 [参考:Mark-Stam的图书信息安全]
您认为正确的哈希机制是检测的弱方法 在我的研究工作中,我使用14种防病毒工具对2000多种真实病毒进行了比较和分类,我发现ClamAV在检测病毒方面非常糟糕!以下是描述MOMENTUM的论文的链接。
答案 1 :(得分:0)
该项目是基于控制台用户界面(CUI)开发的。它具有自己的扫描算法,可以在扫描过程中在每个文件中查找恶意代码。核心思想是在所有扫描文件或目录中搜索/匹配病毒签名。通常,有90%的病毒/蠕虫具有自己的签名(在所有受影响的二进制文件或存档文件中都有一些重复文本),而其余10%的病毒是根据执行行为来识别的。
在这里,我为基于签名的扫描算法编写了代码,因此我将Virus签名存储在单独的数据库中,并且以文件平面系统格式组织。 主要功能是无需安装即可扫描系统,并且可以扫描所有文件类型的扩展名,包括隐藏文件和隐藏目录。
请从我的技术博客中找到源代码-http://www.algonuts.info/how-to-create-antivirus-using-c-programming.html
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<process.h>
#include<io.h>
#include<alloc.h>
#include<dir.h>
#include<ctype.h>
struct ffblk dblist,list;
FILE *temp_p,*dp,*vp;
char *sign = (char *) malloc(9);
char ch;
unsigned int count,first=0,found=0;
unsigned long int start,udata1,udata2,udata3;
void set_virus_name(char *);
void update_signature(char *,char *,int,int);
void set_data(char *,char *,int);
void main()
{
clrscr();
char *vfile = (char *) malloc(40);
char *dfile = (char *) malloc(40);
cout<<"\nSystem: Enter the infected filename: ";
cin>>vfile;
if(access(vfile,0)!=0)
{
cout<<"\nError : File not exist";
free(sign);
free(vfile);
free(dfile);
getch();
exit(0);
}
strcpy(sign,"LITTLE17");
udata1 = findfirst("*.db",&dblist,0);
while (!udata1)
{
first=1;
temp_p= fopen(dblist.ff_name,"r");
fread(sign,8,1,temp_p);
if(!strcmp(sign,"LITTLE17"));
update_signature(vfile,dblist.ff_name,1,0);
fclose(temp_p);
udata1=findnext(&dblist);
}
if(first==0)
{
cout<<"\nSystem: Enter the database name :";
cin>>dfile;
udata1=strlen(dfile);
if(dfile[udata1-3]=='\.'&& (dfile[udata1-2]=='D'||dfile[udata1-2]=='d') && (dfile[udata1-1]=='B'||dfile[udata1-1]=='b') )
update_signature(vfile,dfile,0,1);
else
{
cout<<"\n\nError : Create .DB extension file type";
free(sign);
free(vfile);
free(dfile);
getch();
exit(0);
}
}
else
{
if(found==0)
{
cout<<"\nSystem: Enter the database name :";
cin>>dfile;
udata1=strlen(dfile);
if(dfile[udata1-3]=='\.'&& (dfile[udata1-2]=='D'||dfile[udata1-2]=='d') && (dfile[udata1-1]=='B'||dfile[udata1-1]=='b') )
{
if(!access(dfile,0))
{
dp = fopen(dfile,"r");
fread(sign,8,1,dp);
fclose(dp);
if(!strcmp(sign,"LITTLE17"))
update_signature(vfile,dfile,1,1);
else
{
cout<<"\n\nError : Database not supported with "<<vfile;
free(sign);
free(vfile);
free(dfile);
exit(0);
}
}
else
update_signature(vfile,dfile,0,1);
}
else
{
cout<<"\n\nError: Create .DB extension file type";
free(sign);
free(vfile);
free(dfile);
exit(0);
}
}
}
free(sign);
free(vfile);
free(dfile);
getch();
}
void update_signature(char *vfile,char *dfile,int check,int add)
{
if(check==1)
{
char *temp = (char *) malloc(strlen(dfile)+1);
strcpy(temp,dfile);
char *turn = (char *) malloc(40+2+400+1);
dp = fopen(dfile,"r");
fread(sign,8,1,dp);
fread(&start,sizeof(start),1,dp);
while(1)
{
udata1=0;
while(1)
{
ch=fgetc(dp);
if(ch!=0 && ch!=32 && ch!='\n' && ch!='\t')
{
if(ch==20)
udata2=udata1;
if(ch!=22)
{
turn[udata1]=ch;
udata1=udata1+1;
continue;
}
else
break;
}
}
turn[udata1]='\0';
udata2=udata2+1;
udata3=udata2;
count=0;
udata1=0;
udata2=udata3;
vp=fopen(vfile,"r");
findfirst(vfile,&list,0);
while(udata1<list.ff_fsize)
{
fseek(vp,udata1,SEEK_SET);
ch=fgetc(vp);
if(ch!=0 && ch!=32 && ch!='\n' && ch!='\t' && ch!= 20 && ch!= 22)
{
if(ch!=turn[udata2])
{
if(count>=2)
udata1=udata1-count;
count=0;
udata2=udata3;
}
else
{
count=count+1;
udata2=udata2+1;
if(turn[udata2]==0)
{
cout<<"\n\n\nError : Unsuccessfully ! ";
cout<<"\n\nError : Virus were Already added on "<<temp;
cout<<" [ ";
udata3--;
for(count=0;count<udata3;count++)
{
if(turn[count]!=32)
cout<<turn[count];
else
cout<<" ";
}
cout<<" ]";
found=1;
break;
}
}
}
fflush(vp);
udata1=udata1+1;
}
fclose(vp);
if(found==1)
break;
ch=fread(&start,sizeof(start),1,dp);
if((ch+1)==1)
break;
}
fclose(dp);
free(temp);
free(turn);
if(found==0&&add==1)
{
set_data(vfile,dfile,check);
}
}
else
{
set_data(vfile,dfile,check);
}
}
void set_data(char *vfile,char *dfile,int check)
{
char *temp = (char *) malloc(40);
cout<<"\n\nSystem: Set the name of virus :";
gets(temp);
cout<<"\nEnter first index :";
cin>>udata1;
start=udata1;
cout<<"\nEnter last index :";
cin>>udata2;
char *vdata = (char *) malloc((udata2-udata1)+2+2+2+1);
vdata[0]=20;
udata3=1;
vp=fopen(vfile,"r");
while(udata1<=udata2)
{
fseek(vp,udata1,SEEK_SET);
ch=getc(vp);
cout<<udata1<<" "<<ch<<"\n";
if(ch!=0 && ch!=32 && ch!='\n' && ch!='\t' && ch!=20 && ch!=22)
{
vdata[udata3]=ch;
udata3=udata3+1;
vdata[udata3]='\0';
}
udata1=udata1+1;
}
fclose(vp);
vdata[udata3+1]='\0';
vdata[udata3]=22;
dp=fopen(dfile,"a+");
if(check==0)
fwrite(sign,8,1,dp);
fwrite(&start,sizeof(start),1,dp);
fwrite(temp,strlen(temp),1,dp);
free(temp);
fwrite(vdata,strlen(vdata),1,dp);
free(vdata);
fclose(dp);
cout<<"\n\nSystem: Successfully Added on "<<dfile;
}