前言

我们知道,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. vs2010工程迁移问题,x64到Win32

    ALL_BUILD:vcxproj:找不到项目文件“ALL_BUILD”中引用的平台“x64”.请确保已将该平台安装在“%VCTargetsPath%\Platforms\x64”下.无法加载项目. ...

  2. return 还是 不return

    jQuery.fn.functiona = function() { //return this.each(function() { **** } jQuery(this).css('backgrou ...

  3. j2ee四大作用域pagecontext,request,session,ServletContext(转)

    转自:(http://www.5ycode.com/63) 在JSP页面中的对象,包括用户创建的对象(例如,JavaBean对象)和JSP的隐含对象,都有一个范围属性.范围定义了在什么时间内,在哪一个 ...

  4. css3中clip属性

    clip 属性用来设置元素的形状.用来剪裁绝对定位元素. 当一幅图像的尺寸大于包含它的元素时,"clip" 属性允许规定一个元素的可见尺寸,这样此元素就会被修剪并显示在这个元素中. ...

  5. 手机页面head中的meta元素

    <meta http-equiv="Pragma" content="no-cache"> <meta http-equiv="ex ...

  6. [Java] 数据库连接管理类

    package com.wdcloud.monitoring.common; /** * @Description: TODO * @date: 2015��11��19�� ����10:23:16 ...

  7. c# BackGroundWorker 多线程操作的小例子

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

  8. 整理的一些模版LCS(连续和非连续)

    对于连续的最大串,我们称之为子串....非连续的称之为公共序列.. 代码: 非连续连续 int LCS(char a[],char b[],char sav[]){ int lena=strlen(a ...

  9. nyoj------203三国志

    三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5  描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下,地 ...

  10. form程序的界面修改

    做主题视频库的界面的修改工作,是b/s端的窗口,是由form窗口生成,如下截图: 主要有三个方面,1.左侧菜单栏宽度固定,不随整个窗口大变化而变化.2.导出excel按钮的位置的移动,不管整个窗口是变 ...