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文件格式介绍的更多相关文章

  1. PE文件格式详解(一)

    PE文件格式介绍(一) 0x00 前言 PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件.了解PE文件格式有助于加深对操作系统的理解 ...

  2. PE文件格式详解(上)

    作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...

  3. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

  4. 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍

    第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.fre ...

  5. PE文件介绍 (2)-DOS头,DOS存根,NT头

    PE头 PE头由许多结构体组成,现在开始逐一学习各结构体 0X00 DOS头 微软创建PE文件格式时,人们正广泛使用DOS文件,所以微软充分考虑了PE文件对DOS文件的兼容性.其结果是在PE头的最前面 ...

  6. PE文件介绍 (1)

    PE文件介绍 PE文件主要是windows操作系统下使用的可执行文件格式,PE文件是指32位的可执行文件也叫做PE32,64位可执行文件叫做PE+或者PE32+ PE文件格式 种类 主扩展名 可执行类 ...

  7. PE文件格式详解(七)

    PE文件格式详解(七)   Ox00 前言 前面好几篇在讲输入表,今天要讲的是输出表和地址的是地址重定位.有了前面的基础,其实对于怎么找输出表地址重定位的表已经非常熟悉了.   0x01 输出表结构 ...

  8. Reverse Core 第二部分 - 13章 - PE文件格式

    @date: 2016/11/24 @author: dlive ​ PE (portable executable) ,它是微软在Unix平台的COFF(Common Object File For ...

  9. PE文件格式 持续更新ing

    PE文件就是exe文件和dll文件,前者是可执行文件,后者是动态连接库文件.两者的区别仅仅是字面上的,唯一的区别就是内部的一个字段标识这个文件是exe文件还是dll文件. 对于PE文件格式,举一个例子 ...

随机推荐

  1. ABAP术语-BW (Business Information Warehouse)

    BW (Business Information Warehouse) 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/14/1037761. ...

  2. python排序算法的整理

    #冒泡排序,主要思想:从第一个元素开始,向尾部开始比较大小换位置 def bubble_sort(alist): for j in range(len(alist)-1,0,-1): for i in ...

  3. 解决Nginx: [error] open() "/usr/local/Nginx/logs/Nginx.pid" failed(2:No such file or directory)

    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

  4. 快速玩转linux(1)

    快速上手Linux玩转典型应用 mark 大牛都会使用Linux, Linux命令是行业要求. 商业服务器基本都是linux 开源软件都先支持Linux(只支持) 大数据分析.机器学习首选Linux ...

  5. 修改pytorch官方实例适用于自己的二分类迁移学习项目

    本demo从pytorch官方的迁移学习示例修改而来,增加了以下功能: 根据AUC来迭代最优参数: 五折交叉验证: 输出验证集错误分类图片: 输出分类报告并保存AUC结果图片. import os i ...

  6. javascript--事件对象e的来源、意义、应用及其属性的用法 function(e){}

    在类似于arcgis api for javascript中,经常会遇到function(e),以前一直不懂e是个什么玩意,这种写法啥意思,经过最近一段时间学习,对e有了很深了解,本文通过各种示例,由 ...

  7. sql server,mysql,oracle平时用法的区别

    由于工作的原因,上家公司一直使用的oracle,后来接触了的几个项目,既有使用mysql的又有使用sqlserver,自己在使用sqlserver及mysql要实现某功能时,经常要在网上找来找去,所以 ...

  8. Java OOP——第三章 多态

    1.多态:(polymorphism): 是具有表现多种形态能力的特征: (专业化的说法:)同一个实现接口(引用类型),使用不同的实例而执行不同的操作 指一个引用(类型)在不同情况下的多种状态.也可以 ...

  9. symfony 数据库使用(二)

    symfony可以根据数据用已经有表反向生成实体,以3.3.*为例: php bin/console doctrine:mapping:import --force AppBundle xml 从现有 ...

  10. php+sqlserver处理读取decimal 类型数据,不满1的数字会去掉0的问题

    php+sqlserver处理读取decimal 类型数据,如果数据不满1,会去掉0的问题.比如读取的数据是 0.05,会显示 .05 function convert_number($number) ...