本帖最后由 studycpp 于 2011-11-27 22:13 编辑
有这样一篇文章描述了 金山等模糊hash算法
http://bbs.kafan.cn/forum.php?mod=viewthread&tid=1005272
本人通过对近10000个可执行文件等文件的研究,发现文件的关键执行部分在文件的头部 ,整个位置0.618处,以及1-0.618处 和文件末尾,因此微特征码可以从这几处提取,已经用于UncleAV的研制。文件的起始位置可以定义为PE header
ring3 code- ///1 read
- DWORD realRead=0,filePos=0;
- DWORD ptrLow;BOOL readRet;
- ptrLow=SetFilePointer(hFile,filePos,NULL,FILE_BEGIN);
- if (INVALID_SET_FILE_POINTER==ptrLow &&
- (readRet = GetLastError()) != NO_ERROR )
- {
- return ret;
- }
- readRet=ReadFile(hFile,calcData,FILE_READ_BUFFER_LEN,&realRead,NULL);
- if (readRet==FALSE)
- {
- return ret;
- }
- if (pfileInfo->dwFileLen<=FILE_HASH_MYHASH_LEN)
- {
- ret=GetHash(CALG_SHA,calcData,FILE_HASH_MYHASH_LEN,pfileInfo->pbMyHash,pfileInfo->myHashLen);
- return ret;
- }
- ///2 read
- filePos=(DWORD)(pfileInfo->dwFileLen*0.618);
- SetFilePointer(hFile,filePos,NULL,FILE_END);
- ReadFile(hFile,&calcData[FILE_READ_BUFFER_LEN],FILE_READ_BUFFER_LEN,&realRead,NULL);
- ///3 read
- filePos=(DWORD)(pfileInfo->dwFileLen*0.618);
- SetFilePointer(hFile,filePos,NULL,FILE_BEGIN);
- ReadFile(hFile,&calcData[FILE_READ_BUFFER_LEN*2],FILE_READ_BUFFER_LEN,&realRead,NULL);
- ///4 read
- filePos=FILE_READ_BUFFER_LEN;
- ptrLow=SetFilePointer(hFile,filePos,NULL,FILE_END);
- if (INVALID_SET_FILE_POINTER==ptrLow &&
- (readRet = GetLastError()) != NO_ERROR )
- {
- return ret;
- }
-
- readRet=ReadFile(hFile,&calcData[FILE_READ_BUFFER_LEN*3],FILE_READ_BUFFER_LEN,&realRead,NULL);
- if (readRet==FALSE)
- {
- return ret;
- }
- HASh code。。。。。
复制代码 |