签名扫描

时间:2012-10-31 06:08:03

标签: security signature malware-detection

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

2 个答案:

答案 0 :(得分:7)

我的答案并非特定于ClamAV;相反,我已经回答了一般意义。也许这对你有帮助。

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

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

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

有许多方法可以为恶意软件检测生成签名和/或功能。 Learn more here.

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

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

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

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

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

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

Graph showing the detection rates of various anti-virus products

答案 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;
}