Сканирование подписи

многие антивирусные программы используют обнаружение вредоносных программ на основе сигнатур. Вот создание подписей для ClamAV. Я могу понять, как они создают сигнатуры, учитывая, что весь файл является вредоносным ПО, но я не мог понять, как найти вредоносное ПО, когда оно находится в теле файла - хэш был бы другим. Кто-нибудь знает?


person Lando    schedule 31.10.2012    source источник


Ответы (2)


Мой ответ не относится к ClamAV; вместо этого я ответил в общем смысле. Возможно, это будет полезно для вас.

Во-первых, сигнатура вируса обязательно не является хеш-значением файла. Подпись обычно представляет собой строку битов, найденную в файле, хотя хеш-значение также может использоваться в качестве подписи.

Предположим, например, что вирус содержит строку битов 0x23956a58bd910345. Мы можем считать эту строку сигнатурой вируса и искать эту сигнатуру в файлах системы. Однако, даже если мы найдем сигнатуру, мы не можем быть уверены, что нашли вирус, поскольку другие безобидные файлы могут содержать ту же строку битов.

Интересно отметить, что если бы биты в файлах были случайными, вероятность такого ложного совпадения была бы незначительной при 1/2^64. ссылка

Существует множество способов создания сигнатур и/или функций для обнаружения вредоносных программ. Подробнее здесь.

Кроме того, существует и другой способ обнаружения вирусов:
1 Обнаружение аномалий, также известный как анализ поведения, — отслеживание действий исполняемого файла, например:

  • Измененные или созданные файлы
  • Изменение реестра
  • Какие библиотеки DLL были загружены перед выполнением
  • Доступ к виртуальной памяти
  • Созданные процессы
  • Открытые сетевые соединения и переданные пакеты
  • К каким областям хранения обращалось вредоносное ПО, установленным службам и драйверам ядра, а также другой информации.
    ссылка

2 Обнаружение изменений — неожиданное изменение файла может указывать на заражение.

Как мы можем обнаружить изменения? В этом отношении полезны хеш-функции. Предположим, мы вычисляем хэши всех файлов в системе и надежно сохраняем эти хеш-значения. Затем через равные промежутки времени мы можем пересчитывать хэши и сравнивать новые значения с ранее сохраненными значениями. Если файл изменился в одной или нескольких битовых позициях — как это может быть в случае заражения вирусом — мы обнаружим, что вновь вычисленный хеш-код не соответствует ранее вычисленному значению хеш-функции.

Обнаружение изменений имеет много недостатков. Файлы в системе часто изменяются из-за обычных системных функций, а не злонамеренного поведения. В результате обнаружение изменений может привести к большому количеству ложных срабатываний, что ложится тяжелым бременем на пользователей и администраторов. Если вирус внедряется в файл, который часто изменяется, он, скорее всего, не пройдет проверку режимом обнаружения изменений. [ссылка: Книга Марка-Стама «ИНФОРМАЦИОННАЯ БЕЗОПАСНОСТЬ»]

И вы считаете, что правильный хеш-механизм — слабый метод обнаружения.
В своей исследовательской работе я сравнил и классифицировал более 2000 реальных вирусов, используя 14 антивирусных инструментов, и обнаружил, что ClamAV очень плохо справляется с обнаружение вируса! Вот ссылка на статью с описанием
MOMENTUM.

График, показывающий уровень обнаружения различных антивирусных продуктов

person Grijesh Chauhan    schedule 02.11.2012
comment
Но ClamAv имеет открытый исходный код, поэтому мы можем видеть его коды ;) Не могли бы вы порекомендовать какую-нибудь литературу или источники об анализе поведения, потому что я не мог понять, как он работает, из того, что я нашел в Google? - person Lando; 07.11.2012
comment
- Команда $: sudo apt-get source clamav. Я чувствую, что вы новичок в анализе вредоносных программ: книга Peter-Szor — лучшая книга для начала. Анализ поведения относится к категории динамического анализа. Читайте здесь: 0xbadcab1e.lu/papers/analyse.pdf. Также читайте из компьютерной вирусологии. В каком стандарте вы находитесь? - person Grijesh Chauhan; 07.11.2012
comment
Да, я новичок в этом. Итак, я не уверен, что понимаю, что вы имеете в виду под стандартом, но спасибо за ссылку на книгу, она кажется полезной. - person Lando; 09.11.2012
comment
Я имею в виду, что ты делаешь? Я также хотел бы порекомендовать вам изучить ollyDBG для Dynamic — Cuckoo & Ether ether.gtisc.gatech. edu/malware.html ... - person Grijesh Chauhan; 09.11.2012

Этот проект разработан на основе пользовательского интерфейса консоли (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;
}
person Karthikeyan Moorthy    schedule 06.05.2019