前言

我们知道,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文件格式的更多相关文章

  1. cve-2010-3333 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 分析

    用的是泉哥的POC来调的这个漏洞 0x0 漏洞调试    Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 Microsoft Office 是微软发布的非常流行的办公 ...

  2. COFF文件格式

    链接器 目录 一 COFF-Common Object File Format-通用对象文件格式... 3 COFF的文件格式与结构体... 4 文件头... 5 numberOfSections(区 ...

  3. C++PE文件格式解析类(轻松制作自己的PE文件解析器)

    PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式. PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣 ...

  4. .NET本质论 组件

    模块定义 CLR程序存在模块(module)中.一个CLR模块是一个字节流,通常作为一个文件存储在本地的文件系统中或者Web服务器上 CLR模块采用Windows NT的PE/COFF可执行文件格式的 ...

  5. C#编译相关知识

    C#代码编译成MSIL代码. 当用户编译一个.NET程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU的指令.当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码.由 ...

  6. 程序员的自我修养五Windows PE/COFF

    5.1 Windows的二进制文件格式PE/COFF PE文件格式事实上与ELF同根同源,它们都是由COFF格式发展而来. 5.2 PE前身——COFF 在win下,Command Prompt fo ...

  7. PE文件结构及其加载机制

    一.PE文件结构 PE即Portable Executable,是win32环境自身所带的执行体文件格式,其部分特性继承自Unix的COFF(Common Object File Format)文件格 ...

  8. ELF和a.out文件格式的比较

    本文讨论了 UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assembler and link editor output 汇编器和链接编辑器的输出).COFF(Common Ob ...

  9. PE文件常用结构体

    Dos头结构: typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header WORD e_magic; // Magic number WORD e_c ...

随机推荐

  1. CodeIgniter配置之SESSION

    刚使用Codeigniter时也被其中的SESSION迷惑过,后来就再也没用过CI自带的SESSION,想必还是有必要整理一下SESSION.为弄清CI中的SESSION,先来说一下PHP中SESSI ...

  2. 黑盒测试在App自动化测试中的应用

    黑盒测试在App自动化测试中的应用 不废话,直接来. 先说说什么是黑盒测试 黑盒测试,这里就说的是app功能测试,之前看到一个介绍说,就是在测试中,把测试对象看作一个黑盒子.利用黑盒测试法进行动态测试 ...

  3. js的预编译机制

    1.var定义的是“当前作用域下的一个变量”,当在函数内部不使用var声明时,会被当做全局变量而不是函数内的局部变量(严格模式下还会报错) 2.js的预编辑:[对定义式函数]直接创建为作用域上的函数变 ...

  4. 资源 之 4.4 Resource通配符路径(拾贰)

    4.4.1  使用路径通配符加载Resource 前面介绍的资源路径都是非常简单的一个路径匹配一个资源,Spring还提供了一种更强大的Ant模式通配符匹配,从能一个路径匹配一批资源. Ant路径通配 ...

  5. (21)odoo中的QWeb模板引擎

    -----------------更新时间18:13 2016-04-05 星期二-----------------* 概述    QWeb是odoo主要模板引擎,采用xml表述,最后生成HTML文件 ...

  6. 学编程,学单词.....在学习中积累自己的单词(不断更新__ing)

    可以去肆意大话天下,可以去小民一般的言语,但是一定要清楚,知识的积累,至于心中,即便你说这粗俗的话,你的个性,气质依旧在那,比如北大的那啥教师(心中的典范),也只有这样,你才能低至市井,上至高阁... ...

  7. 你不知道的JavaScript--值得你挑战的JavaScript面试题(45题)

    1,以下表达式的运行结果是: ["1","2","3"].map(parseInt) A.["1","2&qu ...

  8. 131. 132. Palindrome Partitioning *HARD* -- 分割回文字符串

    131. Palindrome Partitioning Given a string s, partition s such that every substring of the partitio ...

  9. 5月21日 CSS样式表加阴影

    HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  10. Play framework logging设置

    play的logger是基于Log4j,Play 2.0 uses logback as its logging engine. 一.配置 1. 在conf/application.conf中设置lo ...