使用基于签名的技术编码防病毒软件

Posted

技术标签:

【中文标题】使用基于签名的技术编码防病毒软件【英文标题】:Coding AntiVirus using signatures-based technique 【发布时间】: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

另一个问题:在开始比较之前,我是否需要将整个签名数据库映射到内存中?如何进行比较? 你建议签名需要包含什么?文件大小...等?任何其他建议

【问题讨论】:

【参考方案1】:

签名一般不会太大,您可以像this 一样搜索它们。但是,请记住,如果您获得成百上千个(或更多)签名,则重新开始检查每个文件上的不同签名是不现实的。您可以说启发式算法使用每个签名的级别来决定是否进行下一级检查以确认或拒绝匹配。

这些签名将非常复杂,即描述受感染文件的类型、可能的偏移位置等,因此采用分层(或过滤)方法来得出明确的结论。

【讨论】:

以上是关于使用基于签名的技术编码防病毒软件的主要内容,如果未能解决你的问题,请参考以下文章

防病毒软件正在阻止 nodemailer - 错误:证书链中的自签名证书

每次我们重新发布软件时如何阻止防病毒误报?

一般杀毒软件检测病毒原理

Windows:防止防病毒软件阻止桌面程序安装或运行

静态分析基础技术

使用 docker 安装防病毒软件的最佳位置