2011-04-07 45 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。