pe学习笔记
【程序编程相关:显示JPG和GIF图片的简单方法】pe 的意思就是 portable executable(可移植的执行体).pe文件结构的总体层次分布图: 【推荐阅读:文档—视窗结构批判】
|dos mz header | 【扩展信息:http://www.myfaq.com】 --------------|--------------||dos stub ||--------------||pe header ||--------------||section table ||--------------||section 1 ||--------------| |section 2 ||--------------||section ... ||--------------||section n | -------------- 一.pe文件格式的概要1.1.dos mz header:
所有 pe文件(甚至32位的 dlls)必须以一个简单的 dos mz header 开始.有了它,一旦程序在dos下执行,dos就能识别出这是有效的执行体,然后运行紧随 mz header 之后的 dos stub.1.2.dos stub:
dos stub(存根)实际上是个有效的 ms-dos .exe 或者.com 程序(如果文件格式不对会报错),在不支持 pe文件格式的操作系统中,它将通过简单调用中断21h服务9来显示字符串"this program cannot run in dos mode"或者根据程序员自己的意图实现完整的 dos 代码.它的大小一般不能确定.利用链接器(linker)的 /stub:filename 选项可以替换这个程序.1.3.pe header:
紧接着 dos stub 的是 pe header.pe header 是pe相关结构 image_nt_headers 的简称,其中包含了许多pe装载器用到的重要域.执行体在支持pe文件结构的操作系统中执行时,pe装载器将从 dos mz header (image_dos_header)中找到 pe header 的起始偏移量.因而跳过了dos stub 直接定位到真正的文件头pe header.1.4.section table:
pe header 接下来的数组结构 section table (节表).如果pe文件里有5个节,那么此 section table 结构数组内就有5个成员,每个成员包含对应节的属性.文件偏移量.虚拟偏移量等.1.5.sections:
pe文件的真正内容被划分成块,称之为section(节).每个标准节的名字均以圆点开头.sections 是以其起始位址来排列,而不是以其字母次序来排列.下面是常见的节名及作用: 节名 作用.arch 最初的构建信息(alpha architecture information).bss 未经初始化的数据.crt c运行期只读数据.data 已经初始化的数据.debug 调试信息.didata 延迟输入文件名表.edata 导出文件名表.idata 导入文件名表.pdata 异常信息(exception information).rdata 只读的初始化数据.reloc 重定位表信息.rsrc 资源.text .exe或.dll文件的可执行代码.tls 线程的本地存储器.xdata 异常处理表 节的划分是基于各组数据的共同属性,而不是逻辑概念.每节是一块拥有共同属性的数据,比如代码/数据.读/写等.如果pe文件中的数据/代码拥有相同属性,它们就能被归入同一节中.节名称仅仅是个区别不同节的符号而已,类似"data", "code"的命名只为了便于识别,惟有节的属性设置决定了节的特性与功能.1.6.装载一pe文件的主要步骤:
1.当pe文件被执行,pe装载器检查 dos mz header 里的 pe header 偏移量.如果找到,则跳转到 pe header.
2.pe装载器检查 pe header 的有效性.如果有效,就跳转到pe header的尾部. 3.紧跟 pe header 的是节表.pe装载器读取其中的节信息,并采用文件映射方法将这些节映射到内存,同时付上节表里指定的节属性. 4.pe文件映射入内存后,pe装载器将处理pe文件中类似 import table(导入表)逻辑部分. 二.dos mz header 与 pe header2.1.dos mz header 定义成结构 image_dos_header(64字节) .结构定义如下:
... 下一页