[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 ...
随机推荐
- Request 接收参数乱码原理解析
起因: 今天早上被同事问了一个问题:说接收到的参数是乱码,让我帮着解决一下. 实际情景: 同事负责的平台是Ext.js框架搭建的,web.config配置文件里配置了全局为“GB2312”编码: &l ...
- AsyncTask实现异步线程通信
AsyncTask是Android1.5开始提供的一个封装了Thread与Handler可以实现异步线程的简单方式,不需要再自己实现子线程,然后在主线程处接受数据. 因为AsyncTask是用线程池, ...
- android用shape给linearLayout设置边框,怎样只保留底部或顶部的边框,把其它三个方向的边框去掉呢?
http://bbs.csdn.net/topics/390485215 这种方法只是两个颜色块相减而已 <?xml version="1.0" encoding=" ...
- _CRT_NONSTDC…与_CRT_SECURE…
目录 第1章说明 1 1.1 _CRT_NONSTDC_NO_WARNINGS 1 1.2 _CRT_NON_CONFORMING_SWPRINTFS 2 1.3 _CRT_SECU ...
- [maven] 常用仓库地址
共有的仓库 http://mvnrepository.com/ http://repo1.maven.org/maven2/ http://repository.jboss.com/maven2/ h ...
- java synchronized静态同步方法与非静态同步方法,同步语句块
摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...
- (14)odoo加载机制
Odoo的启动通过openerp-server脚本完成,它是系统的入口. 然后加载配置文件openerp-server.conf 或者 .openerp_serverrc: openerp-serve ...
- python中文处理
源码文件为utf-8格式 CODEC = 'utf-8': VS在“高级保存选项”中选择“UTF-8 65001” input(u'中文');print(u'中文')
- java基础学习之 消息对话款
package Dome; import java.awt.event.*; import java.awt.*; import javax.swing.*; public class WindowM ...
- Sql server 日期函数和日期转换
时间函数 SQL Server Date 函数 下面的表格列出了 SQL Server 中最重要的内建日期函数: 函数 描述 GETDATE() 返回当前日期和时间 DATEPART(Type,dat ...