判断是否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;
}