通过DOS头判断一个文件是否为PE文件,可以用工具查看,也可以通过代码的形式让程序自动的查看
这段代码是一下这样的结构:
1. 加载要判断的文件
2. 计算文件的大小
3. 把文件的二进制信息读进程序中创建的一段缓冲区中
4. 通过缓冲区中的首地址转换成Dos头的位置
5. 通过Dos头的IMAGE_DOS_HEADER类型的变量点出e_magic变量
6. 因为所有的PE 文件的Dos头中的e_magic的成员变量都是“5A 4D”,转换成字符就是“MZ”,我们就通过这两个字节来判断一个文件是否为PE文件
代码如下:
#incldue "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
//1.加载文件
//1.1打开文件
HANDLE hFile = CreateFile(L"F://1.exe",
GENERIC_READ,
NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
//2.获取文件大小
DWORD FileSize = GetFileSize(hFile, NULL);
//3.申请一块和内存
PBYTE pFile = new BYTE[FileSize] {};
//3.1把文件读进申请的内存中
DWORD dwRead = 0;
ReadFile(hFile, pFile, FileSize, &dwRead,NULL);
//4.把获取到的缓冲区的首地址强转成IMAGE_DOS_HEARD变量
IMAGE_DOS_HEADER *pDos = (PIMAGE_DOS_HEADER)pFile;
//5.通过pDos点出e_magic变量
if(pDos->e_magic != IAMGE_DOS_SIGNATURE)
{
MessageBox(NULL,L"这不是一个PE文件",NULL,NULL);
}
else{
char mz[3] = {};
memcpy_s(mz,3,&(pDos->e_magic),sizeof(pDos->e_magic));
ptintf("%s\n",mz);
printf("这是一个PE文件\n");
}
system("pause");
return 0;
}
代码手打,可能有错误,抱歉