提取 PE 文件的各种信息

  

      前段时间项目需要实现对 Windows PE 文件版本信息的提取,如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在 Windows 下当然有一系列的 API 函数供调用,简单方便。

        我们先看一下PE文件结构,PE文件由DOS首部,PE文件头,块表,块和调试信息组成,有关PE文件的数据结构信息在winnt.h中定义。

文章不过多赘述,直接上代码简单明了。

实现代码:

#include "stdafx.h"
#include <Windows.h>extern void DirectoryString(DWORD dwIndex);int _tmain(int argc, _TCHAR* argv[])
{//获取文件句柄HANDLE hFile = CreateFile(_T("D:\\Wmplayer.exe"),GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//获取文件大小DWORD dwFileSize = GetFileSize(hFile, NULL);CHAR *pFileBuf = new CHAR[dwFileSize];//将文件读取到内存DWORD ReadSize = 0;ReadFile(hFile, pFileBuf, dwFileSize, &ReadSize, NULL);//判断是否为PE文件PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pFileBuf;if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE){printf("非 PE 文件\n");system("pause");return 0;}PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)(pFileBuf + pDosHeader->e_lfanew);if (pNtHeader->Signature != IMAGE_NT_SIGNATURE){printf("非 PE 文件\n");system("pause");return 0;}//获取基本PE头信息//获取信息所用到的两个结构体指针	(这两个结构体都属于NT头)PIMAGE_FILE_HEADER		pFileHeader		= &(pNtHeader->FileHeader);PIMAGE_OPTIONAL_HEADER	pOptionalHeader	= &(pNtHeader->OptionalHeader);//输出PE头信息printf("================== 基 本 P E 头 信 息 ==================\n\n");printf("入 口 点:\t%08X\t", pOptionalHeader->AddressOfEntryPoint);printf("子 系 统:\t%04X\n", pOptionalHeader->Subsystem);printf("镜像基址:\t%08X\t", pOptionalHeader->ImageBase);printf("区段数目:\t%04X\n", pFileHeader->NumberOfSections);printf("镜像大小:\t%08X\t", pOptionalHeader->SizeOfImage);printf("日期时间标志:\t%08X\n", pFileHeader->TimeDateStamp);printf("代码基址:\t%08X\t", pOptionalHeader->BaseOfCode);printf("部首大小:\t%08X\n", pOptionalHeader->SizeOfHeaders);printf("数据基址:\t%08X\t", pOptionalHeader->BaseOfData);printf("特 征 值:\t%04X\n", pFileHeader->Characteristics);printf("块 对 齐:\t%08X\t", pOptionalHeader->SectionAlignment);printf("校 验 和:\t%08X\n", pOptionalHeader->CheckSum);printf("文件块对齐:\t%08X\t", pOptionalHeader->FileAlignment);printf("可选头部大小:\t%04X\n", pFileHeader->SizeOfOptionalHeader);printf("标 志 字:\t%04X\t\t", pOptionalHeader->Magic);printf("RVA数及大小:\t%08X\n\n", pOptionalHeader->NumberOfRvaAndSizes);printf("======================= 目 录 表 =======================\n");//获取目录表头指针PIMAGE_DATA_DIRECTORY pDataDirectory = pOptionalHeader->DataDirectory;printf("\t\t  RAV\t\t  大小\n");for (DWORD i = 0; i < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; i++){DirectoryString(i);printf("%08X\t%08X\n",pDataDirectory[i].VirtualAddress, pDataDirectory[i].Size);}printf("======================= 区 段 表 =======================\n");//获取区段表头指针PIMAGE_SECTION_HEADER pSectionHeader = IMAGE_FIRST_SECTION(pNtHeader);printf("名称      VOffset   VSize     ROffset   RSize     标志\n");//获取区段个数DWORD dwSectionNum = pFileHeader->NumberOfSections;//根据区段个数遍历区段信息for (DWORD i = 0; i < dwSectionNum; i++, pSectionHeader++){for (DWORD j = 0; j < IMAGE_SIZEOF_SHORT_NAME; j++){printf("%c", pSectionHeader->Name[j]);}printf("  %08X  %08X  %08X  %08X  %08X\n",pSectionHeader->VirtualAddress,pSectionHeader->Misc.VirtualSize,pSectionHeader->PointerToRawData,pSectionHeader->SizeOfRawData,pSectionHeader->Characteristics);}printf("\n");system("start https://www.chwm.vip/?PEinfo");system("pause");return 0;
}void DirectoryString(DWORD dwIndex)
{switch (dwIndex){case 0:printf("输出表:\t\t");break;case 1:printf("输入表:\t\t");break;case 2:printf("资源:\t\t");break;case 3:printf("异常:\t\t");break;case 4:printf("安全:\t\t");break;case 5:printf("重定位:\t\t");break;case 6:printf("调试:\t\t");break;case 7:printf("版权:\t\t");break;case 8:printf("全局指针:\t");break;case 9:printf("TLS表:\t\t");break;case 10:printf("载入配置:\t");break;case 11:printf("输入范围:\t");break;case 12:printf("IAT:\t\t");break;case 13:printf("延迟输入:\t");break;case 14:printf("COM:\t\t");break;case 15:printf("保留:\t\t");break;}
}

