欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

判断文件是否是PE文件

程序员文章站 2022-03-05 09:55:47
...

判断一个文件的文件属性是不是PE文件:主要思路就是:比较文件的DOS头和NT头的白哦之是不是“MZ”和“PE”,判断文件是不是EXE文件或者DLL文件或者其他的主要思路是:获取文件的文件头的Characteristis字段,根据字段值进行判断
下边贴上源码

#include <stdio.h>
#include <Windows.h>
int main()
{
	printf("请输入您要检测的文件");
	char path[MAX_PATH];
	gets(path);
	LPCSTR   lpFileName=path;//要判断的文件的完整路径
	HANDLE   hFile;//要打开的文件的句柄
	DWORD    nNumberOfBytesToRead;//要检测的文件的大小
	LPDWORD  lpFileSizeHigh;
	hFile=CreateFileA(lpFileName,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);//打开要判断的文件
	if(hFile==INVALID_HANDLE_VALUE)
	{
		MessageBoxA(0,"文件打开失败",0,MB_OK);
	}
	nNumberOfBytesToRead=GetFileSize(hFile,0);
	CHAR *lpBuffer=new CHAR[nNumberOfBytesToRead];//指向读取文件的缓冲区
	ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,NULL,NULL);//读取文件内容到内存中,这个时候lpBuffer指向文件开始的地方
	PIMAGE_DOS_HEADER pDosHeader=(PIMAGE_DOS_HEADER)lpBuffer;//定义DOS头结构体
	PIMAGE_NT_HEADERS  pNtHeader=(PIMAGE_NT_HEADERS)(pDosHeader->e_lfanew+lpBuffer);//移动指针到NT头
	PIMAGE_FILE_HEADER  FileHeader=&(pNtHeader->FileHeader);//定义文件头,移动指针
	if(pDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)//判断MZ标志位
	{
		MessageBoxA(0,"This File Is Not EXE File",0,MB_OK);
	}
	else
		if(pNtHeader->Signature!=IMAGE_NT_SIGNATURE)//判断PE标志位
		{
			MessageBoxA(0,"This File Is Not EXE File",0,MB_OK);
		}
		else
		{
			MessageBoxA(0,"This File Is A PE",0,MB_OK);
			switch(FileHeader->Characteristics)
			{
			case 0x2000:
				MessageBoxA(0,"This File Is A DLL",0,MB_OK);
				break;
			case 0x0002:
				MessageBoxA(0,"This File Is A EXE",0,MB_OK);
			case 0x1000:
				MessageBoxA(0,"This File Is A SystemFile",0,MB_OK);
			}
		}
		
}

注意:(上边代码的switch case 结构的代码,其实严格来说不算正确,但是是在PE文件的基础上再次进行文件属性判断的一个思路)
上边采用的方法,相对来说比较浪费内存空间,因为在读取的过程中,采用的方法是直接将文件全部读取到程序内存中,实际上在比较的过程中完全可以一部分一部分的读取进行判断,这样的话,也就相对比较节省时间和节约内存 原理大致相同  
附上链接:
https://blog.csdn.net/dyxcome/article/details/91358070

相关标签: Windows API