PE文件结构详解(DOS头/NT头/节表/导入表)使用010 Editor手动解析notepad++.exe的PE结构

一:DOS部分

DOS部分分为DOS MZ文件头和DOS块,其中DOS MZ头实际是一个64位的IMAGE_DOS——HEADER结构体。

DOS MZ头部结构体的内容如下,我们所需要关注的是前面两个字节(e_magic)和后面四个字节(e_lfanew)

typedef struct _IMAGE_DOS_HEADER
{
    WORD   e_magic;       // DOS头的标识  "MZ"  4Dh  5Ah(2个字节)      #define IMAGE_DOS_SIGNATURE  0x5A4D
    WORD   e_cblp;        // 文件最后一页中的字节数
    WORD   e_cp;          // 文件中的全部页数
    WORD   e_crlc;        // 重定位表中的指针数
    WORD   e_cparhdr;     // 头部尺寸,以段落为单位
    WORD   e_minalloc;    // 所需的最小附加段  
    WORD   e_maxalloc;    // 所需的最大附加段  
    WORD   e_ss;          // 初始的SS值(相对偏移量)
    WORD   e_sp;          // 初始的SP值
    WORD   e_csum;        // 补码校验值
    WORD   e_ip;          // 初始的IP值   
    WORD   e_cs;          // 初始的CS值
    WORD   e_lfarlc;      // 重定位表的字节偏移量 
    WORD   e_ovno;        // 覆盖号
    WORD   e_res[4];      // 保留字
    WORD   e_oemid;       // OEM 标识符(相对e_oeminfo) 
    WORD   e_oeminfo;     // OEM 信息
    WORD   e_res2[10];    // 保留字
    // DosHeader + 0x3C 正好定位到e_lfanew
    LONG    e_lfanew;     // NT头相对于文件起始地址的偏移, 4字节, 指示NT头的位置
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

二、PE文件头

PE文件头可以分为三个部分,分别为PE标识、标准PE头、扩展PE头,结构体内容如下所示

typedef struct _IMAGE_NT_HEADERS {
 DWORD Signature; ``// PE标识--4字节
 IMAGE_FILE_HEADER FileHeader; ``// 标准PE头--20字节
 IMAGE_OPTIONAL_HEADER32 OptionalHeader; ``// 扩展PE头--224字节/240字节
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

现在我们详细解释一下标准PE头,标准PE头的结构体如下:

typedef struct _IMAGE_FILE_HEADER
{
    WORD Machine;                //PE文件运行的平台,值为IMAGE_FILE_MACHINE_I386(0x14c)表示是x86处理器,
                                 //IMAGE_FILE_MACHINE_AMD64(0x8664)或IMAGE_FILE_MACHINE_IA64(0x200)表示是x64处理器。
    WORD NumberOfSections;       //文件中存在的节的个数,如果想在PE文件中增加或删除节,必须变更此处的值
    DWORD TimeDateStamp;         //创建此文件时的时间戳
    DWORD PointerToSymbolTable;  //COFF符号表的文件偏移,对于映像文件来说,此值为0
    DWORD NumberOfSymbols;       //符号表中元素的数目,对于映像文件来说,此值为0
    WORD SizeOfOptionalHeader;   //可选头的大小,32位下默认为00E0h,64位下默认为00F0h
    WORD Characteristics;        //文件属性标志,exe一般是010fh,dll一般是210eh
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

现在我们得到:

那什么是PE文件属性呢,现在我们知道PE文件属性的十六进制值是00 22(倒序读取),那么可以得到二进制是0001 0110

对应下面的表,也就是第1位、第二位和第四位对应数字为1得到的属性值

对于扩展PE头,大小有标准PE头的SizeOfOptionalHeader决定,就是00F0

三、节表

每个节表的固定大小是40字节,节表不止一个,可能有多个,节表的数量是标准PE头中的NumberOfSections属性决定的,虽然节表有多个,但是每个节表中的结构是相同的。

根据上面的标准头解析,可以看到是六个节表(00 06),每个节表大小是40字节,一共是240字节,如下图

每个节表的最后四个字节是属性,这里是60 00 00 20,可以得到二进制是0110 0000 0000 0000 0000 0000 0010 0000

那么就可以得到:

利用工具打开,可以发现是六个节表

以下是节表的基本结构

typedef struct _IMAGE_SECTION_HEADER {
0x00 BYTE Name[IMAGE_SIZEOF_SHORT_NAME];     //00 00 00 74 78 65 74 2E 8字节,节表的名字,一般情况下"\0"来结束,内容可以自己定义
union {  
	0x08 DWORD PhysicalAddress; 
	0x08 DWORD VirtualSize;                    
} Misc;                                      //00 01 80 6C   双字,是该节在没有对齐前的真是尺寸,内容可以不准确
0x0c DWORD VirtualAddress;                   //00 00 10 00   节区在内存中的偏移地址
0x10 DWORD SizeOfRawData;                    //00 01 82 00   节在文件中对齐后的尺寸
0x14 DWORD PointerToRawData;                 //00 00 04 00   节区在文件中的偏移
0x18 DWORD PointerToRelocations;             //00 00 00 00   在exe文件中无意义
0x1c DWORD PointerToLinenumbers;             //00 00 00 00   在exe文件中无意义
0x20 WORD NumberOfRelocations;               //00 00         在exe文件中无意义
0x22 WORD NumberOfLinenumbers;               //00 00         该节在行号表中的行号数
0x24 DWORD Characteristics;                  //60 00 00 20   节的属性
};

 四、节数据

查看区段:

我们需要的是节区在文件中的偏移,就是在20字节之后的00000400,节区的大小是在16字节之后的,也就是0046FE00

 也就是00000400之后的数据:

以上就是最基本的PE文件结构了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自由学习记录(41)

代理服务器的核心功能是在客户端(用户设备)和目标服务器(网站/资源服务器)之间充当“中介”,具体过程如下: 代理服务器的工作流程 当客户端希望访问某个网站(比如 example.com)时&…

学习工具的一天之(burp)

第一呢一定是先下载 【Java环境】:Java Downloads | Oracle 下来是burp的下载 Download Burp Suite Community Edition - PortSwigger 【下载方法二】关注的一个博主 【BurpSuite 安装激活使用详细上手教程 web安全测试工具】https://www.bilibili.com/video/BV…

大模型gpt结合drawio绘制流程图

draw下载地址 根据不同操作系统选择不同的安装 截图给gpt 并让他生成drawio格式的,选上推理 在本地将生成的内容保存为xml格式 使用drawio打开 保存的xml文件 只能说效果一般。

K8S学习之基础六:k8s中pod亲和性

Pod节点亲和性和反亲和性 podaffinity:pod节点亲和性指的是pod会被调度到更趋近与哪个pod或哪类pod。 podunaffinity:pod节点反亲和性指的是pod会被调度到远离哪个pod或哪类pod 1. Pod节点亲和性 requiredDuringSchedulingIgnoredDuringExecution&am…

FPGA学习篇——Verilog学习4

1.1 结构语句 结构语句主要是initial语句和always语句,initial 语句它在模块中只执行一次,而always语句则不断重复执行,以下是一个比较好解释的图: (图片来源于知乎博主罗成,画的很好很直观!) 1.1.1 initial语句 ini…

[Computer Vision]图像分割技术

一、技术介绍 1.1 GrabCut 算法 1.1.1 算法原理 GrabCut 算法是一种交互式的图像分割方法,整体流程围绕着用户提供的少量先验信息(如用矩形框大致框选前景区域等),通过构建图模型、拟合高斯混合模型,利用图割算法不断迭代优化,实现了一种有效的交互式图像分割,最终将…

原型链与继承

#搞懂还是得自己动手# 原型链 function Person(name) { this.name name; } Person.prototype.sayName function() { console.log(this.name); };const p new Person("Alice"); 原型链关系图: 原型链:person->Person.prototype->O…

MagicDriveDiT:具有自适应控制的自动驾驶高分辨率长视频生成

24年11月来自香港中文大学、香港科技大学和华为公司的论文“MagicDriveDiT: High-Resolution Long Video Generation for Autonomous Driving with Adaptive Control”。 扩散模型的快速进步极大地改善视频合成,特别是可控视频生成,这对于自动驾驶等应用…

YOLOv8 自定义目标检测

一、引言 YOLOv8 不仅支持预训练模型的推理,还允许用户将其应用于自定义对象检测。本文将详细介绍如何使用 YOLOv8 训练一个新的模型,并在自定义数据集上进行对象检测。 二、数据集准备 1. 数据集格式 YOLOv8 支持多种数据集格式,包括 CO…

Node JS 调用模型Xenova_all-MiniLM-L6-v2实战

本篇通过将句子数组转换为句子的向量表示,并通过平均池化和归一化处理,生成适合机器学习或深度学习任务使用的特征向量为例,演示通过NodeJS 的方式调用Xenova/all-MiniLM-L6-v2 的过程。 关于 all-MiniLM-L6-v2 的介绍,可以参照上…

记录一次Spring事务失效导致的生产问题

一、背景介绍 公司做的是“聚合支付”业务,对接了微信、和包、数字人民币等等多家支付机构,我们提供统一的支付、退款、自动扣款签约、解约等能力给全国的省公司、机构、商户等。 同时,需要做对账功能,即支付机构将对账文件给到…

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔,每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点,亟需智能化工具的突破性革新。为了满足这一需求,遨游通讯推出AORO P9000 PRO三防平板,以…

开启AI短剧新纪元!SkyReels-V1/A1双剑合璧!昆仑万维开源首个面向AI短剧的视频生成模型

论文链接:https://arxiv.org/abs/2502.10841 项目链接:https://skyworkai.github.io/skyreels-a1.github.io/ Demo链接:https://www.skyreels.ai/ 开源地址:https://github.com/SkyworkAI/SkyReels-A1 https://github.com/Skywork…

CentOS 7中安装Dify

Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时,会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…

【Day9】make/makeFile如何让项目构建自动化起飞

【Day9】make/makeFile如何让项目构建自动化起飞 使用make命令编写makefile文件依赖管理增量构建makefile注释:#makefile其他语法 make/makefile递归式工作过程 在Linux中,项目自动化构建是指使用一系列工具和脚本来自动执行软件项目的编译、测试、打包和…

svn 通过127.0.01能访问 但通过公网IP不能访问,这是什么原因?

连接失败的提示如下 1、SVN的启动方法 方法一: svnserve -d -r /mnt/svn 方法二: svnserve -d --listen-port 3690 -r /mnt/svn 方法三: svnserve -d -r /mnt/svn --listen-host 0.0.0.0 2、首先检查svn服务器是否启动 方法一&#x…

Unity实现在镜子间反射光柱

一、最终效果: 二、代码来源及思路 unity-raycast-reflection/Assets/RaycastReflection.cs at master Loafwad/unity-raycast-reflection GitHub 在GitHub找到了现成的,效果很好,稍微改了一点来满足我的需求,并加上了注释理解…

快速理清 Attention 注意力和 Encoder, Decoder 概念

之前一直以为 Attention 和 RNN 没关系是凭空蹦出来的新概念;以为 Transformer, Encoder, Decoder 这几个概念是绑在一起的。并不尽然。 Encoder 和 Decoder RNN 里就有 Encoder Decoder 的概念。其中,encoder 接受用户输入,写入 hidden stat…

达梦数据库系列之Mysql项目迁移为达梦项目

达梦数据库系列之Mysql项目迁移为达梦项目 1 达梦数据库安装及MySql数据迁移2 SpringBoot项目迁移2.1 驱动包引入2.2 驱动类配置2.3 数据源配置2.4 flowable迁移2.4.1 异常问题2.4.2 解决 3 迁移常见问题3.1 不是 GROUP BY 表达式3.1.1 dm.ini 开启Mysql兼容模式3.1.2 修改动态…

第5章 使用OSSEC进行监控(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的,已经过去3年时间了,最近利用闲暇时间,抓紧吸收,总的来说,第5章开始进入主机安全(HIDS)领域了,2022年的时候有幸做过终端安全一段时间&a…