[microsoft]PE和COFF文件格式
前言
我们知道,vs的C/C++编译工具把每一个编译单元(一个.c或.cpp源文件)编译成一个对象文件(.obj文件);然后用链接器把这些对象文件组合一个单个文件(.exe文件),称为可移植的可执行文件(portable executable简称为可执行文件)。强调portable说明是not architecture specific。
PE、COFF文件结构:
1、PE header:MS‐DOS stub, the PE signature, the COFF file header, and an optional header.
2\A COFF object file header consists of a COFF file header and an optional header.
3、In both cases, the file headers are followed immediately by section headers.
PE文件结构详解:
微软操作系统历史上使用了多种可执行文件格式,MS-DOS操作系统下有COM(.COM,不是对象组件模型)、MZ(.exe)、NE(.exe)文件格式;windows操作系统下有NE(.exe)、PE(.exe)、 PE32+(.exe)文件格式。对于PE文件格式,它向前兼容了MZ文件格式,好像没有兼容COM和NE两种文件格式。所以,PE文件一开始就是一个完整的MZ文件。
MZ文件以一个两字节的数字签名开始-MZ(0x4D5A),这是一名MS-DOS主要开发者Mark Zbikowski的名字缩写。PE文件中的MZ文件由文件头和文件数据构成,文件数据是一段MS-DOS 2.0 Stub Program,就是我们所说的DOS存根程序。此程序的主要作用是:当此程序在DOS环境下运行时,它告诉用户这不是一个DOS程序。
Liker.exe在MZ文件头中一个数据域(可能原来就是设计成以后扩展使用的)中(0x3c开始的4个字节)填充PE签名的开始位置,PE程序加载器从这里开始解析加载程序。PE签名(4字节0x50450000)之后便是COFF头,COFF头固定20字节长度;COFF头后面紧跟的是可选头(optional header),可选头的长度在COFF头的一个域中定义;到此文件头就结束了,后面紧跟的就是段表了和段数据区了。
我们应该注意到,PE签名的偏移量是在MZ头中给出的,但后面COFF头、可选头、段表、段数据区的偏移地址都需要通过PE签名的偏移地址得到。所以它们之间紧密相连,不能有间隔。PE签名(4字节)、COFF头(20字节)的长度是固定不变的,可选头的长度在COFF头中给出,段表项的数目在COFF头中给出,段表项长度(40字节)固定,这样各个部分的起始地址就很容易得到,具体说来:
- addr_PE_signature = *(0x3c)
- addr_coff_header = addr_PE_signature + 4
- addr_optional_heaer = addr_coff_header + 20
- addr_section_table = addr_optional_heaer + coff_header.SizeOfOptionalHeader
- addr_section_data = addr_section_table + coff_header.NumberOfSections*40
COFF文件结构详解:
[microsoft]PE和COFF文件格式的更多相关文章
- cve-2010-3333 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 分析
用的是泉哥的POC来调的这个漏洞 0x0 漏洞调试 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 Microsoft Office 是微软发布的非常流行的办公 ...
- COFF文件格式
链接器 目录 一 COFF-Common Object File Format-通用对象文件格式... 3 COFF的文件格式与结构体... 4 文件头... 5 numberOfSections(区 ...
- C++PE文件格式解析类(轻松制作自己的PE文件解析器)
PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式. PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣 ...
- .NET本质论 组件
模块定义 CLR程序存在模块(module)中.一个CLR模块是一个字节流,通常作为一个文件存储在本地的文件系统中或者Web服务器上 CLR模块采用Windows NT的PE/COFF可执行文件格式的 ...
- C#编译相关知识
C#代码编译成MSIL代码. 当用户编译一个.NET程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU的指令.当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码.由 ...
- 程序员的自我修养五Windows PE/COFF
5.1 Windows的二进制文件格式PE/COFF PE文件格式事实上与ELF同根同源,它们都是由COFF格式发展而来. 5.2 PE前身——COFF 在win下,Command Prompt fo ...
- PE文件结构及其加载机制
一.PE文件结构 PE即Portable Executable,是win32环境自身所带的执行体文件格式,其部分特性继承自Unix的COFF(Common Object File Format)文件格 ...
- ELF和a.out文件格式的比较
本文讨论了 UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assembler and link editor output 汇编器和链接编辑器的输出).COFF(Common Ob ...
- PE文件常用结构体
Dos头结构: typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_c ...
随机推荐
- 转载 uboot 命令
1.bootm bootm [addr [arg ...]] - boot application image stored in memory passing arguments 'arg ...' ...
- hiho_1087_哈密顿环
题目 在一个有向图上,从一点A出发,经过所有除A的顶点一次且仅经过一次,最后到达起始点A,所形成的路径为哈密顿环.两个哈密顿环不同,当且仅当路径上的任意一个顶点P的下一个顶点不同. 给出一个顶 ...
- virtualbox虚拟机上安装centOS的网络配置(安装centos时选择桥接网络)
最近接触hadoop,需要在在Linux上面开发,所以我装了一个virtualbox虚拟机,在该虚拟机上面安装了一个centOS系统.linux系统是装好了,但是网络配置却另人头疼.我主要是想让宿主机 ...
- 任务栏右键工具栏里的语言栏没有的修复.reg
任务栏右键工具栏里的语言栏没有的修复.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\CLSID\{540D8A8B-1C3F- ...
- 【OpenCV入门指南】第一篇 安装OpenCV
http://blog.csdn.net/morewindows/article/details/8225783/ win10下vs2015配置Opencv3.1.0过程详解(转) http://ww ...
- DispatcherServlet中使用的特殊的Bean
DispatcherServlet默认使用WebApplicationContext作为上下文,因此我们来看一下该上下文中有哪些特殊的Bean: 1.Controller:处理器/页面控制器,做的是M ...
- 10款实用Android UI 开发框架
1. ActionBarSherlock ActionBarSherlock是一个独立的Android设计库,可以让Android 2.x的系统也能使用ActionBar.此外,ActionBarSh ...
- [saiku] olap数据源管理
一.应用场景 系统初始化的时候 如果没有创建olap数据源需要先创建olap数据源 否则直接获取所有的数据源存放在全局变量datasources里面以便于后续步骤中获取plap-connections ...
- 1029c语言文法
<程序>→<外部声明>|<程序><外部声明> <外部声明>→<函数定义>|<声明> <函数定义>→< ...
- C# BackgroundWorker的使用 转
转自http://www.cnblogs.com/tom-tong/archive/2012/02/22/2363965.html 感谢作者详细的介绍 C# BackgroundWorker的使用 ...