判断文件是否非pe文件

判断是否pe文件,我使用了文章:http://blog.csdn.net/wangningyu/article/details/4862004

里面的代码。

但是这个并不够,因为我们认为纯资源的DLL文件,其实也是属于非pe的一种。

那么如何判别这个呢?

我又找到了这篇文章,里面有对pe结构的完整的描叙:http://www.cnblogs.com/tk091/archive/2012/09/03/2669405.html

我认为这篇文章能让我快速的找到我想要了解的东西。

那么,我认为判别是否是纯资源的dll文件的一个关键的点就在于,他是否存在到导入和导出接口。

那么怎么找到导入和导出表呢,首先我们需要得到一个结构体_IMAGE_OPTIONAL_HEADER:
具体的方法可以参考http://blog.csdn.net/wangningyu/article/details/4862004这个文章。
而这个结构体里面有一个成员变量:DataDirectory
这个变量是一个IMAGE_DATA_DIRECTORY的数组。
通过文章http://www.cnblogs.com/tk091/archive/2012/09/03/2669405.html 可以查阅到
这个数组的第一个元素就是导入表。第二个元素就是导出表。

因此,我们只需要检查到导入和导出表都是空的,就完事了。

具体代码如下:


BOOL RunLua::_IsValidPEFile( CString strPathName )  
{  
    if ( ! PathFileExists( strPathName ) )  
        return FALSE;  

    HANDLE hFile = CreateFile( strPathName,   
        GENERIC_READ,   
        FILE_SHARE_READ,   
        NULL,   
        OPEN_EXISTING,   
        FILE_ATTRIBUTE_NORMAL,   
        NULL );  
    if ( hFile == INVALID_HANDLE_VALUE ) {  
        return FALSE;  
    }  

    HANDLE hMMFile = CreateFileMapping( hFile, NULL, PAGE_READONLY, 0, 0, NULL );  
    if ( hMMFile == INVALID_HANDLE_VALUE ) {  
        CloseHandle( hFile );  
        return FALSE;  
    }  

    LPVOID pvMem = MapViewOfFile( hMMFile, FILE_MAP_READ, 0, 0, 0 );  
    if ( ! pvMem ) {  
        CloseHandle( hMMFile );  
        CloseHandle( hFile );  
        return FALSE;  
    }  

    if ( *( USHORT* ) pvMem != IMAGE_DOS_SIGNATURE ) {  
        UnmapViewOfFile( pvMem );  
        CloseHandle( hMMFile );  
        CloseHandle( hFile );  
        return FALSE;  
    }  

    if ( *( ( DWORD* ) ( ( PBYTE ) pvMem + ( ( PIMAGE_DOS_HEADER ) pvMem )->e_lfanew ) ) != IMAGE_NT_SIGNATURE ) {  
        UnmapViewOfFile( pvMem );  
        CloseHandle( hMMFile );  
        CloseHandle( hFile );  
        return FALSE;  
    }  

    LPVOID pvOptionalHeader = ( PBYTE ) pvMem + ( ( PIMAGE_DOS_HEADER ) pvMem )->e_lfanew + sizeof( DWORD ) + sizeof( IMAGE_FILE_HEADER );  

    IMAGE_OPTIONAL_HEADER ioh;  
    CopyMemory( & ioh, pvOptionalHeader, sizeof( IMAGE_OPTIONAL_HEADER ) );  

    if ((ioh.DataDirectory[0].Size == 0 || ioh.DataDirectory[0].VirtualAddress == 0) && (ioh.DataDirectory[1].Size == 0 || ioh.DataDirectory[1].VirtualAddress == 0))
    {
        UnmapViewOfFile( pvMem );  
        CloseHandle( hMMFile );  
        CloseHandle( hFile );  

        return FALSE;
    }

    UnmapViewOfFile( pvMem );  
    CloseHandle( hMMFile );  
    CloseHandle( hFile );  

    return TRUE;  
} 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值