教程学院
图像设计 多媒体类 机械制图 办公软件 操作系统 系统编程 网站编程 网页制作 数据库类 网络路由 网络工程 网络安全 考试认证
酷网学院
CAD
AutoCad Cam350 ProEngineer GCcam MATLAB Unigraphics SolidWorks CAXA Solid3000 Cimatron EdgeCAM
系统
安全 防火墙 病毒 WinXP Win2003 Vista
数据库
编程
网络
  网站导航: 库库中文网 · 系统编程教程 · VC语言 · VC系统类编程  

判断你地文件是否为合法地PE文件和运用类型

教程推荐
『判断你地文件是否为合法地PE文件和运用类型』如果文章有大量图片,显示会较慢,请等待图片下载完成
 
点击数: 更新时间:2009-9-29 19:34:35 
源代码下载

  可能很多的人都没有注意到一些事情,就是你的程序是不是合法的可运行的应用程序,例如一个文件只是把后缀改成 .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!

】【关闭窗口
  上一页:
  下一页:后面的文章暂时没有更新了,请多关注QQgb.com
 ·网站导航: 库库中文网 · 系统编程教程 · VC语言 · VC系统类编程
VC系统类编程:相关文章
VC系统类编程点击榜
普通教程判断你地文件是否为合法地PE文件
普通教程怎么样终止程序
普通教程mfc打印地函数
普通教程在系统进程A中通过CreateProces
普通教程在系统进程A中通过CreateProces
普通教程怎么样在视窗口中用光标框字
普通教程MFC地OnInitDialog()函数???
普通教程dlg.DoModal()不显示,跟了一下
普通教程CListCtrl中移动button直至出现
普通教程我在ClistCtrl地每行地一个单元
PHOTOSHOP - 基础教程 抠图专题 蒙版专题 3DsMax 基础 设计实例 Maya设计实例
3D设计教程
advertisement
关于站点 - 广告服务 - 联系我们 - 版权隐私 - 免责声明 - 合作伙伴 - 程序支持 - 网站地图 - 返回顶部
网站文本地图
版权所有:库库中文 2005-2007 欢迎各种媒体转载我们的原创作品[转载请注明出处]
copyright ? 2005-2008 www.QQGB.com online services. all rights reserved. 蜀ICP备05015578
Optimized for 1024x768 to Firefox,Opera and MS-IE6. Site powered by EQL. 电脑硬件 电脑知识 教程学习
红盾
热爱电脑,热爱生活
拥有电脑,拥有生命
让我们享受拥有电脑的时光