3

许多防病毒程序使用基于签名的恶意软件检测。这是为 ClamAV 创建签名。考虑到整个文件是恶意软件,我可以理解他们如何创建签名,但我不明白如何在文件正文中找到恶意软件 - 哈希将是另一个。有人知道吗?

4

2 回答 2

7

我的回答并非针对 ClamAV;相反,我在一般意义上回答了。也许这对你有帮助。

首先,病毒签名不一定是文件的哈希值。签名通常是在文件中找到的一串位,尽管哈希值也可以用作签名。

例如,假设病毒包含比特串0x23956a58bd910345。我们可以认为这个字符串是病毒的签名,我们可以在系统的文件中搜索这个签名。然而,即使我们找到了签名,我们也不能确定我们已经找到了病毒,因为其他无辜的文件可能包含相同的位串。

有趣的是,如果文件中的位是随机的,那么这种错误匹配的可能性在 1/2^64 时可以忽略不计。参考

有许多方法可以为恶意软件检测生成签名和/或特征。在这里了解更多。

此外,还有其他检测病毒的方法:
1异常检测- 也称为行为分析- 跟踪可执行文件的活动,例如:

  • 修改或创建的文件
  • 注册表修改
  • 执行前加载了哪些 DLL
  • 访问的虚拟内存
  • 创建的流程
  • 网络连接打开并传输数据包
  • 恶意软件访问的存储区域、安装的服务和内核驱动程序以及其他信息。
    参考

2更改检测- 意外更改的文件可能表明存在感染。

我们如何检测变化?散列函数在这方面很有用。假设我们计算系统上所有文件的哈希值并安全地存储这些哈希值。然后,我们可以定期重新计算哈希值并将新值与之前存储的值进行比较。如果一个文件在一个或多个位位置发生了变化——就像病毒感染的情况一样——我们会发现新计算的哈希值与之前计算的哈希值不匹配。

变化检测有很多缺点。系统上的文件经常由于正常的系统功能而不是恶意行为而发生变化。因此,变更检测可能会产生许多误报,这给用户和管理员带来了沉重的负担。如果将病毒插入到经常更改的文件中,它很可能会通过更改检测方案。[参考:Mark-Stam 的书籍信息安全]

而你认为正确的散列机制是检测的弱方法
在我的研究工作中,我使用 14 种防病毒工具对 2000 多种真实病毒进行了比较和分类,我发现 ClamAV 在检测病毒方面非常糟糕!这是描述MOMENTUM的论文的链接。

图表显示各种反病毒产品的检测率

于 2012-11-02T14:58:10.577 回答
0

该项目是基于控制台用户界面 (CUI) 开发的。它有自己的扫描算法,用于在扫描期间在每个文件中查找恶意代码。核心思想是搜索/匹配所有扫描文件或目录中的病毒特征码。通常,90% 的病毒/蠕虫具有自己的签名(在所有受影响的二进制文件或存档文件中都有一些重复的文本),剩下 10% 的病毒是根据执行行为来识别的。

在这里,我为基于签名的扫描算法编写了代码,因此我将病毒签名存储在单独的数据库中,并以文件平面系统格式组织。主要特点是无需安装即可扫描系统,并允许扫描所有文件类型扩展名,包括隐藏文件和隐藏目录。

请从我的技术博客中找到源代码 - 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;
}
于 2019-05-06T07:46:37.553 回答