PE文件格式

一、基本结构

1、DOS头一般到节区头成为PE头部分,其下称为PE体。文件的内容一般可分为代码(.text)、数据(.data)、资源(.rsrc),分别保存。

2、PE头与各节区的尾部存在一个区域,称为NULL填充,为了提高效率,计算机使用“最小基本单位”这一概念,文件/内存中节区的起始位置应该在各文件/内存最小单位的整数倍上。

3、RVA+ImageBase=VA

4、当DLL加载到进程虚拟内存指定位置时,可能该位置已经被占用,则需要使用重定位方式加载到其他空白的地方。

5、文件结束处有其他区域,是一些混杂的区域,包括重分配信息、符号表信息、行号信息以及字串表数据

二、PE头

1、DOS头:IMAGE_DOS_HEADER结构体中重要成员:e_magic:DOS签名(MZ)(文件开始为4D5A)、e_lfanew:指示NT头的偏移(根据不同文件有可变值)(Notepad.exe为000000E0小端序标识法)。

2、DOS存根:位于DOS头下方,是个可选项,大小不固定。多数由编译器或者汇编器自动生成。

3、NT头:IMAGE_NT_HEADERS重要成员:签名结构体(50450000h--“PE”00)、文件头和可选头,结构体大小为F8.

4、NT头:文件头:Machine(machine码)、NumberOfSections、SizeOfOptionalHeader、Characteristics(记住2000h和0002h两个值)

5、NT头:可选头:Magic、AddressOfEntryPoint、ImageBase、SectionAlignment/FileAlignment、SizeOfImage、SizeOfHeaders、Subsystem(区分文件)、NumberOfRvaAndSizes(数组大小)、DataDirectory(重要成员:EXPORT/IMPORT/RESOURCR/TLS Direction)

6、节区头

三、载入PE

1、PE被执行时,装载器为进程分配虚拟地址空间,在此情况下,并不是把完整的PE文件载入到磁盘中,而是做一个简单的内存映射。

2、PE装载器在内核中创建进程对象和主进程对象以及其他的内容。

3、PE装载器搜索输入表,装载应用程序所用的动态链接库,方式类似于应用程序的装载。

4、PE装载器执行PE文件首部所指定地址的代码,开始执行应用程序。

四、RVA TO RAW

RAW=RVA-VirtualAddress+PointToRawData

例子1:RVA=5000,求File Offset?

5000位于第一节区.text,假设基址为01000000则RAW=5000-1000+400=4400(这边需要文件和内存之间的映射关系)

例子2:RVA=13314,求File Offset

13314位于第三个节区.rsrc,RAW=13314-b000+8400=10714

五、IAT

1、IAT导入地址表:是一种表格,记录程序正在使用哪些库中的哪些函数。

2、DLL:加载DLL方式:显示链接,程序使用DLL加载,使用完毕后释放内存;隐式连接,程序开始时即一同加载DLL,程序终止时释放占用的内存。

3、DLL重定位:使得我们无法对实际地址硬编码,同时PE头中表示地址的是VA而不是RVA。

六、常用工具

1、PEID:通过搜索特征串搜索识别,不同语言编译的程序有固有的启动代码(可参见http://www.cnblogs.com/miaohj/p/5274211.html),被壳处理过的程序会留下与壳相关的软件信息,通过这些可以识别。下载地址:http://down.52pojie.cn/Tools/PEtools/

2、OllyDbg(OD):可视化用户模式调试器,结合了动态调试和静态调试的功能。通过OD脱壳的方式介绍也可参见http://www.cnblogs.com/miaohj/p/5274211.html 。同时也可参见http://www.52pojie.cn/thread-234739-1-1.html的简单教程。下载地址:http://down.52pojie.cn/Tools/Debuggers/

3、IDA Pro(IDA):静态反汇编工具。特性:交互和多处理器。能够详细分析文件各模块功能以及模块之间的复杂调用,准确分析函数的调用规范、参数和临时变量等信息。具体使用方式会在之后的学习中给出。下载地址:http://www.52pojie.cn/thread-319763-1-1.html

PE格式的理解(待补充)的更多相关文章

  1. 基础篇-初步认识PE格式

    1 PE(Portable Executable)格式,是Win32环境可移植可执行文件(如exe.dll.vxd.sys和vdm等)的标准文件格式.PE格式衍生于早期建立在VAX(R)VMS(R)上 ...

  2. WinHex分析PE格式(1)

    最近在一直努力学习破解,但是发现我的基础太差了,就想学习一下PE结构.可是PE结构里的结构关系太复杂,看这老罗的WiN32汇编最后一章 翻两页又合上了..把自己的信心都搞没了.感觉自己的理解能力不行, ...

  3. PE格式第六讲,导出表

    PE格式第六讲,导出表 请注意,下方字数比较多,其实结构挺简单,但是你如果把博客内容弄明白了,对你受益匪浅,千万不要看到字数多就懵了,其实字数多代表它重要.特别是第五步, 各种表中之间的关系. 作者: ...

  4. PE格式第七讲,重定位表

    PE格式第七讲,重定位表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶何为重定位(注意,不是重定位表格) 首先, ...

  5. PE格式第八讲,TLS表(线程局部存储)

    PE格式第八讲,TLS表(线程局部存储) 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶复习线程相关知识 首先讲解 ...

  6. 可执行文件(ELF)格式的理解

    摘自http://www.cnblogs.com/xmphoenix/archive/2011/10/23/2221879.html 可执行文件(ELF)格式的理解 ELF(Executable an ...

  7. PE格式第四讲,数据目录表之导入表,以及IAT表

    PE格式第四讲,数据目录表之导入表,以及IAT表 一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的? 他会Call 下边的Jm ...

  8. PE格式第五讲,手工添加节表

    PE格式第五讲,手工添加节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 首先我们要用汇编编写一段汇编代码,用来生成 ...

  9. PE格式第九讲,资源表解析

    PE格式第九讲,资源表解析 一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件 ...

随机推荐

  1. HttpClient特性

    Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ...

  2. 怎样在Android中ListView与ArrayAdapter配合使用

    [代码]main.xml   <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  3. 数据库mysql的基本命令

    问题分析 当数据量很大的时候,所有数据都集中在一个文本文件中的话,读写会很困难,内存消耗大,速度很慢 操作很麻烦,因为读写都要根据指定的格式尽心解析,不通用 每次获取数据都要全部数据重新读写,不能通过 ...

  4. css3选择器 以及当天知道的东西

    10.25日伪类:a:link{}未访问的链接      a:visited{}已访问的链接     a:hover{}鼠标移动到链接上      a:active{}选定的链接  注:a:hover ...

  5. POJ C程序设计进阶 编程题#5:细菌分组实验

    编程题#5:细菌实验分组 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 有 ...

  6. UI Button

    iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...

  7. objective-C运算符和表达式

    运算符可以分为以下几种: 算术运算符:+,-,*,/,%,++,—-. 关系运算符:<,>,<=,>=,==,!= 布尔逻辑运算符:!,&&,|| 位运算符:| ...

  8. php输出函数 var_dump, dump,print,print_r 区别

    php输出函数 var_dump, dump,print,print_r 区别 周末有空就来整理下

  9. 奇怪的函数 (codevs 3538/1696) 题解

    [题目描述] 给定n,使得x^x达到或超过n位数字的最小正整数x是多少? [样例输入] 11 [样例输出] 10 [解题思路] 首先想到枚举,但是范围有点大,n<=2*10^9,果断用二分.其实 ...

  10. 【转载】10分钟学会理解和解决MySQL乱码问题

    原文地址:http://cenalulu.github.io/mysql/mysql-mojibake/ 原文作者:Junyi Lu,卢钧轶 / cenalulu / Luke 查看原文.