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. LinqToDataTable

    /// <summary> /// 下面通过一个方法来实现返回DataTable类型 /// LINQ返回DataTable类型 /// </summary> /// < ...

  2. JS数组(Array)处理函数总结

    1.concat() 连接两个或更多的数组该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本.例如: <script type="text/javascript"&g ...

  3. JavaScript常用标签和方法总结

    什么是javascript?   (1) JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的 脚本语言. (2) JavaScript是由Nets ...

  4. 导航控制器(UINavigationController)

    一.导航控制器基础 1.导航控制器的组成 i.中间视图 ii.导航栏 iii.工具栏 2.配置一个导航界面 a.配置一个导航界面最重要的部分就是配置被包含的视图控制器. b.当它所属的视图控制器在导航 ...

  5. Resources are low on NN. Please add or free up more resources then turn off safe mode manually.

    提交spark应用到yarn集群上的时候在跑一段时间就会出现这个报错: 根据上面的报错原因分析是因为集群资源不够,集群的自我保护机制使hdfs处于安全模式,然后我用"hdfs dfsadmi ...

  6. zookeeper典型应用场景之一:master选举

    对于zookeeper这种东西,仅仅知道怎么安装是远远不够的,至少要对其几个典型的应用场景进行了解,才能比较全面的知道zk究竟能干啥,怎么玩儿,以后的日子里才能知道这货如何能为我所用.于是,有了如下的 ...

  7. PHP常用函数和常见疑难问题解答

    PHP常用库函数介绍 一.PHP字符串操作常用函数 1.确定字符串长度  int strlen(string str) 2.比较两个字符串 a. strcmp函数对两个字符串进行二进制安全的比较,并区 ...

  8. VB 进制转换大全

    '二进制转十进制 Public Function B2D(vBStr As String) As Long Dim vLen As Integer '串长 Dim vDec As Long '结果 D ...

  9. 代码重启SQL命令

    1.net stop mssqlserver --停止mssqlserver 2.net start mssqlserver  --开始mssqlserver

  10. AngularJs记录学习02

    <!doctype html> <html ng-app="myapp"> <head> <meta http-equiv="C ...