[英]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.