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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言项开发班级登入系统,c语言--班级管理系统

满意答案dgfetc5832013.12.10采纳率:47% 等级:12已帮助:14710人class student{public:char m_strName[10]; // 姓名int m_nNum; // 学号float m_dScore[4]; // 成绩};void InputScore(student* p, int nNumber){if(nNumber > 10){print…

android 高度百分比,如何在Android中进行百分比高度和宽度?

现在,可以用Guidelines定位百分比值xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"android:layout_width"match_parent"android:layout_height"match_parent&q…

android 知识点大全,Android基础知识总结(一)

1.面向对象(OOP):针对业务处理过程的实体及其属性和行为进行抽象封装以获得高效清晰的逻辑单元划分。三大特性:①封装(隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变量隔离便于使用,提高代码的服用小和安全性…

android fragment 弹出对话框,Android中使用Dialogfragment显示对话框

其他注意事项:1、如何设置自己的Dialogfragment没有标题栏?可以通过两种方法来设置 ,一种是使用dialogfragment的setStyle函数,另外就是使用getDialog().getWindow().requestFeature方法,具体代码如下Overridepublic D…

android sd卡不可写,Android检查SD卡是否可读写

因为external storage可能是不可用的,比如遇到SD卡被拔出等情况时。因此在访问之前应对其可用性进行检查。我们可以通过执 行 getExternalStorageState()来查询external storage的状态。若返回状态为MEDIA_MOUNTED, 则 可以读写。/* Checks if external storage is …

Android7.0 emui主题,全新EMUI5.0基于Android7.0 天生快,一生快!

EMUI5.0是基于Android 7.0开发的全新一代操作系统。 循着神秘古老的爱琴海带来的灵感,EMUI5.0用户界面的设计极其简单干净,令人赏心悦目。 因了解用户习惯而全新改善,EMUI5.0流畅自然的表现不会随时间递减,让生活得心应手&#xf…

html生成原理,Axure生成HTML的原理是什么?

回答:云渲染平台分布式并行计算分为空间上的并行和时间上的并行。空间上的并行是指用多个处理器并发的执行计算,比如Mentalray渲染器就支持单帧画面分割渲染,时间上的并行就是指流水线技术。云渲染平台现在的集群计算系统的前沿科学研究主要是…

在微信公众号中写html代码吗,微信公众号代码编写怎么做

微信公众号编写微信代码,因为有这方面的需要,需要去进行微信公众号代码编写。以下是学习啦小编为您带来的关于微信公众号代码编写,希望对您有所帮助。微信公众号代码编写微信公众平台编辑器不能直接编写微信代码,但是可以通过第三…

html代码在线分析,网站html代码解析

1、什么是HTML文件?HTML中文叫做“超文本标记语言”,一个HTML文件不仅包含文本内容,还包含一些标记,一个HTML文件的后缀名是.htm或者是.html。用文本编辑器(Dreamweaver)就可以编写HTML文件。2、html文件的基本结构:(成…

html 下拉到一定位置,浏览器向下滚动到一定位置继续滚动时,侧边导航固定在页面顶部,再滚动到一定位置时页面再向下滚动侧边导航不再固定。这种效果怎么实现呢...

1.浏览器向下滚动到一定位置继续滚动时,侧边导航固定在页面顶部,再滚动到一定位置时页面再向下滚动侧边导航不再固定。页面向上滚动到一定位置继续滚动时,侧边导航保持在原来位置。这种效果怎么实现呢2.、参考代码:$(function(){/…

济源一中2021高考成绩查询入口,济源一中2019高考成绩喜报、一本二本上线人数情况...

济源一中2019年高考喜报2019年高考成绩揭晓,济源一中再创辉煌!普通类(不含体育、艺术)一本上线突破1500大关,达到1549人,比去年增加51人,再创历史新高。高分段成绩喜人,全省文科裸分前50名,我校…

用户可以改变计算机功能键吗,电脑键盘快捷键怎么更改

许多用户朋友想更改自己电脑的快捷键?下面小编整理了解决更改电脑快捷键的方法,希望能帮到大家O***∩_∩***O哈哈~更改电脑快捷键的方法点击电脑屏幕的最左下角的“开始菜单”,此时弹出总程序菜单,如图:点击【所有程序】&#xf…

2017年网络统考计算机成绩,2017年12月江苏省成人计算机基础统考成绩查询

问: 关于江苏省成人高考计算机统考答:成人教育的学生在校期间每年6月/1月有二次省计算机统考,考试大纲你可以在江苏省教育考试院网上查询。考试内容全在里面,像你说的有WORD 、EXCEL PPT 、(没有CAD)。一般学校会开设此课程。每一个学生必须通…

计算机专业的英语文献,计算机专业英语论文参考文献

bentuoguai高分答主08-08TA获得超过1351个赞关于计算机信息管理系统,可以参考了:)~~Enterprise computer network management information system(MIS) is gradually use, it is the stage sign of our country of production power development, is the…

如何擦除计算机连接网络的记录,彻底清除网络浏览记录的六个方法 -电脑资料...

当我们上网的时候,可能会使用电子信箱,这样就会留下账号;可能会访问一些网站,这样会留下上网信息;可能会登录一些电子商务网站,那账号和密码则会默认保存在系统之中……这样,一旦自己的电脑被入侵&#xff…

未来计算机作文1000字,未来的生活作文1000字

夜幕降临了,我早早地上了床,进入了甜甜的梦乡之中。一觉醒来,咦?我这是在哪儿呢?我惊奇地发现自己根本没有躺在自己的床上。我紧张极了,急忙掀开被子下了床……万万没想到的是,我的脚刚触碰到地…

计算机博士与管理科学与工程博士,管理科学与工程一级学科博士点简介

管理科学与工程是管理学门类中的一级学科,侧重于研究同现代生产经营、科技、经济和社会等发展相适应的管理理论、方法与工具,应用现代科学方法与科技成就来阐明和揭示管理活动的规律,以提高管理的效率。东华大学早在1959年设立工业管理工程本…

福师计算机在线作业一2,福师《计算机》在线作业二答案.doc

福师《计算机导论》在线作业二一、单选题(共?20?道试题,共?40?分。)V1.??对多媒体计算机系统,下列设备中,( )不属于图像信息输入/输出设备。A. 绘图仪B. DVD光盘驱动器C. 扫描仪D. 彩色喷墨打印机??????满分:2??分2…

php在指定html元素中输出,如何从PHP中的数组输出html svg元素?

我有svg元素的数组。我必须从列出的阵列中打印出来。我试图打印它,但它不工作。请指导我如何获取浏览器上呈现的svg元素。actualy有阵列中的其他项目我没有表现出bcoz的字符限制如何通过SVG标记元素循环如何从PHP中的数组输出html svg元素?foreach($item…

四川大学计算机应用基础第二次,四川大学川成教2017年秋季《计算机应用基础》第二次作业...

四川大学成教2017年秋季《计算机应用基础》第二次作业一、单项选择题。本大题共50个小题,每小题2.0 分,共100.0分。在每小题给出的选项中,只有一项是符合题目要求的。1.电子工作表中每个单元格的默认格式为___D_____。A.数字B.文本C.日期D.常…