通过DOS头判断一个文件是否为PE文件

通过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;
}

代码手打,可能有错误,抱歉

这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值