区别就在于MD5可以随便一动,云就失效了,微特征就没这么简单了
蓝天白云520 发表于 2010.6.23 12:11 晕,别把什么所谓的“微特征”想的这么神奇,还说什么比MD5等高出一层,无语。
为了避免说口水,我直接贴段代码,看仔细了:
- CString MD5_Caculate_File ( CString szFileName )
- {
- CString MD5_Value_String = "" ;
- HANDLE hFile = CreateFile ( szFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, \
- NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ;
- if ( hFile == INVALID_HANDLE_VALUE )
- {
- MD5_Value_String.Format ( "CreateFile Error ( code:%d )!", GetLastError() );
- return MD5_Value_String;
- }
- HANDLE hFileMap = CreateFileMapping ( hFile, NULL, PAGE_READWRITE, 0, 0, NULL ) ;
- if ( hFileMap == NULL )
- {
- MD5_Value_String.Format ( "CreateFileMapping Error ( code:%d )!", GetLastError() );
- CloseHandle ( hFile ) ;
- return MD5_Value_String ;
- }
- PVOID pMapView = MapViewOfFile ( hFileMap, FILE_MAP_READ, 0, 0, 0 ) ;
- if ( pMapView == NULL )
- {
- MD5_Value_String.Format ( "MapViewOfFile Error ( code:%d )!", GetLastError() );
- CloseHandle ( hFileMap ) ;
- CloseHandle ( hFile ) ;
- return MD5_Value_String ;
- }
- DWORD dwLowDWord = 0, dwHighDWord = 0 ;
- dwLowDWord = GetFileSize ( hFile, &dwHighDWord ) ;
- UINT64 uFileSize = ( dwHighDWord << 32 ) + dwLowDWord ;
- MD5_CONTEXT MD5_Value ;
- memset ( &MD5_Value, 0, sizeof(MD5_Value) ) ;
- if ( MD5_Caculate( &MD5_Value, (BYTE*)pMapView, uFileSize*8) )
- {
- CString TempString ;
- MD5_Value_String = "" ;
- for ( int i = 0; i < 16; i++ )
- {
- TempString.Format ( "%02X", ((BYTE*)&MD5_Value)[i] ) ;
- MD5_Value_String += TempString ;
- }
- }
- UnmapViewOfFile ( pMapView ) ;
- CloseHandle ( hFileMap ) ;
- CloseHandle ( hFile ) ;
- return MD5_Value_String ;
- }
复制代码
这是计算一个文件md5值的核心函数,其他的代码省略了,没完全贴出。
仔细看计算的代码,核心是:
MD5_Caculate( &MD5_Value, (BYTE*)pMapView, uFileSize*8)
解释下这个函数,
bool MD5_Caculate ( MD5_CONTEXT* MD5_Value, BYTE* SourceMsg, __int64 uMsgLength )
其中第一个参数是计算得的MD5值,第二个参数是所要计算代码的起始地址,第三个参数是长度。
其实,一般所说的一个文件的MD5值,是指对整个文件进行md5计算,而你所说的“微特征”,只是截取了某1段,进行hash计算而已。
截取的这段可以为PE头,可以是.code段,甚至可以是.rsrc段,在精确点,可以为某个具体特征函数进行段hash计算。
这个涉及到特征的提取,如果仅仅是以区段计算,或者某个代码区间(比如0x00401000-0x00402000),这样完全可以自动话操作,跟计算整个文件上难度没任何变化。这个以计算整个文件的MD5来匹配,又有什么本质的区别?
而要精确到某个函数的话,这事毕要经过人工的分析才能提取,这又跟传统的特征码查杀有什么区别?
可以看到,无论如何,真正的核心还是这个函数,修改参数而已,并没有本质的提升,所以你说的高出一个档次,根本就是扯淡。
当然,算法可以改,不仅仅要是MD5,任何hash算法,甚至自己写的算法都可以用来作为特征。这个从本质上也是一样的,没有任何高出一个档次的东西。
当然,不可否认,只匹配某段特征的hash值,的确是个不错的方法。多学学技术,少点口水吧,踏实点做做学问吧。
|