在windows 9x.nt.2000下,所有的可执行文件都是基于microsoft设计的一种新的文件格式portable executable file format(可移植的执行体),即pe格式.有一些时候,我们需要对这些可执行文件进行修改,下面文字试图详细的描述pe文件的格式及对pe格式文件的修改.
1.pe文件框架构成 【程序编程相关:走近中国的Oracle】 【推荐阅读:中小异构Linux网络故障分析与排除】dos mz header 【扩展信息:智能手机平台之争】 dos stub pe header section table section 1 section 2 section ... section n上 表是pe文件结构的总体层次分布.所有 pe文件(甚至32位的 dlls) 必须以一个简单的 dos mz header 开始,在偏移0处有dos下可执行文件的“mz标志”,有了它,一旦程序在dos下执行,dos就能识别出这是有效的执行体,然后运行紧随 mz header 之后的 dos stub.dos stub实际上是个有效的exe,在不支持 pe文件格式的操作系统中,它将简单显示一个错误提示,类似于字符串 " this program cannot run in dos mode " 或者程序员可根据自己的意图实现完整的 dos代码.通常dos stub由汇编器/编译器自动生成,对我们的用处不是很大,它简单调用中断21h服务9来显示字符串"this program cannot run in dos mode".
紧接着 dos stub 的是 pe header. pe header 是pe相关结构 image_nt_headers 的简称,其中包含了许多pe装载器用到的重要域.可执行文件在支持pe文件结构的操作系统中执行时,pe装载器将从 dos mz header的偏移3ch处找到 pe header 的起始偏移量.因而跳过了 dos stub 直接定位到真正的文件头 pe header.pe文件的真正内容划分成块,称之为sections(节).每节是一块拥有共同属性的数据,比如“.text”节等,那么,每一节的内容都是什么呢?实际上pe格式的文件把具有相同属性的内容放入同一个节中,而不必关心类似“.text”.“.data”的命名,其命名只是为了便于识别,所有,我们如果对pe格式的文件进行修改,理论上讲可以写入任何一个节内,并调整此节的属性就可以了.
pe header 接下来的数组结构 section table(节表). 每个结构包含对应节的属性.文件偏移量.虚拟偏移量等.如果pe文件里有5个节,那么此结构数组内就有5个成员.以上就是pe文件格式的物理分布,下面将总结一下装载一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(引入表)逻辑部分. 上述步骤是一些前辈分析的结果简述. 2.pe文件头概述 我们可以在winnt.h这个文件中找到关于pe文件头的定义: typedef struct _image_nt_headers { dword signature; //pe文件头标志 :“pe\0\0”.在开始dos header的偏移3ch处所指向的地址开始 image_file_header fileheader; //pe文件物理分布的信息 image_optional_header32 optionalheader; //pe文件逻辑分布的信息 ... 下一页