3

シグニチャベースのマルウェア検出を使用する多くのウイルス対策プログラム。ClamAVの署名を作成しています。ファイル全体がマルウェアであることを考えると、彼らがどのように署名を作成するかは理解できますが、ファイルの本文にマルウェアが含まれている場合にマルウェアを見つける方法は理解できませんでした。ハッシュは別のものになります。誰か知ってる?

4

2 に答える 2

7

私の答えはClamAVに固有のものではありません。代わりに、私は一般的な意味で答えました。多分これはあなたのために役立ちます。

まず第一に、ウイルス署名は必ずしもファイルのハッシュ値ではありません。署名は通常、ファイル内で見つかったビットの文字列ですが、ハッシュ値を署名として使用することもできます。

たとえば、ウイルスにビットの文字列が含まれているとします0x23956a58bd910345。この文字列はウイルスのシグネチャであると見なすことができ、システム上のファイルでこのシグネチャを検索できます。ただし、署名が見つかったとしても、他の無害なファイルに同じビット文字列が含まれている可能性があるため、ウイルスが見つかったとは言えません。

ファイル内のビットがランダムである場合、そのような誤った一致の可能性は1/2^64で無視できることに注意するのは興味深いことです。参照

マルウェア検出用のシグネチャや機能を生成する方法はたくさんあります。詳細については、こちらをご覧ください。

また、ウイルスを検出する他の方法があります
。1異常検出(動作分析とも呼ばれます)は、次のような実行可能ファイルのアクティビティを追跡します。

  • 変更または作成されたファイル
  • レジストリの変更
  • 実行前にロードされたDLL
  • アクセスされた仮想メモリ
  • 作成されたプロセス
  • ネットワーク接続が開かれ、パケットが送信されました
  • マルウェアがアクセスしたストレージ領域、インストールされたサービス、カーネルドライバー、およびその他の情報。
    参照

2変更検出-予期せず変更されたファイルは、感染を示している可能性があります。

どうすれば変更を検出できますか?ハッシュ関数はこの点で便利です。システム上のすべてのファイルのハッシュを計算し、これらのハッシュ値を安全に保存するとします。次に、定期的にハッシュを再計算し、新しい値を以前に保存された値と比較できます。ウイルス感染の場合のように、ファイルが1つ以上のビット位置で変更された場合、新しく計算されたハッシュが以前に計算されたハッシュ値と一致しないことがわかります。

変更の検出には多くの欠点があります。システム上のファイルは、悪意のある動作ではなく、通常のシステム機能が原因で変更されることがよくあります。その結果、変更の検出によって多くの誤検知が発生する可能性があり、ユーザーと管理者に大きな負担がかかります。頻繁に変更されるファイルにウイルスが挿入されると、変更検出レジメンをすり抜けてしまう可能性があります。[参照: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 に答える