【发布时间】:2011-04-07 14:25:41
【问题描述】:
我想为学习目的编写防病毒软件。它将基于签名。我已经编写了一个扫描器,它遍历所有系统文件并为每个文件创建内存映射。我现在要做的是从每个恶意文件(示例文件)中获取二进制签名(十六进制),以便我可以将其与我创建的数据库进行比较。 现在有什么问题? 我注意到像卡巴斯基这样的商业防病毒软件会从二进制文件中的任何位置选择文件签名。 现在假设我检测到了一个新的恶意文件,我选择了偏移量 0x8766,其值为 0x4F 作为该恶意文件的签名。 现在,如果我想检查一个小文件,其中偏移量 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
}
另一个问题:在开始比较之前,我是否需要将整个签名数据库映射到内存中?如何进行比较? 你建议签名需要包含什么?文件大小...等?任何其他建议
【问题讨论】:
标签: c++ database algorithm winapi antivirus