日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言怎么判断文件类型,判断你的文件是否为合法的PE文件和应用类型

發布時間:2025/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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文件和应用类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。