PE文件格式介绍
Useful Tools:
1. WDK安装目录下搜下depends.exe,这个工具可以查看.exe文件依赖的.dll,以及用到的dll中的api。
2.PE文件格式分析器:
有很多的PE格式分析器,我随便试了两个,lordPE.exe,prjPEParserEx.exe都还不错,放我百度云盘了。
http://yun.baidu.com/share/link?shareid=2025240688&uk=758458210
3.Visual Studio自带的的dumpbin工具
dumpbin /ALL xxx.exe >>xx.txt
PE文件格式适用于.exe,.dll,.sys文件(.obj->COFF类似)
PE文件的布局:
- __________________________________
| |<----Base of Image Header
| DOS compatible EXE header |--|
|__________________________________| |
| | |
| Unused | |
|__________________________________| |
| | |
| OEM identifier | |
|__________________________________| |
| | |
| OEM info | |-->Uninteresting(DOS Compatibility)
|__________________________________| |
| | |
| Offset to PE Header |----->Very interesting
|__________________________________| |
| | |
| DOS Stub program and reloc table | |
|__________________________________| |
| | |
| Unused |__|
|__________________________________|
| |
| PE header(IMAGE_FILE_HEADER) |--|
|__________________________________| |
| | |
| PE header(IMAGE_OPTIONAL_HEADER) | |
|__________________________________| |-->Very very interesting :)
| | |
| Section Table | |
|__________________________________| |
| | |
| Sections |__|
|__________________________________|
★ Dos Header Info (IMAGE_DOS_HEADER)
IMAGE_DOS_HEADER的定义如下
- typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
- WORD e_magic; // Magic number
- WORD e_cblp; // Bytes on last page of file
- WORD e_cp; // Pages in file
- WORD e_crlc; // Relocations
- WORD e_cparhdr; // Size of header in paragraphs
- WORD e_minalloc; // Minimum extra paragraphs needed
- WORD e_maxalloc; // Maximum extra paragraphs needed
- WORD e_ss; // Initial (relative) SS value
- WORD e_sp; // Initial SP value
- WORD e_csum; // Checksum
- WORD e_ip; // Initial IP value
- WORD e_cs; // Initial (relative) CS value
- WORD e_lfarlc; // File address of relocation table
- WORD e_ovno; // Overlay number
- WORD e_res[]; // Reserved words
- WORD e_oemid; // OEM identifier (for e_oeminfo)
- WORD e_oeminfo; // OEM information; e_oemid specific
- WORD e_res2[]; // Reserved words
- LONG e_lfanew; // File address of new exe header
- } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
- 比较有用的是:e_lfanew,表示IMAGE_NT_HEADERS在文件中地址。
★ PE Header Info (IMAGE_NT_HEADER)
- IMAGE_NT_HEADERS STRUCT{
- +00H DWORD Signature
- +04H IMAGE_FILE_HEADER FileHeader
- +18H IMAGE_OPTIONAL_HEADER32 OptionalHeader
- }IMAGE_NT_HEADERS
★ File Header Info (IMAGE_FILE_HEADER)
- typedef struct _IMAGE_FILE_HEADER{
- +04H WORD Machine; //运行平台
- +06H WORD NumberOfSections; //文件的区块数目 !!important
- +08H DWORD TimeDateStamp; //文件创建日期和事件
- +0CH DWORD PointerToSymbolTable; //只想符号表(主要用于调试)
- +10H DWORD NumberOfSymbols; //符号表中的符号个数(同上)
- +14H WORD SizeOfOptionalHeader; //IMAGE_OPTIONAL_HEADER32结构大小
- +16H WORD Characteristics; //文件属性
- }IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;
★ Optional Header Info (IMAGE_OPTIONAL_HEADER)
- typedef struct _IMAGE_OPTIONAL_HEADER{
- +28H DWORD AddressOfEntryPoint; // 程序执行入口RVA
- +34H DWORD ImageBase; // 程序的首选装载地址
- +38H DWORD SectionAlignment; // 内存中的区块的对齐大小
- +3CH DWORD FileAlignment; // 文件中的区块的对齐大小
- +5CH WORD Subsystem; // 可执行文件期望的子系统
- +78H IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; //IMAGE_NUMBEROF_DIRECTORY_ENTRIES=0x10
- }IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTION_HEADER32
- Directory Entry的结构
1 IMAGE_DATA_DIRECTORY STRUCT{- VirtualAddress DWORD ? ;相对虚拟地址
- isize DWORD ? ;大小
- }IMAGE_DATA_DIRECTORY
那16个Directory Entry,根据其RVA(VirtualAddress)可以推算出其在哪个section,在文件哪个位置。
比如:Export Entry一般在.rdata section中, Import Entry在.idata section(The imports table),
Resource Entry在.rsrc section(The resources),BaseReloc Entry在.reloc section
Debug Entry 在.rdata section, IAT Entry在.idata section...
★ Section Header Info
- typedef struct IMAGE_SECTION_HEADER
- {
- BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; //IMAGE_SIZEOF_SHORT_NAME = 8
- union
- {
- DWORD PhysicalAddress;
- DWORD VirtualSize;
- }Misc;
- DWORD VirtualAddress; //节被载到内存之后的偏移
- DWORD SizeOfRawData;
- DWORD PointerToRawData;
- DWORD PointerToRelocations;
- DWORD PointerToLinenumbers;
- WORD NumberOfRelocations;
- WORD NumberOfLinenumbers;
- DWORD Characteristics;
- }IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
共0x28个Byte.
IMAGE_FILE_HEADER里面会制定section的个数
.text .data .rdata .idata .didat .reloc .rsrc.
在这个section table之后,会按照IMAGE_OPTIONAL_HEADER->FileAlignment来对其,然后就是各个section的内容了。
如果没有symbol啥的信息的话,各个section填完之后,文件就结束了。
=================================================
section table,
所有section都有两个对齐值(文件内offset(0x200),内存offset(一个Page)),section的其实地址需要以此对齐。
如:
- 01 .text VirtSize: 00074658 VirtAddr: 00001000 raw data offs: 00000400 raw data size: 00074800...
02 .data VirtSize: 000028CA VirtAddr: 00076000 raw data offs: 00074C00 raw data size: 00002400- Can refer this useful link:
http://en.wikibooks.org/wiki/X86_Disassembly/Windows_Executable_Files#Relative_Virtual_Addressing_.28RVA.29
PE文件格式介绍的更多相关文章
- PE文件格式详解(一)
PE文件格式介绍(一) 0x00 前言 PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件.了解PE文件格式有助于加深对操作系统的理解 ...
- PE文件格式详解(上)
作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...
- PE文件格式详解,第一讲,DOS头文件格式
PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...
- 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍
第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.fre ...
- PE文件介绍 (2)-DOS头,DOS存根,NT头
PE头 PE头由许多结构体组成,现在开始逐一学习各结构体 0X00 DOS头 微软创建PE文件格式时,人们正广泛使用DOS文件,所以微软充分考虑了PE文件对DOS文件的兼容性.其结果是在PE头的最前面 ...
- PE文件介绍 (1)
PE文件介绍 PE文件主要是windows操作系统下使用的可执行文件格式,PE文件是指32位的可执行文件也叫做PE32,64位可执行文件叫做PE+或者PE32+ PE文件格式 种类 主扩展名 可执行类 ...
- PE文件格式详解(七)
PE文件格式详解(七) Ox00 前言 前面好几篇在讲输入表,今天要讲的是输出表和地址的是地址重定位.有了前面的基础,其实对于怎么找输出表地址重定位的表已经非常熟悉了. 0x01 输出表结构 ...
- Reverse Core 第二部分 - 13章 - PE文件格式
@date: 2016/11/24 @author: dlive PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...
- PE文件格式 持续更新ing
PE文件就是exe文件和dll文件,前者是可执行文件,后者是动态连接库文件.两者的区别仅仅是字面上的,唯一的区别就是内部的一个字段标识这个文件是exe文件还是dll文件. 对于PE文件格式,举一个例子 ...
随机推荐
- axios基础用法
概述: 1.axios:一个基于Promise用于浏览器和nodejs的HTTP客户端.本质是对ajax的封装. 特征: 1>从浏览器中创建XMLHttpRequest 2>从node.j ...
- C++的句柄类
上一篇文件介绍了关于C++代理类的使用场景和实现方法,但是代理类存在一定的缺陷,就是每个代理类会创建一个新的对象,无法避免一些不必要的内存拷贝,本篇文章引入句柄类,在保持代理类多态性的同时,还可以避免 ...
- Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法
在使用了 RTKLIB开源包自带的 rtkplot.exe后,知道了它所具有的功能,就想着如何模仿它做出一个 demo.一开始看的是之前下载的 2.4.2版本的 RTKLIB,里面是使用 Delphi ...
- oracle调度中使用schedule管理调度
开始前,先说一句:作为dba应该禁止所有应用使用dbms_job. dbms_scheduler非常复杂,oracle在两本书中专门花费不少章节描述,这两本书分别是: Oracle® Database ...
- java中的基本算法
整理一下常用的又基础的算法.由于平时的项目比较简单,很少用到算法,但工作不只是眼前的苟且,还有诗和远方. 1.链表 链表用来存储数据,由一系列的结点组成.这些结点的物理地址不一定是连续的,即可能连续, ...
- deepin15.7下使用apt安装mysql5.7不显示root密码设置的解决方法
在安装MySQL的过程中,并没有要求设置root账户密码的步骤,导致很多人无法使用root账户登录 这个问题早已有解决方案,笔者在deepin15.7下安装也遇到同样问题,只是做一个简单的记录 解决思 ...
- 【Commare中关于理论范畴和技术常用的技术术语】
1:地址掩码,分类2:OSI/TCP-IP层,归属,作用3:debugg,dispaly具体配置,排错,现象4:原理5:术语 | | = 局域网,广域网 | | = ( (OSPF,RIP,ISIS, ...
- web3.js_1.x.x--API(二)/合约部署与事件调用
web3.js_1.x.x的使用和网上查到的官方文档有些不同,我对经常使用到的API进行一些整理,希望能帮到大家 转载博客:http://www.cnblogs.com/baizx/p/7474774 ...
- Python学习 :六个标准数据类型
一.Numbers(数字类型) 数字类型主要分为两种—— 整数(Integer)与 浮点数(Float) 整数分为整型和长整型(在Python3中已经不再区分为整型与长整型,统一称为整型) 注意:数字 ...
- Django之频率组件
一.频率简介 为了控制用户对某个url的请求 的频率,比如 ,一分钟以内,只能访问三次 二.自定义频率类,自定义频率规则 自定义的逻辑 (1)取出访问者的ip (2)判断当前ip不在访问字典里,添加进 ...