根据PE文件头判断是否合法的PE文件

本文介绍了一段用于检查PE文件合法性的代码片段,该代码能够通过PE文件头判断文件是否为合法PE文件,并进一步识别其子系统类型(Console或GUI)。文章提供了具体的实现代码并解释了检查过程。

今天修改同事的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值