获取某指定区段的信息实现代码:

HANDLE hFile = CreateFile(_T("C:\\Windows\\SysNative\\ntoskrnl.exe"), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE) {cout << "CreateFile failed:" << GetLastError() << endl;return false;}DWORD dwFileSize = GetFileSize(hFile, NULL);CHAR* pFileBuf = new CHAR[dwFileSize];DWORD ReadSize = 0;if (!ReadFile(hFile, pFileBuf, dwFileSize, &ReadSize, NULL)) {cout << "ReadFile failed:" << GetLastError() << endl;return false;}PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pFileBuf;PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)(pFileBuf + pDosHeader->e_lfanew);PIMAGE_FILE_HEADER		pFileHeader = &(pNtHeader->FileHeader);PIMAGE_OPTIONAL_HEADER	pOptionalHeader = &(pNtHeader->OptionalHeader);PIMAGE_SECTION_HEADER pSectionHeader = IMAGE_FIRST_SECTION(pNtHeader);DWORD dwSectionNum = pFileHeader->NumberOfSections;int page_vaddr = 0, page_roff = 0;for (DWORD i = 0; i < dwSectionNum; i++, pSectionHeader++) {string s_name;for (DWORD j = 0; j < IMAGE_SIZEOF_SHORT_NAME; j++) {if (pSectionHeader->Name[j]) {s_name += pSectionHeader->Name[j];}}if (s_name == "PAGE") {page_vaddr = pSectionHeader->VirtualAddress;page_roff = pSectionHeader->PointerToRawData;break;}}if (page_vaddr == 0 || page_roff == 0) { cout << "没有找到 PAGE 区段" << endl; return false; }

效果演示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023-12-21 LeetCode每日一题(美丽塔 II)

2023-12-21每日一题 一、题目编号 2866. 美丽塔 II二、题目链接 点击跳转到题目位置 三、题目描述 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i &#xff0c;高度为 heights[i] 。 如果以下条件满足&a…

linux驱动(一):led

本文主要探讨210的led驱动相关知识。 驱动 操作系统驱动硬件的代码,驱动上层是系统调用API,下层是硬件 宏内核&#xff1a;内核整体上为一个过程实现,运行在同一地址空间,相互调用简单高效 微内核&#xff1a;功能为独立过程,过程间通过IPC通信 …

【华为OD机试真题2023CD卷 JAVAJS】测试用例执行计划

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 测试用例执行计划 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某个产品当前迭代周期内有N个特性()需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用…

在Linux运行LaTeX

共有三个步骤1. 装LaTexTeX Live - TeX Users Group 下载对应版本安装包安装 文件比较大&#xff0c;这步花的时间多一点&#xff0c;不过也不会太多&#xff0c;感觉5分钟十分钟的样子吧 2. 装TexStidio 这一步是安装一个类似在windows系统下的TaTeX GUI软件 图标是这样3. 配置…

Tensorflow2.X的GPU版框架最快最稳搭建方法

一、环境基础 Windows10以上 已装Anaconda 支持GPU 二、搭建步骤 1. 在Anaconda中创建并进入虚拟环境 conda create -n envname python3.8 conda activate envname 注意&#xff1a;envname 替换为你自己想命名的&#xff0c;下文将以“Ljdenv”出现 2.安…

【实用工具】Tmux使用指南

Tmux 三个重要概念 session&#xff08;会话&#xff09;、window&#xff08;窗口&#xff09;、pane&#xff08;面板&#xff09; 一个会话可以有多个窗口&#xff0c;一个窗口可以划分为多个面板 注意在tmux中使用快捷命令的话&#xff0c;需要加上前缀ctrlb 关于session的…

2024 GMF|The Sandbox 为创作者赋能的新时代

