判断一个文件是否为有效的PE文件,判断2个字段:

DOS头的e_magic字段是否为0x5A4D;

NT头的Signature字段是否为0x00004550;

若都是的话则是一个有效的PE文件;

VC6,单文档工程;

void CIspeView::OnDraw(CDC* pDC)
{CIspeDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here//HANDLE hFile = CreateFile(TEXT("test.png"), GENERIC_ALL, NULL, NULL,OPEN_EXISTING,NULL,NULL);HANDLE hFile = CreateFile(TEXT("notepad.exe"), GENERIC_ALL, NULL, NULL,OPEN_EXISTING,NULL,NULL);if (hFile == INVALID_HANDLE_VALUE){//std::cout << "打开文件失败!" << std::endl;pDC->TextOut(20,20,"打开文件失败!");CloseHandle(hFile);exit(EXIT_SUCCESS);}// 获取文件的大小DWORD dwFileSize = GetFileSize(hFile, NULL);// 申请内存空间,用于存放文件数据BYTE * FileBuffer = new BYTE[dwFileSize];// 读取文件内容DWORD dwReadFile = 0;ReadFile(hFile, FileBuffer, dwFileSize, &dwReadFile, NULL);//检查DOS头中的MZ标记,判断e_magic字段是否为0x5A4D,或者是IMAGE_DOS_SIGNATUREDWORD dwFileAddr = (DWORD)FileBuffer;//auto DosHeader = (PIMAGE_DOS_HEADER)dwFileAddr;PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)dwFileAddr;if (DosHeader->e_magic != IMAGE_DOS_SIGNATURE){// 如果不是则提示用户,并立即结束::MessageBox(NULL, TEXT("这不是一个有效PE文件"), TEXT("提示"), MB_OK);delete FileBuffer;CloseHandle(hFile);exit(EXIT_SUCCESS);}//  若都通过的话再获取NT头所在的位置,并判断Signature字段是否为0x00004550,或者是IMAGE_NT_SIGNATURE//auto NtHeader = (PIMAGE_NT_HEADERS)(dwFileAddr + DosHeader->e_lfanew);PIMAGE_NT_HEADERS NtHeader = (PIMAGE_NT_HEADERS)(dwFileAddr + DosHeader->e_lfanew);if (NtHeader->Signature != IMAGE_NT_SIGNATURE){// 如果不是则提示用户,并立即结束::MessageBox(NULL, TEXT("这不是一个有效PE文件"), TEXT("提示"), MB_OK);delete FileBuffer;CloseHandle(hFile);exit(EXIT_SUCCESS);}// 若上述都通过,则为一个有效的PE文件//MessageBox(NULL, TEXT("这是一个有效PE文件"), TEXT("提示"), MB_OK);pDC->TextOut(20,60,"这是一个有效PE文件");delete FileBuffer;CloseHandle(hFile);
}

拷贝一个test.png,notepad.exe到工程目录;

当测试test.png时如下,

测试 notepad.exe 如下,

目前程序可用;

这一句如果写为,

auto DosHeader = (PIMAGE_DOS_HEADER)dwFileAddr;
则报错,
cannot convert from 'struct _IMAGE_DOS_HEADER *' to 'int'

改为,

PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)dwFileAddr;

如果是控制台版本则需要包含 #include <windows.h>;

使用程序判断一个文件是否是有效的PE文件相关推荐

  1. 小甲鱼 OllyDbg 教程系列 (二) :从一个简单的实例来了解PE文件

    小甲鱼视频讲解: https://www.bilibili.com/video/av6889190?p=6 https://www.bilibili.com/video/av6889190?p=7 从 ...

  2. 如何用程序判断一个数独是否有效

    problem 判断一个 9x9 的数独是否有效.只需要根据以下规则,验证已经填入的数字是否有效即可. 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一 ...

  3. c语言程序判断一个字符串是否是回文数,详解判断回文字符串和回文数算法的C语言代码!...

    一.判断一个字符串是否为回文字符串 #include #include #include //包含strlen #define YES 1 #define NO  0 #define uchar un ...

  4. 微信小程序 - 判断一个经纬度是否在一个多边形区域内

    功能描述: 最近公司做了一个定位打卡的小程序,需要判断用户的经纬度是否在一个闭合的多边形区域内,在区域内允许打卡,否则提示"不再打卡范围".由于腾讯地图小程序SDK没有提供相关功能 ...

  5. 编写程序判断一个 vector<int> 容器所包含的元素是否9.20: 与一个 list<int> 容器的完全相同。

    #include<iostream> #include<list> #include<vector> using namespace std; int main(v ...

  6. 判断等腰三角形java_JAVA如何编写程序判断一个三角形是否为等腰三角形

    展开全部 package demo; import java.util.Scanner; public class Triangle { /** * 等腰 */ public static final ...

  7. 判断等腰三角形java_JAVA怎么编写程序判断一个三角形是否为等腰三角形

    package demo;import java.util.Scanner;public class Triangle{/** * 等腰 */public static final int ISOSC ...

  8. [系统安全] 四十一.APT系列(6)Python解析PE文件并获取时间戳判断来源区域

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  9. c语言怎么判断文件类型,判断你的文件是否为合法的PE文件和应用类型

    作者:赖锋 源代码下载 可能很多的人都没有注意到一些事情,就是你的程序是不是合法的可运行的应用程序,例如一个文件只是把后缀改成 .exe 的形式就显示为应用程序的图标了! 你不想写一个根据后缀名就确定 ...

最新文章

  1. excel调用python编程-使用Python对Excel进行读写操作
  2. 结构化异常捕获空指针异常
  3. 【杂谈】如何学会看arxiv.org才能不错过自己研究领域的最新论文?
  4. dac解码芯片天梯_【关于AK4499引发的思考】选DAC,解码芯片追新有没有必要?
  5. java –cp_Java –缺少字体–崩溃的应用程序!
  6. 华强北耳机版本太多,不知道如何选购?
  7. 如何利用openssl来计算md4, md5, sha1, sha256, sha384, sha512等常用哈希值?
  8. 要把AI建在赤道上的华为,为何用全栈全场景方案打响第一枪
  9. Java反射机制获取系统@Hide属性
  10. 关于郭天祥51开发板无法烧敲代码问题的解决(Prolific USB-to-Serial Comm Port)
  11. 一页纸搞定项目管理:定义、要素及操作步骤(附可编辑模板及电子书)
  12. 预加重、去加重和均衡
  13. python hist2d_matplotlib可视化之hist直方图
  14. 《Java 程序设计任务驱动式实训教程》pdf,附下载链接
  15. 离散数学笔记--重言式
  16. cubeIDE开发,在LCD显示摄像头抓取的图片数据
  17. sa提开放系统下的虚拟新贵Virtualbox权技巧之xp_regwrite替换sethc.exe
  18. 微软的Framework导致该内存不能为written或read的错误?
  19. 大数据----2.基础环境搭建
  20. OpenSSL SSL_read: Connection was reset, errno 10054

热门文章

  1. DNS协议报文(RFC1035)
  2. 常用基础参数PrintGCDetails回收前后对比讲解
  3. hibernate同时插入两条相同数据(偶尔)原因调查
  4. Mac 技术篇-pip下载速度慢解决办法,pip秒速下载,阿里云镜像配置
  5. C++ leetcode 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外
  6. 信号公式汇总之傅里叶变换
  7. pcb入门之原理图的绘制
  8. 三次样条插值Python实现
  9. Scrapy项目 - 数据简析 - 实现腾讯网站社会招聘信息爬取的爬虫设计
  10. Codeforces Round #516 (Div. 1) 题解