簡體   English   中英

簽名掃描

[英]Signature scanning

許多使用基於簽名的惡意軟件檢測的防病毒程序。 這是為ClamAV創建簽名 我可以理解他們如何創建簽名,考慮到整個文件是惡意軟件,但我無法理解如何在文件正文中找到惡意軟件 - 哈希將是另一個。 有人知道嗎?

我的答案不是ClamAV特有的; 相反,我已經回答了一般意義上的問題。 也許這對你有幫助。

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

例如,假設病毒包含位字符串0x23956a58bd910345 我們可以將此字符串視為病毒的簽名,我們可以在系統上的文件中搜索此簽名。 但是,即使我們找到簽名,我們也無法確定我們是否已找到病毒,因為其他無辜文件可能包含相同的位串。

值得注意的是,如果文件中的位是隨機的,那么這種錯誤匹配的可能性在1/2 ^ 64時可以忽略不計。 參考

有許多方法可以為惡意軟件檢測生成簽名和/或功能。 在這里了解更多。

此外,還有其他方法可以檢測病毒:
1 異常檢測 - 也稱為行為分析 - 可執行文件的活動跟蹤,如:

  • 修改或創建的文件
  • 注冊表修改
  • 在執行之前加載了哪些DLL
  • 訪問虛擬內存
  • 創建流程
  • 打開網絡連接並傳輸數據包
  • 惡意軟件訪問的存儲區域,安裝的服務和內核驅動程序以及其他信息。
    參考

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

我們如何檢測變化? 在這方面,散列函數很有用。 假設我們計算系統上所有文件的哈希值並安全地存儲這些哈希值。 然后,我們可以定期重新計算哈希值,並將新值與先前存儲的值進行比較。 如果文件在一個或多個位位置發生了變化 - 就像病毒感染的情況一樣 - 我們會發現新計算的散列與先前計算的散列值不匹配。

改變檢測有許多缺點。 系統上的文件通常由於正常的系統功能而不是惡意行為而發生變化。 因此,更改檢測可能會產生許多誤報,這給用戶和管理員帶來了沉重的負擔。 如果將病毒插入經常更改的文件中,則可能會通過更改檢測方案。 [參考:Mark-Stam的書籍信息安全]

並且您認為正確的哈希機制是用於檢測的弱方法
在我的研究工作中,我使用14種防病毒工具對2000多種真實病毒進行了比較和分類,我發現ClamAV在檢測病毒方面非常糟糕! 這是描述MOMENTUM的論文的鏈接。

圖表顯示各種防病毒產品的檢測率

該項目是基於控制台用戶界面(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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM