PE文件解读
PE文件解读:---------参考文章---------------------------------http://blog.sina.com.cn/s/blog_6cc1c52d0100vqg6.htmlhttp://www.cplusplus.com/reference/cstdio/fread/http://www.cnblogs.com/hoodlum1980/arch
·
PE文件解读:
---------参考文章---------------------------------
http://blog.sina.com.cn/s/blog_6cc1c52d0100vqg6.html
http://www.cplusplus.com/reference/cstdio/fread/
http://www.cnblogs.com/hoodlum1980/archive/2010/09/10/1822906.html
http://blog.csdn.net/eaglewood2005/article/details/4776305
----------------------------------------
VA:visual address
PE文件被加载入内存后,就被分配了4G的虚拟内存(通过pagefile.sys驱动,以页的方式进行内存交换),其中高2G是系统内核空间,低2G是用户空间。
范围:0x00000000h ~ 0xFFFFFFFFh
进程本身的VA = 进程的基地址 + 相对虚拟内存地址(RVA)
每个链接库加载到进程地址空间(被称为模块)后,每个模块都被分配一个基地址(即告诉系统他会占用内存的哪个部分)。
RVA(Reverse visual address,相对虚拟地址)是相对于基址的偏移,即RVA是相对于基址来说的。
FOA(File Offset Address,文件偏移地址)和内存无关,他指的是某个位置距离文件头的偏移。
还有一些特殊地址(如资源文件地址)是从模块的基址等位置算起,一般很少。
PE中,如果某个字段存储的值是一个地址,那么这个字段就是一个指针。指针也可以指向另外的指针。
数据目录:PE中为了兼容新的系统特性,存在一个数据结构(数据目录),其中记录了所有可能的数据类型,这些类型目前已定义的有15种,包括:导入表、导出表、资源表、异常表、属性证书表、重定位表、调试数据、Architecture、Global Ptr 、线城局部数据、加载配置表、绑定导入表、IAT、延迟导入表和CLR运行时头部。
节:(存放不同类型数据的地方,不同的节有不同的读写访问权)
汇编语言中,以“.”开头的一些伪指令表示不同的数据类型,如“.data”表示初始化的数据,“.data?”表示未初始化的数据,“.code”表示可执行的代码,".reloc"重定位表。其中一些节只在文件中存在,而另一些节只在内存中存在。
PE文件的对齐:
1、内存对齐:Windows系统对内存的管理以页为单位,所以节咋内存中的对齐必须也以页为最小大小,对32位系统来书是4KB(0x1000h),64位是8KB(0x2000h)。
2、文件对齐:为了提高磁盘利用率,通常会以一个物理扇区的大小(512字节,即0x200h)未对齐单元。
3、资源文件对齐:资源文件一般以双字(4字节)对齐。
UNICODE处理:
PE格式中所涉及的字符串均使用ANSI,而在资源表中,对菜单名、对话框标题等描述全部使用UNICODE,所以读取时一般需要使用API函数实现从宽字符到窄字符的转换。
-------------------------------------------------
———————————
| DOS MZ 头 | —
|----------------------| | DOS 头 —
| DOS Stub | — |
|----------------------| | PE 文件头部
| PE 头 | —> PE 头 —
|----------------------|
| 节表 | —
|----------------------| | PE数据区
| 节内容 | —
———————————
DOS MZ 头大小为64字节,PE头大小为456字节,每个节的大小不固定,但是节的描述信息是40字节,节的数量由IMAGE_FILE_HEADER.NumberOfSection决定,DOS Stub 和节内容大小都不固定。
PE_start = DOS MZ基地址 + IMAGE_DOS_HEADER.e_lfanew
---------参考文章---------------------------------
http://blog.sina.com.cn/s/blog_6cc1c52d0100vqg6.html
http://www.cplusplus.com/reference/cstdio/fread/
http://www.cnblogs.com/hoodlum1980/archive/2010/09/10/1822906.html
http://blog.csdn.net/eaglewood2005/article/details/4776305
----------------------------------------
VA:visual address
PE文件被加载入内存后,就被分配了4G的虚拟内存(通过pagefile.sys驱动,以页的方式进行内存交换),其中高2G是系统内核空间,低2G是用户空间。
范围:0x00000000h ~ 0xFFFFFFFFh
进程本身的VA = 进程的基地址 + 相对虚拟内存地址(RVA)
每个链接库加载到进程地址空间(被称为模块)后,每个模块都被分配一个基地址(即告诉系统他会占用内存的哪个部分)。
RVA(Reverse visual address,相对虚拟地址)是相对于基址的偏移,即RVA是相对于基址来说的。
FOA(File Offset Address,文件偏移地址)和内存无关,他指的是某个位置距离文件头的偏移。
还有一些特殊地址(如资源文件地址)是从模块的基址等位置算起,一般很少。
PE中,如果某个字段存储的值是一个地址,那么这个字段就是一个指针。指针也可以指向另外的指针。
数据目录:PE中为了兼容新的系统特性,存在一个数据结构(数据目录),其中记录了所有可能的数据类型,这些类型目前已定义的有15种,包括:导入表、导出表、资源表、异常表、属性证书表、重定位表、调试数据、Architecture、Global Ptr 、线城局部数据、加载配置表、绑定导入表、IAT、延迟导入表和CLR运行时头部。
节:(存放不同类型数据的地方,不同的节有不同的读写访问权)
汇编语言中,以“.”开头的一些伪指令表示不同的数据类型,如“.data”表示初始化的数据,“.data?”表示未初始化的数据,“.code”表示可执行的代码,".reloc"重定位表。其中一些节只在文件中存在,而另一些节只在内存中存在。
PE文件的对齐:
1、内存对齐:Windows系统对内存的管理以页为单位,所以节咋内存中的对齐必须也以页为最小大小,对32位系统来书是4KB(0x1000h),64位是8KB(0x2000h)。
2、文件对齐:为了提高磁盘利用率,通常会以一个物理扇区的大小(512字节,即0x200h)未对齐单元。
3、资源文件对齐:资源文件一般以双字(4字节)对齐。
UNICODE处理:
PE格式中所涉及的字符串均使用ANSI,而在资源表中,对菜单名、对话框标题等描述全部使用UNICODE,所以读取时一般需要使用API函数实现从宽字符到窄字符的转换。
-------------------------------------------------
———————————
| DOS MZ 头 | —
|----------------------| | DOS 头 —
| DOS Stub | — |
|----------------------| | PE 文件头部
| PE 头 | —> PE 头 —
|----------------------|
| 节表 | —
|----------------------| | PE数据区
| 节内容 | —
———————————
DOS MZ 头大小为64字节,PE头大小为456字节,每个节的大小不固定,但是节的描述信息是40字节,节的数量由IMAGE_FILE_HEADER.NumberOfSection决定,DOS Stub 和节内容大小都不固定。
PE_start = DOS MZ基地址 + IMAGE_DOS_HEADER.e_lfanew
更多推荐



所有评论(0)