今天修改同事的PE文件扫描程序,结果发现扫描出来的有些文件只是一些PE文件的尸体,缺胳膊断腿的,不忍再拿来解剖了,到网上搜了一个根据PE文件头判断是否是合法PE文件的代码片段,该代码片段还有判断一个程序的子系统类型功能(Console还是GUI)。大致代码如下:
BOOL IsValidPEFile(LPTSTR tszFullFileName) { HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hMapping = INVALID_HANDLE_VALUE; LPVOID pvMem = NULL; BOOL bIsPE = FALSE; if (!PathFileExists(tszFullFileName)) { return bIsPE; } // 根据PE签名判断当前文件是否是合法的PE文件 hFile = CreateFile( tszFullFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if ( hFile == INVALID_HANDLE_VALUE ) { ::_tprintf_s(_T("CreateFile failed./r/n")); goto __cleanup; } hMapping = CreateFileMapping( hFile, NULL, PAGE_READONLY, 0, 0, NULL ); if ( hMapping == INVALID_HANDLE_VALUE ) { ::_tprintf_s(_T("CreateFileMapping failed./r/n")); goto __cleanup; } pvMem = MapViewOfFile( hMapping, FILE_MAP_READ, 0, 0, 0 ); if (NULL == pvMem) { ::_tprintf_s(_T("MapViewOfFile failed./r/n")); goto __cleanup; } // 是否包含有DOS签名 if ( *( USHORT* ) pvMem != IMAGE_DOS_SIGNATURE ) { ::_tprintf_s(_T("无DOS签名./r/n")); goto __cleanup; } // 是否包含有NT签名 if ( *( ( DWORD* ) ( ( PBYTE ) pvMem + ( ( PIMAGE_DOS_HEADER ) pvMem )->e_lfanew ) ) != IMAGE_NT_SIGNATURE ) { ::_tprintf_s(_T("无NT签名./r/n")); goto __cleanup; } bIsPE = TRUE; __cleanup: if (pvMem != NULL) { UnmapViewOfFile(pvMem); } if (hMapping != INVALID_HANDLE_VALUE) { CloseHandle(hMapping); } if (hFile != INVALID_HANDLE_VALUE) { CloseHandle(hFile); } return bIsPE; }
啥都不用解释了,代码已经说明一切;
更详细的代码片段,请到这里下载:http://download.csdn.net/source/2111704
本文介绍了一段用于检查PE文件合法性的代码片段,该代码能够通过PE文件头判断文件是否为合法PE文件,并进一步识别其子系统类型(Console或GUI)。文章提供了具体的实现代码并解释了检查过程。

35万+

被折叠的 条评论
为什么被折叠?



