PE文件学习系列二 DOS头分析
Q Q:408365330 E-Mail:egojit@qq.com
PE文件结构综览:
首先上图片:
看到上面的图片可以清晰的看到PE结构复杂结构式什么样子的。有DOS首部,PE头部,PE节表,很多的表块,最后就是一些调试信息。
DOS头由DOS 'MZ' HEADER 和DOS stub组成,DOS "MZ"头中的MZ是PE文件的一个标志之一。后期我们在写PE小工具的时候这个会被我们用于去识别PE文件。
首先我们来理解DOS头。我们知道Windows系统主体是由C去完成的。所有我们可以在windows中去找到用C描述的DOS头结构。
DOS头分析:
第一个就是WinNT.h在我计算机中位置。打开后我们就能看到我们想要的DOS头数据结构了。
1 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header 2 +0 WORD e_magic; // Magic number 3 +2 WORD e_cblp; // Bytes on last page of file 4 +4 WORD e_cp; // Pages in file 5 +6 WORD e_crlc; // Relocations 6 +8 WORD e_cparhdr; // Size of header in paragraphs 7 +A WORD e_minalloc; // Minimum extra paragraphs needed 8 +C WORD e_maxalloc; // Maximum extra paragraphs needed 9 +E WORD e_ss; // Initial (relative) SS value 10 +10 WORD e_sp; // Initial SP value 11 +12 WORD e_csum; // Checksum 12 +14 WORD e_ip; // Initial IP value 13 +16 WORD e_cs; // Initial (relative) CS value 14 +18 WORD e_lfarlc; // File address of relocation table 15 +1A WORD e_ovno; // Overlay number 16 +1C WORD e_res[4]; // Reserved words 17 +24 WORD e_oemid; // OEM identifier (for e_oeminfo) 18 +26 WORD e_oeminfo; // OEM information; e_oemid specific 19 +28 WORD e_res2[10]; // Reserved words 20 +3C LONG e_lfanew; // File address of new exe header 21 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
我们可以看到这样一个结构体这个结构体就是DOS 头结构体,Windows很多数据都是通过这样的结构体去组织的。前面的"+数字"是我添加上去的,WinNT.H头文件中没有的,这个表示偏移地址。在这里我默认情况是你知道什么是偏移地址,Windows的内存基址。否则一些东西你是无法理解的。当然这个数字是16进制表示的。
我们用一个UE打开一个PE文件,也就是exe程序。(当然DLL也是PE文件,遵循PE结构。但是我们这里默认就是EXE程序),我打开我收集的一个内存查看工具:
入下图:
可以看+0H这个位置开始的2个字节(我在这里假设了解windows下的WORD类型是两个字节)。这两个字节也就是e_magic中的内容是MZ。DOS头中我们关注的另一个内容就是最后一个成员也就是+3Ch这个位置,也就是占四个字节的e_lfanew。(大家要知道32位机器中long型和DWORD型是一样的4个字节),DOS头中我们关注这两个内容。e_lfanew这个是为了存储PE头的偏移地址。那为什么要这个呢??DOS头后面不就是PE头了么?也就是+3Ch位置后面不就是PE头了么?其实不是我么这里的DOS头不是广义上的。广义上的DOS头还有一个。DOS stub 这个DOS stub的大小是不固定的,既然这个不固定那么广义上的DOS头的大小也就是不固定。广义DOS头不固定,那我们怎么定位PE头,那就离不开这个四字节的e_lfanew了。e_lfanew中存储了PE头的偏移地址。e_lfanew的位置在+3Ch位置。因为小端存储方式。所以就是上面图中画红线框中的倒过来,那么PE头的开始位置是 "0x00 00 0100",也就是16进制的100处。这样我们很容易的就定位到了PE头。
这里就提前让大家看一下PE头结构吧:
1 typedef struct _IMAGE_NT_HEADERS { 2 +00h DWORD Signature; 3 +04h IMAGE_FILE_HEADER FileHeader; 4 ??? IMAGE_OPTIONAL_HEADER32 OptionalHeader; 5 } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
这个是广义上的PE头结构。这个结构的+00h处其实就是e_lfanew中偏移指向的位置总PE文件开始处的+3Ch处就是这个Signature相对文件开始的偏移(我们称FOA,也就是文件相对偏移地址,这个要和虚拟地址相对偏移RVA区分开,后续我会介绍FOA和RVA的装换方式,这样我们就可以在内存中定位数据了)。Signature中的四个字节内容其实就是"PE00",也就是+3Ch中的内容"0x00 00 0100"所指向的位置中的内容,100h位置中的四个字节中ASIIC就是“PE00”,这个是PE文件的标志符,e_magic,+0地址开始的2个字节中的“MZ”,和Signature 的+3C开始位置的四个字节内容“PE00”共同标志这就是PE文件。我们后期写的PE工具,判断PE就是有这两个位置的数据去区分是不是Windows PE文件。
这一节到此位置。后面将和大家探讨PE head结构。
转载于:https://www.cnblogs.com/egojit/p/3335744.html
PE文件学习系列二 DOS头分析相关推荐
- 图机器学习(GML)图神经网络(GNN)原理和代码实现(前置学习系列二)
图机器学习(GML)&图神经网络(GNN)原理和代码实现(PGL)[前置学习系列二] 上一个项目对图相关基础知识进行了详细讲述,下面进图GML networkx :NetworkX 是一个 P ...
- 加壳学习系列(二)-壳代码
壳代码 一.Shell.dll的源码和二进制文件信息 1.1 壳代码 shell.h shell.cpp start函数 1.2 加壳器代码 入口函数 InitPE 拷贝shell.dll中的壳代码 ...
- A.图机器学习(GML)图神经网络(GNN)原理和代码实现(前置学习系列二)
图学习图神经网络算法专栏简介:主要实现图游走模型(DeepWalk.node2vec):图神经网络算法(GCN.GAT.GraphSage),部分进阶 GNN 模型(UniMP标签传播.ERNIESa ...
- Linux学习系列二:Linux中的常用命令
这个系列的Linux教程主要参考刘遄老师的<Linux就该这么学>.用的系统是RHEL8,如果遇见一些命令出现问题,请首先检查自己的系统是否一致,如果不一致,可网上查一下系统间某些命令之间 ...
- Pyside2 学习系列二:PyInstaller打包项目exe (超详细的Pyside2 攻略)
继上一篇文章创建了项目后,本章我们进行项目的打包工作. 本项目的所有演示代码:github可在这里下载. 打包只用的工具为PyInstaller. 打包步骤 1 准备环境 1.1 安装`PyInsta ...
- motan学习笔记 二 motan架构分析
motan学习笔记 一 微博轻量级RPC框架Motan motan学习笔记 二 motan架构分析 motan学习笔记 三 motan Demo 分析 motan学习笔记 四 motan Demo 之 ...
- PE文件学习笔记(五):导入表、IAT、绑定导入表解析
1.导入表(Import Descriptor)结构解析: 导入表是记录PE文件中用到的动态连接库的集合,一个dll库在导入表中占用一个元素信息的位置,这个元素描述了该导入dll的具体信息.如dll的 ...
- RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列
上一篇已经讲了Rabbitmq如何在Windows平台安装,不懂请移步:RabbitMQ学习系列一:windows下安装RabbitMQ服务 一.理论: .net环境下,C#代码调用RabbitMQ消 ...
- Java I/O系统学习系列二:输入和输出
编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象."流"屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇 ...
最新文章
- WPF 与Surface 2.0 SDK 亲密接触–LibraryContainer 篇
- matplotlib.pyplot中add_subplot方法参数111的含义
- 加拿大留学|电气工程/计算机工程/计算机科学,傻傻分不清
- C语言之随机数和字符串输入输出
- 又到了年终总结的时候了,数据分析的年度工作计划,你知道该怎么写吗?
- ML之LiRSGDR:基于二种算法(LiR、SGDR)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能
- java 建模_Java设计模式菜鸟系列(两)建模与观察者模式的实现
- oracle中的case when then else end 用法
- win8计算机配置怎么看,win8怎么看电脑配置?win8电脑配置的查看方法
- 一年披露落地应用27项 IBM区块链只为反哺云业务?
- kettle 下载安装 使用
- PPT镂空字体、填充文字、图片字、拆分字制作
- JavaFX Scene Builder支持JxBrowser
- 安川机器人示教器按键功能介绍
- Python 四大名著词频画图
- 简单CRM系统开发(一)
- Mini XLR 平衡耳机 I/O 接线指引
- 2022头像小程序源码+支持姓氏头像生成
- python 利用python处理excel文件
- 数据分析(入门)纳米学位_tensorflow纳米级程序对机器学习入门的回顾