c语言怎么判断文件类型,判断你的文件是否为合法的PE文件和应用类型
作者:賴鋒
源代碼下載
可能很多的人都沒有注意到一些事情,就是你的程序是不是合法的可運行的應用程序,例如一個文件只是把后綴改成 .exe 的形式就顯示為應用程序的圖標了! 你不想寫一個根據后綴名就確定應用程序類型的程序吧!這樣太哪個了吧!解決方法就是根據PE文件格式來解釋。關于PE文件格式的資料現在網上汗牛充棟,這里我就不再解釋,有興趣的朋友可以上網查閱PE文件格式資料。我就簡單的用代碼去演示如何判斷PE文件合法,主要就是兩個地方,頭為”MZ”簽名,跟著DOS頭部的就是”PE”簽名,任何標準的PE文件都會包含這兩個簽名。如下這段代碼所示,這是一個判斷是否為合法PE文件的API。
通過文件映射實現PE文件內容的讀取。BOOL 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 ) {
TRACE1( “Failed To Open File %s !\n”, strPathName );
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;
}
UnmapViewOfFile( pvMem );
CloseHandle( hMMFile );
CloseHandle( hFile );
return TRUE;
}這段代碼實現了對PE文件合法性的判斷。
但是,我還希望對應用程序的類型作一個更加徹底的判斷,如何知道應用程序是基于窗口形式的還是基于命令行形式的程序呢?
其實PE文件中早已經包含了這種程序類型的標志!這個標志包含在PE文件的頭部IMAGE_NT_HEADER的結構中的IMAGE_OPTIONAL_HEADER的Sybsystem記錄! 看看”winnt.h”中對Sybsystem的宏定義。
#define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
#define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn’t require a subsystem.
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem.
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character System
#define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem.
#define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image runs in the Posix character subsystem.
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // image is a native Win9x driver.
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Image runs in the Windows CE subsystem. 通過這些定議則可以輕易的判斷應用程序是何種形式的,當Subsystem的值為IMAGE_SUBSYSTEM_WINDOWS_GUI的時候,則可以確定這個程序是基于圖形界面的,當它的值為IMAGE_SUBSYSTEM_WINDOWS_CUI的時候可以確定它為命令行的程序了。 核心的代碼如下: 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.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI ) {
UnmapViewOfFile( pvMem );
CloseHandle( hMMFile );
CloseHandle( hFile );
return TRUE;
} 這個詳細解釋我就略過了,只要得到 IMAGE_OPTIONAL_HEADER 這個結構,再根據 subsytem這個位再判斷類型。呵,這篇文章就到 這結束了,當然,為了證實以上代碼結果,我當然會附一上份Demo!
來源:http://www.vckbase.com/document/viewdoc/?id=1893coolker2010-01-26 00:27:09
總結
以上是生活随笔為你收集整理的c语言怎么判断文件类型,判断你的文件是否为合法的PE文件和应用类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 教程概要,Android
- 下一篇: uos配置 java 环境变量_Cent