为了学习的目的,我想编写一个AntiVirus。它将是基于签名的。我已经编写了一个扫描程序,它循环遍历所有系统文件,并为每个文件创建内存映射。我现在尝试做的是从每个恶意文件(示例文件)中获取一个二进制签名(十六进制),以便我可以将其与我创建的数据库进行比较。现在的问题是什么?我注意到,像卡巴斯基这样的商业AntiViruses会从二进制文件中的任何位置选择文件签名。现在假设我检测到一个新的恶意文件,并选择偏移量0x8766作为该恶意文件的签名。现在,如果我想检查一个小文件,该文件的偏移量为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中映射整个签名数据库吗?你建议签名需要包含什么?文件大小...etc?还有其他建议吗?
发布于 2011-04-08 12:53:42
签名通常不会太大,你可以像this一样搜索它们。但是,请记住,如果您获得了数十万个(或更多)签名,在每个单独的文件上重新开始检查不同的签名是不现实的。您可以说,启发式算法使用每个签名的级别来决定是否进行下一级检查以确认或拒绝匹配。
这些签名将非常复杂,即描述受感染文件的类型,可能的偏移位置等,从而通过分层(或过滤)方法得出最终结论。
https://stackoverflow.com/questions/5582678
复制相似问题