博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PE操作类--判断PE文件
阅读量:2065 次
发布时间:2019-04-29

本文共 2328 字,大约阅读时间需要 7 分钟。

判断一个文件是否为合法PE文件通常只需判断“MZ”头和“PE”头

//判断是否为PE结构BOOL CPe32 ::IsPeFile(TCHAR* pFileName){             if (pFileName == NULL)            {                         return FALSE ;            }             //获得指定文件句柄             HANDLE hFile = CreateFile (pFileName, GENERIC_READ , FILE_SHARE_READ , NULL,                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , 0);             if (hFile == NULL || hFile == INVALID_HANDLE_VALUE)            {                                   return FALSE ;            }             WORD dwTempRead; //word 占两个字节,就是头两个字节,两字节的缓冲区             DWORD dwReadInFactSize; //读取字节数=2             //读取文件开始两字节,即MZ头             BOOL bRead = ReadFile(hFile, &dwTempRead, sizeof( WORD), &dwReadInFactSize, NULL);             if (!bRead || sizeof (WORD) != dwReadInFactSize)            {                        CloseHandle(hFile);                         return FALSE ;            }             if (dwTempRead != 0x5a4d)            {                        CloseHandle(hFile);                         return FALSE ;            }             //得到e_lfanew 成员在IMAGE_DOS_HEADER 结构中的偏移             // e_lfanew is File address of new exe header             DWORD dwSize = offsetof (IMAGE_DOS_HEADER, e_lfanew);             //将文件指针移动到得到e_lfanew成员            SetFilePointer(hFile, dwSize, NULL, FILE_BEGIN );             //读取得到e_lfanew成员的内容,也就是PE头在文件中的偏移            bRead = ReadFile(hFile, &dwTempRead, sizeof(WORD ), &dwReadInFactSize, NULL);             if (!bRead || sizeof (WORD) != dwReadInFactSize)            {                        CloseHandle(hFile);                         return FALSE ;            }             //将指针移动到PE头            SetFilePointer(hFile, dwTempRead, NULL, FILE_BEGIN );             //读取PE标志,NtHeader是定义的一个结构体对象             IMAGE_NT_HEADERS NtHeader = {0};             //把整个PE头结构读取            bRead = ReadFile(hFile, &NtHeader, sizeof(NtHeader), &dwReadInFactSize, NULL);             if (!bRead || sizeof (NtHeader) != dwReadInFactSize)            {                        CloseHandle(hFile);                         return FALSE ;            }             if (NtHeader.Signature != 0x4550)            {                        CloseHandle(hFile);                         return FALSE ;            }            CloseHandle(hFile);             //该文件属于PE格式,返回TRUE.             return TRUE ;}

 

转载地址:http://cpumf.baihongyu.com/

你可能感兴趣的文章
Eclipse使用(十一)—— 使用Eclipse创建简单的Maven JavaWeb项目
查看>>
Intellij IDEA使用(十三)—— 在Intellij IDEA中配置Maven
查看>>
面试题 —— 关于main方法的十个面试题
查看>>
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
Win10+VS2015编译libcurl
查看>>
Windows下使用jsoncpp
查看>>
Ubuntu下测试使用Nginx+uWsgi+Django
查看>>
Windows下编译x264
查看>>
visual studio调试内存泄漏工具
查看>>
开源Faac实现PCM编码AAC
查看>>
Windows下wave API 音频采集
查看>>
借船过河:一个据说能看穿你的人性和欲望的心理测试
查看>>
AndroidStudio 导入三方库使用
查看>>
Ubuntu解决gcc编译报错/usr/bin/ld: cannot find -lstdc++
查看>>
解决Ubuntu14.04 - 16.10版本 cheese摄像头灯亮却黑屏问题
查看>>
解决Ubuntu 64bit下使用交叉编译链提示error while loading shared libraries: libz.so.1
查看>>
MFC程序添加console窗口+printf打印输出信息
查看>>