当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: 在windows 9x、NT、2000下,所有的可执行文件都是基于Microsoft设计的一种新的文件格式Portable Executable File Format(可移植的执行体),即PE格式。
 

 

 ·gzip文件格式简介    »显示摘要«
    摘要: p.bhw98 { padding-right: 0px; padding-left: 0px; font-size: 9pt; padding-bottom: 0px; margin: 10px 0px 5px; line-height: normal; padding-top: 0px; font-family: verdana, arial } ......
 ·结合pe格式对linker分析1    »显示摘要«
    摘要:这是以前我学习pe的时候的一些摘要。分析摘要:(*1*): 写程序。a.cpp 和 foo.cpp其中a.cpp的内容为: extern void foo();void main(){ foo();} foo.cpp的内容为: #include "stdio.h"void foo(){ printf("i am foo!");}编译程序产生a.obj ......


关于PE可执行文件的修改

在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文件逻辑分布的信息


...   下一页
 ·coff文件的格式    »显示摘要«
    摘要: coff格式......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE