PE文件学习

PE文件学习记录

大三下的选修课程《恶意代码分析》中需要学习PE文件的相关知识,以此为契机,记录一下自己的学习过程并对知识加以整理和理解

PE文件相关基本概念

1.基地址(ImageBase):

PE文件被加载到内存后,内存中的版本被称为模块(Module),映射文件的起始地址被称为模块句柄(hModule)。这个初始内存地址也被称为基地址(ImageBase)。

2虚拟地址(VA):

在PE用语中,PE文件实际的内存地址被称为虚拟地址(VA,Virtual Address)。

3.相对虚拟地址(RVA):

为了避免PE文件中有确定的内存地址,出现了相对虚拟地址(Relative Virtual Addres,即RVA)。RVA是内存中的一个简单的相对于PE文件装入地址的偏移位置,他是一个相对的位置,或者称为偏移量。
假如一个PE文件从地址400000h装入,并且他的代码区块去从440000h开始,那么代码区块的RVA 则为
440000h-400000h=40000h。

VA(虚拟地址) - ImageBase(基址) = RVA(相对虚拟地址)

4.文件偏移地址:
当PE文件存储在磁盘上时,某个数据相对于文件头的偏移量,称为文件偏移地址(File Offset)或物理地址(Raw Offset)。文件偏移地址从PE文件的第一个字节开始计数,起始值为0。用十六进制工具(Winhex等)打开文件显示的就是文件偏移地址。

PE文件格式

1.MS-DOS头部
每个PE文件都是由一个DOS程序开始的,有了它,程序在DOS环境下运行性时,DOS就能识别出这是一个有效的执行体,随后运行的是DOS stub(DOS块)。DOS块是一个有效的EXE文件,在不支持PE文件的操作系统中,它将简单的显示一条错误提示。

DOS头部:

typedef struct IMAGE_DOS_HEADER{  
      WORD e_magic;         //DOS头的标识,为4Dh和5Ah,为字母MZ                                          
      WORD e_cblp;  
      WORD e_cp;  
      WORD e_crlc;  
      WORD e_cparhdr;  
      WORD e_minalloc;  
      WORD e_maxalloc;  
      WORD e_ss;  
      WORD e_sp;  
      WORD e_csum;  
      WORD e_ip;  
      WORD e_cs;  
      WORD e_lfarlc;  
      WORD e_ovno;  
      WORD e_res[4];  
      WORD e_oemid;  
      WORD e_oeminfo;  
      WORD e_res2[10];  
      DWORD e_lfanew;             //指向IMAGE_NT_HEADERS的所在  
}IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;  

e_magic字段为DOS头标识,需要被设置为5A4DH,ASCLL码值为MZ,是MS-DOS的最初创建者之一的名字缩写。

e_lfanew字段为真正PE文件头的相对偏移地址(RVA),指出真正PE头的文件偏移位置。

在winhex中查看exe文件:
在这里插入图片描述
2.PE文件头
紧跟着DOS stub的是PE文件头(PE Header)。PE Header是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从DOS头中的e_lfanew字段中找到PE Header的起始偏移量,加上基址得到PE文件头的基址。

PNTHeader = ImageBase + dosHeader->e_lfanew

IMAGE_NT_HEADER是由三个字段组成

typedef struct IMAGE_NT_HEADERS{  
      DWORD Signature;                            ?;PE文件标识
      IMAGE_FILE_HEADER FileHeader;  
      IMAGE_OPTIONAL_HEADER32 OptionalHeader;  
}IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS;   

1. Signature字段
在一个有效PE文件中,Signature字段被设置为00004550h,ASCLL码为’PE\0\0’,#define IMAGE_NT_SIGNNATURE定义了这个值。

#define IMAGE_NT_SIGNNATURE    0x00004550

2. IMAGE_FILE_HEADER
IMAGE_FILE_HEADER(映像文件头)结构包含了一些关于PE文件的基本信息。

typedef struct _IMAGE_FILE_HEADER {  
    WORD    Machine;                    //运行平台  
    WORD    NumberOfSections;           //文件的区块数目  
    DWORD   TimeDateStamp;              //文件创建日期和时间  
    DWORD   PointerToSymbolTable;       //指向符号表(用于调试)  
    DWORD   NumberOfSymbols;            //符号表中符号个数(用于调试)  
    WORD    SizeOfOptionalHeader;       //IMAGE_OPTIONAL_HEADER32结构大小  
    WORD    Characteristics;            //文件属性  
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;  

其中较为重要的是
1.SizeOfOptionalHeader:
指出了IMAGE_OPTION_HEADER结构的大小。
2.NumberOfSections:
指出了文件的区块数目。

3.IMAGE_OPTIONAL_HEADER

###待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值