2011-04-07 53 views
2

編碼殺毒我想學習目的編寫的殺毒軟件。它將以簽名爲基礎。我已經編寫了一個掃描程序,它循環遍歷所有系統文件併爲每個文件創建內存映射。我現在要做的是從每個惡意文件(樣本文件)中獲取二進制簽名(十六進制),以便我可以將其與我創建的數據庫進行比較。 現在有什麼問題? 我注意到,像卡巴斯基這樣的商業AntiViruses可以從二進制文件中的任何位置選擇一個文件簽名。 現在假設我發現一個新的惡意文件,我選擇了偏移0x8766其值爲0x4F作爲該惡意文件的簽名。 現在,如果我要檢查它具有samll大小發生偏移0x8766不小文件存在的文件。這將是一個問題? 這是示例代碼代表我要去的方式:使用簽名爲基礎的技術

hFile = ::CreateFile(State.Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 
           0, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, 0);//open the file 

if(hFile !=INVALID_HANDLE_VALUE){ 
hMap= ::CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0);//create Mem mapping for the file in virtual memory 
if(hMap!=NULL){ 
base = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);//load the mapped file into the RAM 
//start to compare some bytes (values) from mspaint.exe file in Win7 
if(*((BYTE *)base + 0x1C3DF0)== 0x05) 
i++; 
if(*((BYTE *)base + 0x25250C)== 0x21) 
i++; 
if(*((BYTE *)base + 0x25272A)== 0x97) 
i++; 

if(i==3){ 
// the file is malicious 
} 

另一個問題:我是否需要對整個簽名數據庫映射在RAM之前,我開始比較又如何呢? 和你建議的簽名需要包含什麼?文件大小...等等?任何其他建議

回答

1

簽名一般不會太大,你可以搜索他們像this。但是,請記住,如果您獲得數以百計的數千個簽名(或更多),重新開始檢查每個單獨文件上的不同簽名將變得不切實際。您可以說,啓發式技術使用的每個簽名都有一定級別來決定是否進行下一級檢查以確認或拒絕匹配。

這些簽名將是相當複雜的,即說明感染文件的類型,可能的偏移位置等,從而會分層(或過濾)的方式來到達最終conlcusion。