以新的 GMF 模型和专门的参与池奖励来开启 2024 年吧。 11 月 3 日&#xff0c;我们在香港全球创作者日上宣布&#xff0c;The Sandbox 已为所有创作者分配了100,000,000 SAND&#xff0c;将通过 GMF 进行分发。作为首次启动的建设者挑战&#xff0c;我们准备了专门的 SAND 参与…

linux 防火墙查看放行端口,追加放行端口命令

linux 查看防火墙已经放行端口列表 firewall-cmd --list-ports 运行结果如下&#xff1a; linux 追加防火墙经放行端口&#xff08;如追加443&#xff09; firewall-cmd --zonepublic --add-port443/tcp --permanent 亲测有效&#xff01;

数据结构 模拟实现LinkedList单向不循环链表

目录 一、链表的简单介绍 二、链表的接口 三、链表的方法实现 &#xff08;1&#xff09;display方法 &#xff08;2&#xff09;size得到单链表的长度方法 &#xff08;3&#xff09;addFirst头插方法 &#xff08;4&#xff09;addLast尾插方法 &#xff08;5&#xf…

美团到店终端从标准化到数字化的演进之路

总第580篇 | 2023年第032篇 本文整理自美团技术沙龙第76期《大前端研发协同效能提升与实践》。前端团队在产研多角色协同形式上存在不同阶段&#xff0c;而大前端多技术栈在各阶段都有其独特的实践&#xff0c;同时又有类似的演进路线。本文从到店终端团队移动端和前端技术栈持…

Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 最近更新的速度和频率大不如以前&#xff0c;主要原因还是自己有些懈怠了。学习是一个持续努力的过程&#xff0c;一旦中断&#xff0c;再想保持以往的状态可能要…

轻量封装WebGPU渲染系统示例<55>- 顶点数据更新

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/VertexUpdateTest.ts 当前示例运行效果: ​​​​​​​ 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: export class VertexUpdateTest {pr…

【实用工具】vim常用命令

快速移动(上下左右箭头可替代) 左移 h 右移 l 下移 j 上移 K在本行操作 0 移动到本行行首 ^ 移动到本行的第一个不是 blank 字符 $ 移动到本行行尾 w 光标移动到下一个单词的开头 e 光标移动到下一个单词的结尾跨行移动光标 nG 光标定位到第n行的行首 gg 光标定位到第一行的…

dll不能运行是什么意思,分享5种有效的修复方法

在计算机使用过程中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;其中一种常见的问题是“dll不能运行”。这个问题可能会影响到我们的正常使用&#xff0c;甚至导致某些软件无法启动。那么&#xff0c;“dll不能运行是什么意思”呢&#xff1f;dll文件丢失怎么恢复&am…

下载大模型,保存阿里云盘

一、解决场景 下载模型或数据集&#xff0c;到国内云GPU平台、阿里云盘&#xff08;便于持久化储存&#xff0c;或者分享朋友&#xff09;。 及时收藏&#xff0c;下次还能找到&#xff01; 二、优势 此方法可以避免大文件下载到本地——占用内存&#xff0c;受到小带宽网络…

西班牙语中关于时间的相关表达-柯桥 外贸西语学习

今天来为大家介绍一下询问时间和被别人询问时间西语相关表达。 如何向他人询问时间&#xff1f; Qu hora es? 几点了&#xff1f; Tienes hora? 你知道时间吗&#xff1f; Me puede decir la hora? 你可以告诉我时间吗&#xff1f; 如何表达时间&#xff1f;我…

Kafka安装及简单使用介绍

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

Pillow图像处理(PIL.Image类的详细使用)

文章目录 Opencv、Matplotlib(plt)、Pillow(PIL)、Pytorch读取数据的通道顺序Python图像处理库&#xff08;PIL、Pillow、Scikit-image、Opencv&#xff09;Pillow 官方文档&#xff08;超详细&#xff0c;超推荐&#xff09;一、PIL库与Pillow库的区别二、Pillow库&#xff08…

X210 Linux开发板挂载NFS文件系统

软件版本 VirtualBox v7.0、Ubuntu 20.04.3 LTS 网络搭建 采用“路由器”“有线网”来将Linux开发板和Ubuntu虚拟机连接在同一个局域网中。具体接线如下&#xff1a; Linux开发板通过网线直接连接到“路由器”的LAN接口上&#xff0c;然后笔记本电脑通过Wifi与路由器连接。…

纯CSS的华为充电动画,它来了

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; Krpano专栏&#xff1a;想学Krpano的&#xff0c;冲 &#x1f514…