PE格式详解分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PE 格式详解 本文来自 CSDN 博客,转载请标明出处: /LewisCheng/archive/2008/08/29/2850567.aspx 本系列主要是参考英文原本 ARTeam 的 PE File Format Tutorial 并加以注解,以最简洁的语言来阐述 PE 格式,帮助大家快速入门。在开始之前,请确定您懂得C 语言,至少是基本数据类型、数组和结构体,以及会 WinHEX 的基本使用方法。任何错误都欢迎指出,感激不尽! (一)介绍 PE 格式 PE 格式(Portable Executable,可移植可执行文件)是原生的Win32 文件格式,任何的32 位应用程序(Executable)包括.NET、动态链接库(DLL)、控件(OCX)以及控制面板程序(CPL) 均为 PE 格式,其实 NT 内核 ntoskrnl.exe 也是 PE 格式。 我们研究 PE 格式的目的有:一是给应用程序添加代码功能,比如注册机代码注入 (Keygen Injecton);二是手动给 EXE 脱壳。 现在很多程序都加“壳”,一来是减少映像文件尺寸,二来可以保护程序文件不被轻易修改。被加壳的EXE 一般它的输入表(import table)与数据区段(.data)都被加密过,并且被插入了一段脱壳的代码,当程序执行时会先执行这段代码给内存中的数据解密,接着会修复输入表和各个区段,然后再跳到原始入口点执行。 原文中使用的范例程序是 delphi 写的进制转换程序,本文中我使用的是 VC9 编写的一个很简单的数组求和程序,在 debug 模式下编译。这并不影响我们学习PE 格式。 首先两个概念,PE 文件被加载器加载到内存后被称为一个模块(module),存储模块首地址的称为模块句柄(handle of module),简写为 HMODULE。 然后我们看一下 PE 格式的总体结构(这张图 MS 已经遍布全球了): PICTURE MISSING 前 4 块我们后面会细讲,就区段来说(Section),一个 PE 文件至少要有 2 个区段,代码区段用来存储程序代码,以及数据区段用来存储各种数据。 NT 为 PE 预定义了 9 个区段:.text,.bss,.rdata,.data,.rsrc,.edata,.idata,.pdata,.debug。一个 PE 既可以选择其中的几个区段,也可以自己定义额外的区段满足特别需要。 一般来说,.text 是代码区段,.data、.rdata、.bss 是数据区段,.rsrc 是资源区段,.edata 与.idata 分别是输出输入表区段,.debug 是调试信息区段。这些名字(.text, .data?)实际上是给程序员看着方便的,执行程序时,系统会完全忽略它们。 最后一点,就是 PE 文件在硬盘中的结构顺序和当它们被加载到内存中后的顺序并非一样,记录硬盘上排列的是 File Alignment 域(域是含有特定信息的二进制片段),记录内存中 排列的是 Section Alignment 域,这既是 PE 加载器调整的结果,也是虚拟内存机制的作用。关于 Windows 虚拟内存机制,请参考相关资料,或者我的另一篇文章。就是有一点要注意的是,PE 文件中的每一个区段总是在一个新的页面中存放的。 一个 PE 程序总是以一个 64 字节的 DOS header 结构开头,目的就是为了如果程序在 DOS 中运行,DOS 会识别它为正确的 EXE 并进而运行 DOS stub,它的作用就是输出字符串” This program cannot run in DOS mode.”然后退出。 下面就是 DOS Header 在 C 语言中的结构表示(来自 MinGW 的 winnt.h) typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // Magic DOS 签名 MZ (4Dh 5Ah) WORD e_cblp; // 文件最后一页的字节数 WORD e_cp; // 文件中的页数 WORD e_crlc; // 重定位的个数 WORD e_cparhdr; // 段落中头的长度 WORD e_minalloc; // 额外段落需要的最小分配值 WORD e_maxalloc; // 额外段落需要的最大分配值 WORD e_ss; // 初始 SS 寄存器值 WORD e_sp; // 初始 SP 寄存器值WORD e_csum; // 校验和WORD e_ip; // 初始 IP 值 WORD e_cs; // 初始 CS 值 WORD e_lfarlc; // 重定位表在文件中的地址 WORD e_ovno; // 覆盖数量 WORD e_r

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档