PE文件头解析大全

PE文件头解析大全
PE文件头解析大全

PE可选头部

PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针:

PEFILE.H

#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \

((PIMAGE_DOS_HEADER)a)->e_lfanew + \

SIZE_OF_NT_SIGNATURE + \

sizeof(IMAGE_FILE_HEADER)))

可选头部包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_HEADER结构如下:

WINNT.H

typedef struct _IMAGE_OPTIONAL_HEADER {

//

// 标准域

//

USHORT Magic;

UCHAR MajorLinkerVersion;

UCHAR MinorLinkerVersion;

ULONG SizeOfCode;

ULONG SizeOfInitializedData;

ULONG SizeOfUninitializedData;

ULONG AddressOfEntryPoint;

ULONG BaseOfCode;

ULONG BaseOfData;

//

// NT附加域

//

ULONG ImageBase;

ULONG SectionAlignment;

ULONG FileAlignment;

USHORT MajorOperatingSystemVersion;

USHORT MinorOperatingSystemVersion;

USHORT MajorImageVersion;

USHORT MinorImageVersion;

USHORT MajorSubsystemVersion;

USHORT MinorSubsystemVersion;

ULONG Reserved1;

ULONG SizeOfImage;

ULONG SizeOfHeaders;

ULONG CheckSum;

USHORT Subsystem;

USHORT DllCharacteristics;

ULONG SizeOfStackReserve;

ULONG SizeOfStackCommit;

ULONG SizeOfHeapReserve;

ULONG SizeOfHeapCommit;

ULONG LoaderFlags;

ULONG NumberOfRvaAndSizes;

IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

如你所见,这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感到厌烦,我会仅仅讨论有用的——就是说,对于探究PE文件格式而言有用的。

标准域

首先,请注意这个结构被划分为“标准域”和“NT附加域”。所谓标准域,就是和UNIX可执行文件的COFF 格式所公共的部分。虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的——尽管换个名字更好一些。

·Magic。我不知道这个域是干什么的,对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B

或267(译注:0x010B为.EXE,0x0107为ROM映像,这个信息我是从eXeScope上得来的)。

·MajorLinkerVersion、MinorLinkerVersion。表示链接此映像的链接器版本。随Window NT build 438配套的Windows NT SDK包含的链接器版本是2.39(十六进制为2.27)。

·SizeOfCode。可执行代码尺寸。

·SizeOfInitializedData。已初始化的数据尺寸。

·SizeOfUninitializedData。未初始化的数据尺寸。

·AddressOfEntryPoint。在标准域中,AddressOfEntryPoint域是对PE文件格式来说最为有趣的了。这个域表示应用程序入口点的位置。并且,对于系统黑客来说,这个位置就是导入地址表(IAT)的末尾。以下的函数示范了如何从可选头部获得Windows NT可执行映像的入口点。

PEFILE.C

LPVOID WINAPI GetModuleEntryPoint(LPVOID lpFile)

{

PIMAGE_OPTIONAL_HEADER poh;

poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);

if (poh != NULL)

return (LPVOID)poh->AddressOfEntryPoint;

else

return NULL;

}

·BaseOfCode。已载入映像的代码(“.text”段)的相对偏移量。

·BaseOfData。已载入映像的未初始化数据(“.bss”段)的相对偏移量。

Windows NT附加域

添加到Windows NT PE文件格式中的附加域为Windows NT特定的进程行为提供了装载器的支持,以下为这些域的概述。

·ImageBase。进程映像地址空间中的首选基地址。Windows NT的Microsoft Win32 SDK链接器将这个值默认设为0x00400000,但是你可以使用-BASE:linker开关改变这个值。

·SectionAlignment。从ImageBase开始,每个段都被相继的装入进程的地址空间中。SectionAlignment 则规定了装载时段能够占据的最小空间数量——就是说,段是关于SectionAlignment对齐的。

Windows NT虚拟内存管理器规定,段对齐不能少于页尺寸(当前的x86平台是4096字节),并且必须是成倍的页尺寸。4096字节是x86链接器的默认值,但是它可以通过-ALIGN: linker开关来设置。

·FileAlignment。映像文件首先装载的最小的信息块间隔。例如,链接器将一个段实体(段的原始数据)加零扩展为文件中最接近的FileAlignment边界。早先提及的2.39版链接器将映像文件以0x200字节的边界对齐,这个值可以被强制改为512到65535这么多。

·MajorOperatingSystemVersion。表示Windows NT操作系统的主版本号;通常对Windows NT 1.0而言,这个值被设为1。

·MinorOperatingSystemVersion。表示Windows NT操作系统的次版本号;通常对Windows NT 1.0而言,这个值被设为0。

·MajorImageVersion。用来表示应用程序的主版本号;对于Microsoft Excel 4.0而言,这个值是4。

·MinorImageVersion。用来表示应用程序的次版本号;对于Microsoft Excel 4.0而言,这个值是0。

·MajorSubsystemVersion。表示Windows NT Win32子系统的主版本号;通常对于Windows NT 3.10而言,这个值被设为3。

·MinorSubsystemVersion。表示Windows NT Win32子系统的次版本号;通常对于Windows NT 3.10而言,这个值被设为10。

·Reserved1。未知目的,通常不被系统使用,并被链接器设为0。

·SizeOfImage。表示载入的可执行映像的地址空间中要保留的地址空间大小,这个数字很大程度上受SectionAlignment的影响。例如,考虑一个拥有固定页尺寸4096字节的系统,如果你有一个11个段的可执行文件,它的每个段都少于4096字节,并且关于65536字节边界对齐,那么SizeOfImage域将会被设为11 * 65536 = 720896(176页)。而如果一个相同的文件关于4096字节对齐的话,那么SizeOfImage 域的结果将是11 * 4096 = 45056(11页)。这只是个简单的例子,它说明每个段需要少于一个页面的内存。在现实中,链接器通过个别地计算每个段的方法来决定SizeOfImage确切的值。它首先决定每个段需要多少字节,并且最后将页面总数向上取整至最接近的SectionAlignment边界,然后总数就是每个段个别需求之和了。

·SizeOfHeaders。这个域表示文件中有多少空间用来保存所有的文件头部,包括MS-DOS头部、PE文件头部、PE可选头部以及PE段头部。文件中所有的段实体就开始于这个位置。

·CheckSum。校验和是用来在装载时验证可执行文件的,它是由链接器设置并检验的。由于创建这些校验和的算法是私有信息,所以在此不进行讨论。

·Subsystem。用于标识该可执行文件目标子系统的域。每个可能的子系统取值列于WINNT.H的IMAGE_OPTIONAL_HEADER结构之后。

·DllCharacteristics。用来表示一个DLL映像是否为进程和线程的初始化及终止包含入口点的标记。

·SizeOfStackReserve、SizeOfStackCommit、SizeOfHeapReserve、SizeOfHeapCommit。这些域控制要保留的地址空间数量,并且负责栈和默认堆的申请。在默认情况下,栈和堆都拥有1个页面的申请值以及16个页面的保留值。这些值可以使用链接器开关-STACKSIZE:与-HEAPSIZE:来设置。

·LoaderFlags。告知装载器是否在装载时中止和调试,或者默认地正常运行。

·NumberOfRvaAndSizes。这个域标识了接下来的DataDirectory数组。请注意它被用来标识这个数组,而不是数组中的各个入口数字,这一点非常重要。

·DataDirectory。数据目录表示文件中其它可执行信息重要组成部分的位置。它事实上就是一个IMAGE_DATA_DIRECTORY结构的数组,位于可选头部结构的末尾。当前的PE文件格式定义了16种可能的数据目录,这之中的11种现在在使用中。

数据目录

WINNT.H之中所定义的数据目录为:

WINNT.H

// 目录入口

// 导出目录

#define IMAGE_DIRECTORY_ENTRY_EXPORT 0

// 导入目录

#define IMAGE_DIRECTORY_ENTRY_IMPORT 1

// 资源目录

#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2

// 异常目录

#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3

// 安全目录

#define IMAGE_DIRECTORY_ENTRY_SECURITY 4

// 重定位基本表

#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5

// 调试目录

#define IMAGE_DIRECTORY_ENTRY_DEBUG 6

// 描述字串

#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7

// 机器值(MIPS GP)

#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8

// TLS目录

#define IMAGE_DIRECTORY_ENTRY_TLS 9

// 载入配置目录

#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10

基本上,每个数据目录都是一个被定义为IMAGE_DATA_DIRECTORY的结构。虽然数据目录入口本身是相同的,但是每个特定的目录种类却是完全唯一的。每个数据目录的定义在本文的以后部分被描述为“预定义段”。

WINNT.H

typedef struct _IMAGE_DATA_DIRECTORY {

ULONG VirtualAddress;

ULONG Size;

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

每个数据目录入口指定了该目录的尺寸和相对虚拟地址。如果你要定义一个特定的目录的话,就需要从可选头部中的数据目录数组中决定相对的地址,然后使用虚拟地址来决定该目录位于哪个段中。一旦你决定了哪个段包含了该目录,该段的段头部就会被用于查找数据目录的精确文件偏移量位置。

所以要获得一个数据目录的话,那么首先你需要了解段的概念。我在下面会对其进行描述,这个讨论之后还有一个有关如何定位数据目录的示例。(未完待续)

PE文件格式详解

mingyoung收录于2007-02-04 阅读数:428 收藏数:1

公众公开

原文来源

tags:vc mfc

我也要收藏以文找文如何对文章标记,添加批注?

PE文件格式详解

Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式。PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦涩。

然而这一的文档并未提供足够的信息,所以开发者们无法很好地弄懂PE格式。本文旨在解决这一问题,它会对整个的PE文件格式作一个十分彻底的解释,另外,本文中还带有对所有必需结构的描述以及示范如何使用这些信息的源码示例。

为了获得PE文件中所包含的重要信息,我编写了一个名为PEFILE.DLL的动态链接库,本文中所有出现的源码示例亦均摘自于此。这个DLL和它的源代码都作为PEFile示例程序的一部分包含在了CD中(译注:示例程序请在MSDN中寻找,本站恕不提供),你可以在你自己的应用程序中使用这个DLL;同样,你亦可以依你所愿地使用并构建它的源码。在本文末尾,你会找到PEFILE.DLL的函数导出列表和一个如何使用它们的说明。我觉得你会发现这些函数会让你从容应付PE文件格式的。

介绍

Windows操作系统家族最近增加的Windows NT为开发环境和应用程序本身带来了很大的改变,这之中一个最为重大的当属PE文件格式了。新的PE文件格式主要来自于UNIX操作系统所通用的COFF规范,同时为了保证与旧版本MS-DOS 及Windows操作系统的兼容,PE文件格式也保留了MS-DOS中那熟悉的MZ头部。

在本文之中,PE文件格式是以自顶而下的顺序解释的。在你从头开始研究文件内容的过程之中,本文会详细讨论PE文件的每一个组成部分。

许多单独的文件成分定义都来自于Microsoft Win32 SDK开发包中的WINN T.H文件,在这个文件中你会发现用来描述文件头部和数据目录等各种成分的结构类型定义。但是,在WINNT.H中缺少对PE文件结构足够的定义,在这种情况下,我定义了自己的结构来存取文件数据。你会在PEFILE.DLL工程的PEFILE.H中找到这些结构的定义,整套的PEFILE.H开发文件包含在PEFile示例程序之中。

本文配套的示例程序除了PEFILE.DLL示例代码之外,还有一个单独的Win3 2示例应用程序,名为EXEVIEW.EXE。创建这一示例目的有二:首先,我需要测试PEFILE.DLL的函数,并且某些情况要求我同时查看多个文件;其次,很多解决PE文件格式的工作和直接观看数据有关。例如,要弄懂导入地址名称表是如何构成的,我就得同时查看.idata段头部、导入映像数据目录、可选头部以及当前的.idata 段实体,而EXEVIEW.EXE就是查看这些信息的最佳示例。

闲话少叙,让我们开始吧。

PE文件结构

PE文件格式被组织为一个线性的数据流,它由一个MS-DOS头部开始,接着是一个是模式的程序残余以及一个PE文件标志,这之后紧接着PE文件头和可选头部。这些之后是所有的段头部,段头部之后跟随着所有的段实体。文件的结束处是一些其它的区域,其中是一些混杂的信息,包括重分配信息、符号表信息、行号信息以及字串表数据。我将所有这些成分列于图1。

图1.PE文件映像结构

从MS-DOS文件头结构开始,我将按照PE文件格式各成分的出现顺序依次对其进行讨论,并且讨论的大部分是以示例代码为基础来示范如何获得文件的信息的。所有的源码均摘自PEFILE.DLL模块的PEFILE.C文件。这些示例都利用了Wi ndows NT最酷的特色之一——内存映射文件,这一特色允许用户使用一个简单的

指针来存取文件中所包含的数据,因此所有的示例都使用了内存映射文件来存取PE 文件中的数据。

注意:请查阅本文末尾关于如何使用PEFILE.DLL的那一段。

MS-DOS头部/实模式头部

如上所述,PE文件格式的第一个组成部分是MS-DOS头部。在PE文件格式中,它并非一个新概念,因为它与MS-DOS 2.0以来就已有的MS-DOS头部是完全一样的。保留这个相同结构的最主要原因是,当你尝试在Windows 3.1以下或M S-DOS 2.0以上的系统下装载一个文件的时候,操作系统能够读取这个文件并明白它是和当前系统不相兼容的。换句话说,当你在MS-DOS 6.0下运行一个Window s NT可执行文件时,你会得到这样一条消息:“This program cannot be run in DOS mode.”如果MS-DOS头部不是作为PE文件格式的第一部分的话,操作系统装载文件的时候就会失败,并提供一些完全没用的信息,例如:“The name specifi ed is not recognized as an internal or external command, operable program or batch file.”

MS-DOS头部占据了PE文件的头64个字节,描述它内容的结构如下:

//WINNT.H

typedef struct _IMAGE_DOS_HEADER { // DOS的.EXE头部

USHORT e_magic; // 魔术数字

USHORT e_cblp; // 文件最后页的字节数

USHORT e_cp; // 文件页数

USHORT e_crlc; // 重定义元素个数

USHORT e_cparhdr; // 头部尺寸,以段落为单位

USHORT e_minalloc; // 所需的最小附加段

USHORT e_maxalloc; // 所需的最大附加段

USHORT e_ss; // 初始的SS值(相对偏移量)

USHORT e_sp; // 初始的SP值

USHORT e_csum; // 校验和

USHORT e_ip; // 初始的IP值

USHORT e_cs; // 初始的CS值(相对偏移量)

USHORT e_lfarlc; // 重分配表文件地址

USHORT e_ovno; // 覆盖号

USHORT e_res[4]; // 保留字

USHORT e_oemid; // OEM标识符(相对e_oeminfo)

USHORT e_oeminfo; // OEM信息

USHORT e_res2[10]; // 保留字

LONG e_lfanew; // 新exe头部的文件地址

} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

第一个域e_magic,被称为魔术数字,它被用于表示一个MS-DOS兼容的文件类型。所有MS-DOS兼容的可执行文件都将这个值设为0x5A4D,表示ASCII字符MZ。MS-DOS头部之所以有的时候被称为MZ头部,就是这个缘故。还有许多其它的域对于MS-DOS操作系统来说都有用,但是对于Windows NT来说,这个结构中只有一个有用的域——最后一个域e_lfnew,一个4字节的文件偏移量,PE文件头部就是由它定位的。对于Windows NT的PE文件来说,PE文件头部是紧跟在MS-DOS头部和实模式程序残余之后的。

实模式残余程序

实模式残余程序是一个在装载时能够被MS-DOS运行的实际程序。对于一个MS-DOS的可执行映像文件,应用程序就是从这里执行的。对于Windows、OS/2、Windows NT这些操作系统来说,MS-DOS残余程序就代替了主程序的位置被放在这里。这种残余程序通常什么也不做,而只是输出一行文本,例如:“This program r equires Microsoft Windows v3.1 or greater.”当然,用户可以在此放入任何的残余程序,这就意味着你可能经常看到像这样的东西:“You can''t run a Windows NT application on OS/2, it''s simply not possible.”

当为Windows 3.1构建一个应用程序的时候,链接器将向你的可执行文件中链接一个名为WINSTUB.EXE的默认残余程序。你可以用一个基于MS-DOS的有效程序取代WINSTUB,并且用STUB模块定义语句指示链接器,这样就能够取代链接器的默认行为。为Windows NT开发的应用程序可以通过使用-STUB:链接器选项来实现。

PE文件头部与标志

PE文件头部是由MS-DOS头部的e_lfanew域定位的,这个域只是给出了文件的偏移量,所以要确定PE头部的实际内存映射地址,就需要添加文件的内存映射基地址。例如,以下的宏是包含在PEFILE.H源文件之中的:

//PEFILE.H

#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADE R)a)->e_lfanew))

在处理PE文件信息的时候,我发现文件之中有些位置需要经常查阅。既然这些位置仅仅是对文件的偏移量,那么用宏来实现这些定位就比较容易,因为它们较之函

数有更好的表现。

请注意这个宏所获得的是PE文件标志,而并非PE文件头部的偏移量。那是由于自Windows与OS/2的可执行文件开始,.EXE文件都被赋予了目标操作系统的标志。对于Windows NT的PE文件格式而言,这一标志在PE文件头部结构之前。在Windows和OS/2的某些版本中,这一标志是文件头的第一个字。同样,对于PE文件格式,Windows NT使用了一个DWORD值。

以上的宏返回了文件标志的偏移量,而不管它是哪种类型的可执行文件。所以,文件头部是在DWORD标志之后,还是在WORD标志处,是由这个标志是否Wind ows NT文件标志所决定的。要解决这个问题,我编写了ImageFileType函数(如下),它返回了映像文件的类型:

//PEFILE.C

DWORD WINAPI ImageFileType (LPVOID lpFile)

{

/* 首先出现的是DOS文件标志 */

if (*(USHORT *)lpFile == IMAGE_DOS_SIGNATURE)

{

/* 由DOS头部决定PE文件头部的位置 */

if (LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==

IMAGE_OS2_SIGNATURE ||

LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==

IMAGE_OS2_SIGNATURE_LE)

return (DWORD)LOWORD(*(DWORD *)NTSIGNATURE (lpFile));

else if (*(DWORD *)NTSIGNATURE (lpFile) ==

IMAGE_NT_SIGNATURE)

return IMAGE_NT_SIGNATURE;

else

return IMAGE_DOS_SIGNATURE;

}

else

/* 不明文件种类 */

return 0;

}

以上列出的代码立即告诉了你NTSIGNATURE宏有多么有用。对于比较不同文件类型并且返回一个适当的文件种类来说,这个宏就会使这两件事变得非常简单。WIN NT.H之中定义的四种不同文件类型有:

//WINNT.H

#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ

#define IMAGE_OS2_SIGNATURE 0x454E // NE

#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE

#define IMAGE_NT_SIGNATURE 0x00004550 // PE00

首先,Windows的可执行文件类型没有出现在这一列表中,这一点看起来很奇怪。但是,在稍微研究一下之后,就能得到原因了:除了操作系统版本规范的不同之外,Windows的可执行文件和OS/2的可执行文件实在没有什么区别。这两个操作系统拥有相同的可执行文件结构。

现在把我们的注意力转向Windows NT PE文件格式,我们会发现只要我们得到了文件标志的位置,PE文件之后就会有4个字节相跟随。下一个宏标识了PE文件的头部:

//PEFILE.C

#define PEFHDROFFSET(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEAD ER)a)->e_lfanew + SIZE_OF_NT_SIGNATURE))

这个宏与上一个宏的唯一不同是这个宏加入了一个常量SIZE_OF_NT_SIGNATUR E。不幸的是,这个常量并未定义在WINNT.H之中,于是我将它定义在了PEFILE. H中,它是一个DWORD的大小。

既然我们知道了PE文件头的位置,那么就可以检查头部的数据了。我们只需要把这个位置赋值给一个结构,如下:

PIMAGE_FILE_HEADER pfh;

pfh = (PIMAGE_FILE_HEADER)PEFHDROFFSET(lpFile);

在这个例子中,lpFile表示一个指向可执行文件内存映像基地址的指针,这就显出了内存映射文件的好处:不需要执行文件的I/O,只需使用指针pfh就能存取文件中的信息。PE文件头结构被定义为:

//WINNT.H

typedef struct _IMAGE_FILE_HEADER {

USHORT Machine;

USHORT NumberOfSections;

ULONG TimeDateStamp;

ULONG PointerToSymbolTable;

ULONG NumberOfSymbols;

USHORT SizeOfOptionalHeader;

USHORT Characteristics;

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

#define IMAGE_SIZEOF_FILE_HEADER 20

请注意这个文件头部的大小已经定义在这个包含文件之中了,这样一来,想要得到这个结构的大小就很方便了。但是我觉得对结构本身使用sizeof运算符(译注:原文为“function”)更简单一些,因为这样的话我就不必记住这个常量的名字IMAGE_ SIZEOF_FILE_HEADER,而只需要记住结构IMAGE_FILE_HEADER的名字就可以了。另一方面,记住所有结构的名字已经够有挑战性的了,尤其在是这些结构只有WINNT.H中才有的情况下。

PE文件中的信息基本上是一些高级信息,这些信息是被操作系统或者应用程序用来决定如何处理这个文件的。第一个域是用来表示这个可执行文件被构建的目标机器种类,例如DEC(R) Alpha、MIPS R4000、Intel(R) x86或一些其它处理器。系统使用这一信息来在读取这个文件的其它数据之前决定如何处理它。

Characteristics域表示了文件的一些特征。比如对于一个可执行文件而言,分离调试文件是如何操作的。调试器通常使用的方法是将调试信息从PE文件中分离,并保存到一个调试文件(.DBG)中。要这么做的话,调试器需要了解是否要在一个单独的文件中寻找调试信息,以及这个文件是否已经将调试信息分离了。我们可以通过深入可执行文件并寻找调试信息的方法来完成这一工作。要使调试器不在文件中查找的话,就需要用到IMAGE_FILE_DEBUG_STRIPPED这个特征,它表示文件的调试信息是否已经被分离了。这样一来,调试器可以通过快速查看PE文件的头部的方法来决定文件中是否存在着调试信息。

WINNT.H定义了若干其它表示文件头信息的标记,就和以上的例子差不多。我把研究这些标记的事情留给读者作为练习,由你们来看看它们是不是很有趣,这些标记位于WINNT.H中的IMAGE_FILE_HEADER结构之后。

PE文件头结构中另一个有用的入口是NumberOfSections域,它表示如果你要方便地提取文件信息的话,就需要了解多少个段——更明确一点来说,有多少个段头部和多少个段实体。每一个段头部和段实体都在文件中连续地排列着,所以要决定段头部和段实体在哪里结束的话,段的数目是必需的。以下的函数从PE文件头中提取了段的数目:

PEFILE.C

int WINAPI NumOfSections(LPVOID lpFile)

{

/* 文件头部中所表示出的段数目 */

return (int)((PIMAGE_FILE_HEADER)

PEFHDROFFSET (lpFile))->NumberOfSections);

}

如你所见,PEFHDROFFSET以及其它宏用起来非常方便。

PE可选头部

PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针:

//PEFILE.H

#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEAD ER)a)->e_lfanew + SIZE_OF_NT_SIGNATURE + sizeof(IMAGE_FILE_HEAD ER)))

可选头部包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_ HEADER结构如下:

//WINNT.H

typedef struct _IMAGE_OPTIONAL_HEADER {

//

// 标准域

//

USHORT Magic;

UCHAR MajorLinkerVersion;

UCHAR MinorLinkerVersion;

ULONG SizeOfCode;

ULONG SizeOfInitializedData;

ULONG SizeOfUninitializedData;

ULONG AddressOfEntryPoint;

ULONG BaseOfCode;

ULONG BaseOfData;

//

// NT附加域

//

ULONG ImageBase;

ULONG SectionAlignment;

ULONG FileAlignment;

USHORT MajorOperatingSystemVersion;

USHORT MinorOperatingSystemVersion;

USHORT MajorImageVersion;

USHORT MinorImageVersion;

USHORT MajorSubsystemVersion;

USHORT MinorSubsystemVersion;

ULONG Reserved1;

ULONG SizeOfImage;

ULONG SizeOfHeaders;

ULONG CheckSum;

USHORT Subsystem;

USHORT DllCharacteristics;

ULONG SizeOfStackReserve;

ULONG SizeOfStackCommit;

ULONG SizeOfHeapReserve;

ULONG SizeOfHeapCommit;

ULONG LoaderFlags;

ULONG NumberOfRvaAndSizes;

IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENT RIES];

} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

如你所见,这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感到厌烦,我会仅仅讨论有用的——就是说,对于探究PE文件格式而言有用的。

标准域

首先,请注意这个结构被划分为“标准域”和“NT附加域”。所谓标准域,就是和UNIX可执行文件的COFF格式所公共的部分。虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的——尽管换个名字更好一些。

·Magic。我不知道这个域是干什么的,对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B或267(译注:0x010B为.EXE,0x0107为ROM映像,这个信息我是从eXeScope上得来的)。

·MajorLinkerVersion、MinorLinkerVersion。表示链接此映像的链接器版本。随Window NT build 438配套的Windows NT SDK包含的链接器版本是2.39(十六进制为2.27)。

·SizeOfCode。可执行代码尺寸。

·SizeOfInitializedData。已初始化的数据尺寸。

·SizeOfUninitializedData。未初始化的数据尺寸。

·AddressOfEntryPoint。在标准域中,AddressOfEntryPoint域是对PE文件格式来说最为有趣的了。这个域表示应用程序入口点的位置。并且,对于系统黑客来说,这个位置就是导入地址表(IAT)的末尾。以下的函数示范了如何从可选头部获得Windows NT可执行映像的入口点。

//PEFILE.C

LPVOID WINAPI GetModuleEntryPoint(LPVOID lpFile)

{

PIMAGE_OPTIONAL_HEADER poh;

poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);

if (poh != NULL)

return (LPVOID)poh->AddressOfEntryPoint;

else

return NULL;

}

·BaseOfCode。已载入映像的代码(“.text”段)的相对偏移量。

·BaseOfData。已载入映像的未初始化数据(“.bss”段)的相对偏移量。Windows NT附加域

添加到Windows NT PE文件格式中的附加域为Windows NT特定的进程行为提供了装载器的支持,以下为这些域的概述。

·ImageBase。进程映像地址空间中的首选基地址。Windows NT的Microsoft Win32 SDK链接器将这个值默认设为0x00400000,但是你可以使用-BASE:linker 开关改变这个值。

·SectionAlignment。从ImageBase开始,每个段都被相继的装入进程的地址空间中。SectionAlignment则规定了装载时段能够占据的最小空间数量——就是说,段是关于SectionAlignment对齐的。

Windows NT虚拟内存管理器规定,段对齐不能少于页尺寸(当前的x86平台是4096字节),并且必须是成倍的页尺寸。4096字节是x86链接器的默认值,但是它可以通过-ALIGN: linker开关来设置。

·FileAlignment。映像文件首先装载的最小的信息块间隔。例如,链接器将一个段实体(段的原始数据)加零扩展为文件中最接近的FileAlignment边界。早先提及的2.39版链接器将映像文件以0x200字节的边界对齐,这个值可以被强制改为5 12到65535这么多。

·MajorOperatingSystemVersion。表示Windows NT操作系统的主版本号;通常对Windows NT 1.0而言,这个值被设为1。

·MinorOperatingSystemVersion。表示Windows NT操作系统的次版本号;通常对Windows NT 1.0而言,这个值被设为0。

·MajorImageVersion。用来表示应用程序的主版本号;对于Microsoft Excel 4.0而言,这个值是4。

·MinorImageVersion。用来表示应用程序的次版本号;对于Microsoft Excel 4.0而言,这个值是0。

·MajorSubsystemVersion。表示Windows NT Win32子系统的主版本号;通常对于Windows NT 3.10而言,这个值被设为3。

·MinorSubsystemVersion。表示Windows NT Win32子系统的次版本号;通常对于Windows NT 3.10而言,这个值被设为10。

·Reserved1。未知目的,通常不被系统使用,并被链接器设为0。

·SizeOfImage。表示载入的可执行映像的地址空间中要保留的地址空间大小,这个数字很大程度上受SectionAlignment的影响。例如,考虑一个拥有固定页尺寸4096字节的系统,如果你有一个11个段的可执行文件,它的每个段都少于4096字节,并且关于65536字节边界对齐,那么SizeOfImage域将会被设为11 * 6553 6 = 720896(176页)。而如果一个相同的文件关于4096字节对齐的话,那么Si zeOfImage域的结果将是11 * 4096 = 45056(11页)。这只是个简单的例子,它说明每个段需要少于一个页面的内存。在现实中,链接器通过个别地计算每个段的方法来决定SizeOfImage确切的值。它首先决定每个段需要多少字节,并且最后将页面总数向上取整至最接近的SectionAlignment边界,然后总数就是每个段个别需求之和了。

·SizeOfHeaders。这个域表示文件中有多少空间用来保存所有的文件头部,包括MS-DOS头部、PE文件头部、PE可选头部以及PE段头部。文件中所有的段实体就开始于这个位置。

·CheckSum。校验和是用来在装载时验证可执行文件的,它是由链接器设置并检验的。由于创建这些校验和的算法是私有信息,所以在此不进行讨论。

·Subsystem。用于标识该可执行文件目标子系统的域。每个可能的子系统取值列于WINNT.H的IMAGE_OPTIONAL_HEADER结构之后。

·DllCharacteristics。用来表示一个DLL映像是否为进程和线程的初始化及终止包含入口点的标记。

·SizeOfStackReserve、SizeOfStackCommit、SizeOfHeapReserve、SizeOf HeapCommit。这些域控制要保留的地址空间数量,并且负责栈和默认堆的申请。在默认情况下,栈和堆都拥有1个页面的申请值以及16个页面的保留值。这些值可以使用链接器开关-STACKSIZE:与-HEAPSIZE:来设置。

·LoaderFlags。告知装载器是否在装载时中止和调试,或者默认地正常运行。

·NumberOfRvaAndSizes。这个域标识了接下来的DataDirectory数组。请注意它被用来标识这个数组,而不是数组中的各个入口数字,这一点非常重要。

·DataDirectory。数据目录表示文件中其它可执行信息重要组成部分的位置。它事实上就是一个IMAGE_DATA_DIRECTORY结构的数组,位于可选头部结构的末尾。当前的PE文件格式定义了16种可能的数据目录,这之中的11种现在在使用中。

数据目录

WINNT.H之中所定义的数据目录为:

//WINNT.H // 目录入口 // 导出目录 #define IMAGE_DIRECTORY_ENTRY _EXPORT 0 // 导入目录 #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 //资源目录 #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // 异常目录#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // 安全目录 #define I MAGE_DIRECTORY_ENTRY_SECURITY 4 // 重定位基本表 #define IMAGE_D IRECTORY_ENTRY_BASERELOC 5 // 调试目录 #define IMAGE_DIRECTORY_ ENTRY_DEBUG 6 // 描述字串 #define IMAGE_DIRECTORY_ENTRY_COPYRIG HT 7 // 机器值(MIPS GP) #define IMAGE_DIRECTORY_ENTRY_GLOBALPT R 8 // TLS目录 #define IMAGE_DIRECTORY_ENTRY_TLS 9 // 载入配置目录 #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10

基本上,每个数据目录都是一个被定义为IMAGE_DATA_DIRECTORY的结构。虽然数据目录入口本身是相同的,但是每个特定的目录种类却是完全唯一的。每个数据目录的定义在本文的以后部分被描述为“预定义段”。

//WINNT.H

typedef struct _IMAGE_DATA_DIRECTORY {

ULONG VirtualAddress;

ULONG Size;

} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

每个数据目录入口指定了该目录的尺寸和相对虚拟地址。如果你要定义一个特定的目录的话,就需要从可选头部中的数据目录数组中决定相对的地址,然后使用虚拟地址来决定该目录位于哪个段中。一旦你决定了哪个段包含了该目录,该段的段头部就会被用于查找数据目录的精确文件偏移量位置。

所以要获得一个数据目录的话,那么首先你需要了解段的概念。我在下面会对其进行描述,这个讨论之后还有一个有关如何定位数据目录的示例。

PE文件段

PE文件规范由目前为止定义的那些头部以及一个名为“段”的一般对象组成。段包含了文件的内容,包括代码、数据、资源以及其它可执行信息,每个段都有一个头部和一个实体(原始数据)。我将在下面描述段头部的有关信息,但是段实体则缺少一个严格的文件结构。因此,它们几乎可以被链接器按任何的方法组织,只要它的头部填充了足够能够解释数据的信息。

段头部

PE文件格式中,所有的段头部位于可选头部之后。每个段头部为40个字节长,并且没有任何的填充信息。段头部被定义为以下的结构:

//WINNT.H

#define IMAGE_SIZEOF_SHORT_NAME 8

typedef struct _IMAGE_SECTION_HEADER {

UCHAR Name[IMAGE_SIZEOF_SHORT_NAME];

union {

ULONG PhysicalAddress;

ULONG VirtualSize;

} Misc;

ULONG VirtualAddress;

ULONG SizeOfRawData;

ULONG PointerToRawData;

ULONG PointerToRelocations;

ULONG PointerToLinenumbers;

USHORT NumberOfRelocations;

USHORT NumberOfLinenumbers;

ULONG Characteristics;

} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

你如何才能获得一个特定段的段头部信息?既然段头部是被连续的组织起来的,而且没有一个特定的顺序,那么段头部必须由名称来定位。以下的函数示范了如何从一个给定了段名称的PE映像文件中获得一个段头部:

//PEFILE.C

BOOL WINAPI GetSectionHdrByName(LPVOID lpFile, IMAGE_SECTION_HE ADER *sh, char *szSection)

{

PIMAGE_SECTION_HEADER psh;

int nSections = NumOfSections (lpFile);

int i;

if ((psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET(lpFile))

!= NULL)

{

/* 由名称查找段 */

for (i = 0; i < nSections; i++)

{

if (!strcmp(psh->Name, szSection))

{

/* 向头部复制数据 */

CopyMemory((LPVOID)sh, (LPVOID)psh,

sizeof(IMAGE_SECTION_HEADER));

return TRUE;

}

else

psh++;

}

}

return FALSE;

}

这个函数通过SECHDROFFSET宏将第一个段头部定位,然后它开始在所有段中循环,并将要寻找的段名称和每个段的名称相比较,直到找到了正确的那一个为止。当找到了段的时候,函数将内存映像文件的数据复制到传入函数的结构中,然后IM AGE_SECTION_HEADER结构的各域就能够被直接存取了。

段头部的域

·Name。每个段都有一个8字符长的名称域,并且第一个字符必须是一个句点。

·PhysicalAddress或VirtualSize。第二个域是一个union域,现在已不使用了。

·VirtualAddress。这个域标识了进程地址空间中要装载这个段的虚拟地址。实际的地址由将这个域的值加上可选头部结构中的ImageBase虚拟地址得到。切记,如果这个映像文件是一个DLL,那么这个DLL就不一定会装载到ImageBase要求

通过文件头标识判断图片格式

通过文件头标识判断图片格式【总结】 2010-05-21 09:45:42| 分类:默认分类| 标签:|举报|字号大中小订阅最近在做东西的时候遇到了点问题,在加载图片的时候,加载失败,后缀 都是jpg格式,但换个图片就可以了,为此,怀疑图片格式有问题,遂拖到UE 里面查看它的16进制,果然,两个图片的文件头根本就不一样,这不是欺负人嘛,害我白白浪费了半天的时间,差点要重新编译内核。 然后到网上找了一些资料,查看不同格式图片的文件头是怎样的。下面转帖是不同图片的文件头标志: 图片的格式很多,一个图片文件的后缀名并不能说明这个图片的真正格式什么,那么如何获取图片的格式呢?我想到了几个简单但有效的方法,那就是读取图片文件的文件头标识。我们知道各种格式的图片的文件头标识识不同的,因此我们可以通过判断文件头的标识来识别图片格式。 我对各种格式的图片文件头标识进行了分析,不仅查找资料,也用十六进制编辑器察看过图片的文件头,以下是我收集、分析的结果,供大家参考。 1.JPEG/JPG - 文件头标识 (2 bytes): $ff, $d8 (SOI) (JPEG 文件标识) - 文件结束标识 (2 bytes): $ff, $d9 (EOI) 2.TGA - 未压缩的前5字节 00 00 02 00 00 - RLE压缩的前5字节 00 00 10 00 00 3.PNG - 文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A 4.GIF - 文件头标识 (6 bytes) 47 49 46 38 39(37) 61 G I F 8 9 (7) a 5.BMP

pe文件格式

PE文件格式详解(一)――基础知识 什么是PE文件格式: 我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织起来的,不同类型的文件肯定组织形式也各不相同;PE文件格式便是一种文件组织形式,它是32位Wind ow系统中的可执行文件EXE以及动态连接库文件DLL的组织形式。为什么我们双击一个EXE文件之后它就会被Window运行,而我们双击一个DOC文件就会被Word打开并显示其中的内容;这说明文件中肯定除了存在那些文件的主体内容(比如EXE文件中的代码,数据等,DOC文件中的文件内容等)之外还存在其他一些重要的信息。这些信息是给文件的使用者看的,比如说EXE文件的使用者就是Window,而DOC文件的使用者就是Word。Window可以根据这些信息知道把文件加载到地址空间的那个位置,知道从哪个地址开始执行;加载到内存后如何修正一些指令中的地址等等。那么PE文件中的这些重要信息都是由谁加入的呢?是由编译器和连接器完成的,针对不同的编译器和连接器通常会提供不同的选项让我们在编译和 联结生成PE文件的时候对其中的那些Window需要的信息进行设定;当然也可以按照默认的方式编译连接生成Window中默认的信息。例如:WindowNT默认的程序加载基址是0x40000;你可以在用VC连接生成EXE文件的时候使用选项更改这个地址值。在不同的操作系统中可执行文件的格式是不同的,比如在Linux上就有一种流行的ELF格式;当然它是由在Linux上的编译器和连接器生成的,

所以编译器、连接器是针对不同的CPU架构和不同的操作系统而涉及出来的。在嵌入式领域中我们经常提到交叉编译器一词,它的作用就是在一种平台下编译出能在另一个平台下运行的程序;例如,我们可以使用交叉编译器在跑Linux的X86机器上编译出能在Arm上运行的程序。 程序是如何运行起来的: 一个程序从编写出来到运行一共需要那些工具,他们都对程序作了些什么呢?里面都涉及哪些知识需要学习呢?先说工具:编辑器-》编译器-》连接器-》加载器;首先我们使用编辑器编辑源文件;然后使用编译器编译程目标文件OBJ,这里面涉及到编译原理的知识;连接器把OBJ文件和其他一些库文件和资源文件连接起来生成EXE文件,这里面涉及到不同的连接器的知识,连接器根据OS的需要生成EXE文件保存着磁盘上;当我们运行EXE文件的时候有W indow的加载器负责把EXE文件加载到线性地址空间,加载的时候便是根据上一节中说到的PE文件格式中的哪些重要信息。然后生成一个进程,如果进程中涉及到多个线程还要生成一个主线程;此后进程便开始运行;这里面涉及的东西很多,包括:PE文件格式的内容;内存管理(CPU内存管理的硬件环境以及在此基础上的OS内存管理方式);模块,进程,线程的知识;只有把这些都弄清楚之后才能比较清楚的了解这整个过程。下面就让我们先来学习PE文件格式吧。

所有类型文件的文件头标志

各类文件的文件头标志 1、从Ultra-edit-32中提取出来的 JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47 GIF (gif),文件头:47494638 TIFF (tif),文件头:49492A00 Windows Bitmap (bmp),文件头:424D CAD (dwg),文件头:41433130 Adobe Photoshop (psd),文件头:38425053 Rich Text Format (rtf),文件头:7B5C727466 XML (xml),文件头:3C3F786D6C HTML (html),文件头:68746D6C3E Email [thorough only] (eml),文件头:44656C69766572792D646174653A Outlook Express (dbx),文件头:CFAD12FEC5FD746F Outlook (pst),文件头:2142444E MS Word/Excel (xls.or.doc),文件头:D0CF11E0 MS Access (mdb),文件头:5374616E64617264204A WordPerfect (wpd),文件头:FF575043 Postscript (eps.or.ps),文件头:252150532D41646F6265 Adobe Acrobat (pdf),文件头:255044462D312E Quicken (qdf),文件头:AC9EBD8F Windows Password (pwl),文件头:E3828596 ZIP Archive (zip),文件头:504B0304 RAR Archive (rar),文件头:52617221

PE格式基础及程序的装入

DOS MZ header部分是DOS时代遗留的产物,是PE文件的一个遗传基因,一个Win32程序如果在DOS下也是可以执行,只是提示:“This program cannot be run in DOS mode.”然后就结束执行,提示执行者,这个程序要在Win32系统下执行。 DOS stub 部分是DOS插桩代码,是DOS下的16位程序代码,只是为了显示上面的提示数据。这段代码是编译器在程序编译过程中自动添加的。 PE header 是真正的Win32程序的格式头部,其中包括了PE格式的各种信息,指导系统如何装载和执行此程序代码。 Section table部分是PE代码和数据的结构数据,指示装载系统代码段在哪里,数据段在哪里等。对于不同的PE文件,设计者可能要求该文件包括不同的数据的Section。所以有一个Section Table 作为索引。Section多少可以根据实际情况而不同。但至少要有一个Section。如果一个程序连代码都没有,那么他也不能称为可执行代码。在Section Table后,Section数目的多少是不定的。 二、程序的装入 当我们在explorer.exe(资源管理器)中双击某文件,执行一个可执行程序,系统会根据文件扩展名启动一个程序装载器,称之为Loader。Loader会首先检查DOS MZ Header,如果存在,就继续寻找PE header,如果这两项都不存在,就认为是DOS 16位代码,如果只存在DOS MZ Header,而其中又指示了而其中又指示了PE Header 的位置,那么Loader 就判定此文件不一个有效的PE文件,拒绝执行。 如果DOS Header 和PE Header都正常有效,那么Loader就会根据PE Header 及Section Table的指示,将相应的代码和数据映射到内存中,然后根据不同的Section进行数据的初始化,最后开始执行程序段代码。 三、PE格式高级分析 下面我们以一个真实的程序为例详细分析PE格式,分析PE格式最好有PE分析器,常用的软件是Lord PE,也有其它的分析工具和软件如PE Editor 、Stud PE等。 先分析一下磁盘文件的内容,这里我们使用UltraEdit32(UE)工具,这是一个实用的文件编辑器,可以编辑文本和二进制文件。

PE文件头解析大全

PE可选头部 PE可执行文件中接下来的224个字节组成了PE可选头部。虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。OPTHDROFFSET宏可以获得指向可选头部的指针: PEFILE.H #define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \ ((PIMAGE_DOS_HEADER)a)->e_lfanew + \ SIZE_OF_NT_SIGNATURE + \ sizeof(IMAGE_FILE_HEADER))) 可选头部包含了很多关于可执行映像的重要信息,例如初始的堆栈大小、程序入口点的位置、首选基地址、操作系统版本、段对齐的信息等等。IMAGE_OPTIONAL_HEADER结构如下: WINNT.H typedef struct _IMAGE_OPTIONAL_HEADER { // // 标准域 // USHORT Magic; UCHAR MajorLinkerVersion; UCHAR MinorLinkerVersion; ULONG SizeOfCode; ULONG SizeOfInitializedData; ULONG SizeOfUninitializedData; ULONG AddressOfEntryPoint; ULONG BaseOfCode; ULONG BaseOfData; // // NT附加域 // ULONG ImageBase; ULONG SectionAlignment;

ULONG FileAlignment; USHORT MajorOperatingSystemVersion; USHORT MinorOperatingSystemVersion; USHORT MajorImageVersion; USHORT MinorImageVersion; USHORT MajorSubsystemVersion; USHORT MinorSubsystemVersion; ULONG Reserved1; ULONG SizeOfImage; ULONG SizeOfHeaders; ULONG CheckSum; USHORT Subsystem; USHORT DllCharacteristics; ULONG SizeOfStackReserve; ULONG SizeOfStackCommit; ULONG SizeOfHeapReserve; ULONG SizeOfHeapCommit; ULONG LoaderFlags; ULONG NumberOfRvaAndSizes; IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; 如你所见,这个结构中所列出的域实在是冗长得过分。为了不让你对所有这些域感到厌烦,我会仅仅讨论有用的——就是说,对于探究PE文件格式而言有用的。 标准域 首先,请注意这个结构被划分为“标准域”和“NT附加域”。所谓标准域,就是和UNIX可执行文件的COFF 格式所公共的部分。虽然标准域保留了COFF中定义的名字,但是Windows NT仍然将它们用作了不同的目的——尽管换个名字更好一些。 ·Magic。我不知道这个域是干什么的,对于示例程序EXEVIEW.EXE示例程序而言,这个值是0x010B

文件头标志大全

各类文件的文件头标志 参见 扩展名文件头标识(HEX)文件描述 12300 00 1A 00 05 10 04Lotus 1-2-3 spreadsheet (v9) file 3gg; 3gp; 3g200 00 00 nn 66 74 79 70 33 67 703rd Generation Partnership Proj ect 3GPP (nn=0x14) and 3GPP2 (nn=0x20) multimedia files 7z37 7A BC AF 27 1C7-ZIP compressed file aba00 01 42 41Palm Address Book Archive file abi41 4F 4C 49 4E 44 45 58AOL address book index file aby; idx41 4F 4C 44 42AOL database files: address book (ABY) and user configuration data accdb00 01 00 00 53 74 61 6E 64 61 72 64 20 41 43 45 20 44 42 Microsoft Access 2007 file ACM4D 5A MS audio compression manager driver ADF44 4F 53Amiga disk file adx03 00 00 00 41 50 50 52Lotus Approach ADX file AIFF46 4F 52 4D 00Audio Interchange File ain21 12AIN Compressed Archive File ami5B 76 65 72 5D Lotus Ami Pro amr23 21 41 4D 52Adaptive Multi-Rate ACELP (Algebraic Code Excited Linear Prediction) Codec, commonly audio format with

红头文件的标准格式及范本

红头文件的标准格式及范本 格式: 一、眉首:(文头,红色反线以上部分) 印制份数序号、密级和保密期限、紧急程度、发文机关标识、发文字号、签发人 1.公文份数顺序号7位数(版心左上角顶格第1行,机密、绝密件才标注) 2.密级和保密期限(秘密、机密、绝密*30年) 秘密件指内容涉及国家一般秘密,一旦泄露会使国家的安全和利益遭受一定损害的公 文。 机密件指内容涉及国家重要秘密,一旦泄露会使国家的安全和利益遭受严重损害的公 文。 绝密件指内容涉及国家核心秘密,一旦泄露会使国家的安全和利益遭受重大损害的公 文。 3.紧急程度 急件、特急;电报:特提、特急、加急、平急 (3号黑体字,顶格标识在版心右上角第1行,两字间空1字;如同时标识密级和紧急程度,密级在第1行,紧急程序在第2行) 4.发文机关标识(小标宋体字,红色) 《XXX人民政府文件》一一主要用于向上级机关报告工作,颁布行政规章,发布政府 的决定或通知、印发重要会议纪要和政府领导讲话,转发上级或批转下级重要文件等《XXX人民政府》一一主要用于印发函件及处理一般事项的通知、批复等下行文。 联合行文(党、政、军、群) 5.发文字号(发文机关标识下空2行,用3号仿宋体字,居中排布。联合行文只标主办机关的发文字号)

发文机关代字(渝府发)一一年份〔2005〕一一序号 6.签发人 只有上行文才标注。平行排列于发文字号右侧。发文字号居左空1字,签发人姓名居右空1字。“签发人”用3号仿宋字,后用3号楷体字标识签发人姓名。 二、主体(红色反线下方,主题词上方) 标题、主送机关、正文、附件、发文机关、成文时间、印章、附注 1?标题(位于红色反线空两行之下,2号小标宋体字,居中) 三要素:发文机关——事由(关于?的)——文种 要求:切题、简明、醒目得体 2?主送机关(左侧顶格用3号仿宋体字标识) 全称或规范化简称、统称 注:公告、通告等属周知性的公文,没有主送单位。 3.公文正文:首页必须显示正文 4?附件(正文下空1行左空2字,用3号仿宋体标识) 附件是正文内容的组成部分,与公文正文一样具有同等效力。 5.成文日期(行政机关公文用汉字,党委系统用阿拉伯数码标识;法规性公文的成文时 间一般在标题下方正中,并加一圆括号) 成文日期确定的原则: (1 )会议通过的决定、决议等以会议通过日期为准; (2)领导签发的,以签发日期为准; (3 )联合行文,以最后签发机关的领导签发日期为准;

文件头标志大全

各类文件的文件头标志 参见https://www.360docs.net/doc/0410414179.html,/library/file_sigs.html 扩展名文件头标识 (HEX) 文件描述 123 00 00 1A 00 05 10 04 Lotus 1-2-3 spreadsheet (v9) file 3gg; 3gp; 3g2 00 00 00 nn 66 74 79 70 33 67 70 3rd Generation Partnership Project 3 GPP (nn=0x14) and 3GPP2 (nn=0x 20) multimedia files 7z 37 7A BC AF 27 1C 7-ZIP compressed file aba 00 01 42 41 Palm Address Book Archive file abi 41 4F 4C 49 4E 44 45 58 AOL address book index file aby; idx 41 4F 4C 44 42 AOL database files: address book (ABY) and user configuration data (MAIN.IDX) accdb 00 01 00 00 53 74 61 6E 64 61 72 64 20 41 43 45 20 44 42 Microsoft Access 2007 file ACM 4D 5A MS audio compression manager driver ADF 44 4F 53 Amiga disk file adx 03 00 00 00 41 50 50 52 Lotus Approach ADX file AIFF 46 4F 52 4D 00 Audio Interchange File ain 21 12 AIN Compressed Archive File ami 5B 76 65 72 5D Lotus Ami Pro amr 23 21 41 4D 52 Adaptive Multi-Rate ACELP (Algebraic

常见文件类型文件头

JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47 GIF (gif),文件头:47494638 TIFF (tif),文件头:49492A00 Windows Bitmap (bmp),文件头:424D CAD (dwg),文件头:41433130 Adobe Photoshop (psd),文件头:38425053 Rich Text Format (rtf),文件头:7B5C727466 XML (xml),文件头:3C3F786D6C HTML (html),文件头:68746D6C3E Email [thorough only] (eml),文件头: 44656C69766572792D646174653A Outlook Express (dbx),文件头:CFAD12FEC5FD746F Outlook (pst),文件头:2142444E MS Word/Excel (xls.or.doc),文件头:D0CF11E0 MS Access (mdb),文件头:5374616E64617264204A WordPerfect (wpd),文件头:FF575043 Postscript (eps.or.ps),文件头:252150532D41646F6265 Adobe Acrobat (pdf),文件头:255044462D312E Quicken (qdf),文件头:AC9EBD8F Windows Password (pwl),文件头:E3828596 ZIP Archive (zip),文件头:504B0304

PE文件结构

检验PE文件的有效性 <1>首先检验文件头部第一个字的值是否等于IMAGE_DOS_SIGNATURE,是则表示DOS MZ header有效 <2>一旦证明文件的Dos header 有效后,就可用e_lfanew来定位PE header <3>比较PE header 的第一个字的值是否等于IMAGE_NT_HEADER,如果前后两个值都匹配. PS.WinHex使用方法 1.Alt+G跳到指定位置 2.Ctrl+Shift+N放入新文件 3.大文件扩容,新建一个扩容大小+1的文件,把这个文件的数据复制后写入整个文件的尾地址. 4.文本搜索ctrl+F 5.十六进制搜索ctrl+alt+x 6.文本显示F7 7.打开内存alt+F9 8.进制转换器F8 9.分析选块F2 10.计算HASH ctrl+F2 11.收集文本信息ctrl+F10 12.编辑模式F6 一.IMAGE_DOS_HEADER <1>位置00H,WORD(2个字节)的e_magic为4D5A,即MZ <2>位置3CH,60,LONG(4个节节)的e_lfanew为64+112=176即B0H, 二.IMAGE_NT_HEADERS <1>位置B0H,DWORD(4个字节),PE开始标记,写入50450000,即PE <2>位置B4H,WORD,PE所要求的CPU,对于Intel平台,为4C01 <2>位置B6,WORD,PE中段总数,计划有3个段,.text代码段,.rdata只读数据段,.data全局变量数据段,所以值为0300, <3>位置C4,WORD,表示后面的PE文件可选头的占空间大小,即224字节(E0),值为E000 <4>位置C6,WORD,表示文件是EXE还是DLL,如果是可执行文件写0200,如果是dll,写0020, <5>位置C8,WORD,表示文件格式,如果是0B01表示.exe,如果是0701表示ROM映像

手工构造典型PE文件

2009-06-08 11:38:40 https://www.360docs.net/doc/0410414179.html, 来源:黑客防线 一直以来都在学习PE文件结构,从不敢轻视,但是即使如此还是发现自己在这方面有所不足,于是便想到了用纯手工方式打造一个完整的可执行的PE文件。在这期间我也查了大量资料,但是这些资料都有一个通病就是不... 一直以来都在学习PE文件结构,从不敢轻视,但是即使如此还是发现自己在这方面有所不足,于是便想到了用纯手工方式打造一个完整的可执行的PE文件。在这期间我也查了大量资料,但是这些资料都有一个通病就是不完整,看雪得那个只翻译了一部分,加解密技术内幕介绍的更是笼统,而且是打造一个只有180字节的PE文件,是高手们茶余饭后的怡情小游戏。 鉴于此,心想为什么不自己摸索着手工打造一个完整些的呢?一是加强一下自己对于PE文件的了解,二是写出一篇参考性比较强的文章,给有志于在此发展的朋友们铺一铺路,也算是干了一件利国利民的好事。 对于手工打造PE文件,我个人认为至少要分为三篇文章来阐述,每篇相对独立,合起来形成一个相对的体系。第一篇文章(也就是本文)用来介绍怎样用手工打造一个最典型、最简单的PE文件,而后两篇文章的问世还要引用潘爱民先生的一句话“还需要时日与机缘”。 本文介绍的PE文件手工编辑方式,是本着以下三个原则所写的,望读者注意: 1、完整性:对于手工打造PE文件所不需注意的字段也进行了必要的介绍,因此整文可能显得非常臃肿。 2、典型性:完全按照典型的PE文件结构构造,因此对于某些不常见的PE文件结构有一定差距。 3、易学性:对于字段之间的逻辑关系进行了比较细致的介绍,因此对于一部分底子比较好的读者来说可能显得有些啰嗦。 为了方便各位阅读与查阅,我将文章分成了三各部分,以便各位读者各取所需,不用把宝贵的精力浪费在查找上。 1、PE文件整体信息,提供了一个剖析PE文件的图表,以便于读者对于PE文件有一个整体的了解,并监督自己的工作进度。 2、对于重点字段的介绍,以及字段之间的逻辑关系,建议首先从这里开始看。 3、手工构造PE文件字段清单,此清单包含构造一个完整PE文件的每一个字节,跟着这个清单走就可以构造一个PE文件。 对于第一次手工打造PE文件的朋友们来说,你们可以以“一、整体性息”为大纲,并参考第三部分一块一块的慢慢打造,如果有不懂的地方就去看第二部分。 选读:为什么要手工打造PE文件? 我们知道,往往从一个系统可执行文件结构上,就可以看整个操作系统的一些特性。也就是说PE里有Windows操作系统结构与运行机理的影子。由此可见,PE文件必然是一个非常庞杂且逻辑复杂的结构,那么为什么我们还要“自取其辱”来手工制造一个PE文件呢?这就要从PE文件的重要性说起了。 我们现今组成Windows大家庭的主要成员就是PE文件了,里面包括EXE、DLL、OCX、SYS等一切最有价值的文件都是PE文件格式,出于对版权的考虑或对某种技术的渴求,任何一种与Windows系统相关的行为最终都要归集到这里--PE文件。 特别是对于想学习加壳、破解、搞虚拟机的朋友们来说,熟知PE文件结构更是必不可少的基本功! 但也正是由于PE文件的复杂性,我们才要采取一些特别的办法来攻克它,其中手工打造PE文件就是一条捷径。 你可以想像一下,如果你都可以手工打造PE文件的话,那么对于PE文件的了解更是

pe文件结构 入门 教程

三年前,我曾经写了一个手工打造可执行程序的文章,可是因为时间关系,我的那篇文章还是有很多模糊的地方,我一直惦记着什么时候再写一篇完美的,没想到一等就等了三年。因为各种原因直到三年后的今天我终于完成了它。现在把它分享给大家,希望大家批评指正。 我们这里将不依赖任何编译器,仅仅使用一个十六进制编辑器逐个字节的手工编写一个可执行程序。以这种方式讲解PE结构,通过这个过程读者可以学习PE结构中的PE头、节表以及导入表相关方面的知识。为了简单而又令所有学习程序开发的人感到亲切,我们将完成一个Hello World! 程序。功能仅仅是运行后弹出一个消息框,消息框的内容是Hello World!。 首先了解一下Win32可执行程序的大体结构,就是通常所说的PE结构。 如图1所示PE结构示意图: 图1 标准PE结构图 由图中可以看出PE结构分为几个部分: MS-DOS MZ 头部:所有PE文件必须以一个简单的DOS MZ 头开始。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ header 之后的DOS程序。以此达到对Dos系统的兼容。(通常情况DOS MZ header总共占用64byte)。 MS-DOS 实模式残余程序:实际上是个有效的EXE,在不支持PE文件格式的操作系统中,它将简单显

示一个错误提示,大多数情况下它是由汇编编译器自动生成。通常,它简单调用中断21h,服务9来显示字符串"This program cannot run in DOS mode"。(在我们写的程序中,他不是必须的,可以不予以实现,但是要保留其大小,大小为112byte,为了简洁,可以使用00来填充。) PE文件标志:是PE文件结构的起始标志。(长度4byte, Windows程序此值必须为0x50450000) PE文件头:是PE相关结构 IMAGE_NT_HEADERS 的简称,其中包含了许多PE装载器用到的重要域。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从DOS MZ header中找到PE header的起始偏移量,跳过了MS-DOS 实模式残余程序,直接定位到真正的文件头PE header,长度20byte。 PE文件可选头:虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。(长度 224byte )。 各段头部:又称节头部,一个Windows NT的应用程序典型地拥有9个预定义段(节),它们是“.text”、“.bss”、“.rdata”、“.data”、“.rsrc”、“.edata”、“.idata”、“.pdata”和“.debug”。一些应用程序不需要所有的这些段,同样还有些应用程序为了自己特殊的需要而定义了更多的段。(每个段头部占40byte,我们这里也不需要所有的段,仅需3个段。) 通常我们是将PE整个结构分成四个部分,把MS-DOS MZ 头部和MS-DOS 实模式残余程序作为第一部分,可以称他为DOS部分,而PE文件标志、PE文件头、PE文件可选头三个部分作为第二部分,称之为PE头部分,因为这部分才是Windows下真正需要的部分,所以从PE文件标志开始才是真正的PE部分。各段头部是第三部分,称之为节表。它详细描述了PE文件中各个节的详细信息。最后就是各个节的实体部分了,称为节数据。 以上仅仅是对PE结构各部分的大体讲解。接下来再手写这个Hello World!程序过程中,我将详细介绍每个部分的含义。 首先准备一下工具,一个十六进制编辑器足以。我们这里使用VC++ 6.0所携带的十六进制编辑器,您也可以使用如WinHex等十六进制编辑工具。 打开VC,选择文件,新建菜单项,然后选择一个二进制文件,单击确定。一切就绪了,下面就开始手写可执行程序,如图2所示:

所有类型文件资料的文件资料头标志

实用文档 标准各类文件的文件头标志 1、从Ultra-edit-32中提取出来的 JPEG (jpg),文件头:FFD8FF PNG (png),文件头:89504E47 GIF (gif),文件头:47494638 TIFF (tif),文件头:49492A00 Windows Bitmap (bmp),文件头:424D CAD (dwg),文件头:41433130 Adobe Photoshop (psd),文件头:38425053 Rich Text Format (rtf),文件头:7B5C727466 XML (xml),文件头:3C3F786D6C HTML (html),文件头:68746D6C3E Email [thorough only] (eml),文件头:44656CD646174653A Outlook Express (dbx),文件头:CFAD12FEC5FD746F Outlook (pst),文件头:2142444E MS Word/Excel (xls.or.doc),文件头:D0CF11E0 MS Access (mdb),文件头:5374616EA WordPerfect (wpd),文件头:FF575043 Postscript (eps.or.ps),文件头:252150532D41646F6265 Adobe Acrobat (pdf),文件头:255044462D312E Quicken (qdf),文件头:AC9EBD8F Windows Password (pwl),文件头:E3828596 ZIP Archive (zip),文件头:504B0304 RAR Archive (rar),文件头:52617221

pe文件格式

pe文件格式:PE文件格式(1) 疯狂代码 https://www.360docs.net/doc/0410414179.html,/ ?:http:/https://www.360docs.net/doc/0410414179.html,/Waigua/Article60255.html 介绍说明:希望本文能够对初级入门CRACKER有定帮助翻译存在疏漏或者不准确希望来信指出感谢您指导!感谢看雪为我们提供这个交流平台让我们技术和时俱进!! 前言: PE("portableexecutable")文件格式是针对MSwindowsNT,windows95and win32s可执行 2进制代码(DLLsandprograms)在windowsNT内,驱动也是这个格式也可以用于对象文件和库 这个格式是Microsoft设计并在1993经过TIS(toolerfacestandard)委员会 (Microsoft,Intel,Borland,Watcom,IBM等)标准化了它基于在UNIX和VMS上运行对象文件和可执行文件COFF"commonobjectfileformat"格式 win32SDK包括个头文件包括对PE格式定义我将提及成员名和定义你也可能发现DLL文件"imagehelp.dll"非常有用它是NT部分但文档很少它些在"DeveloperNetwork"被描述 总览: 在PE文件开始我们可以发现MSDOS执行部分("stub");这使得任何个PE文件是有效DOS执行文件在DOS-stub的后是32位魔数0x00004550(IMAGE_NT_SIGNATURE).然后是个COFF格式文件头指明在何种机器上运行多少个节在里面连接时间是否是可执行文件或者DLL等DLL和可执行文件区别:DLL不能够启动只可以被其他可执行文件使用个可执行文件不能够连接到另个可执行文件 接着我们看到个可选文件头optionalheader(虽然叫“可选”它实际上直存在) COFF把可选文件头用于库不用于目标文件这里告诉我们文件如何被调入:起始地址预留堆栈数数据段尺寸 个有趣部分是尾巴上数据目录datadirectories这些目录包含指向节内数据指针例如如果文件有输出目录可以在成员IMAGE_DIRECTORY_ENTRY_EXPORT内发现个指针指向那个目录(目录描述结构->THUNKDATA结构->BYNAME结构)他将指向个节 在头后面是节头实际上节内容就是真正需要运行个所需要东西所有头和目录成员就是帮你找到它每个节有几个标志:对齐包含数据类型(化数据等)是否可以共享等及数据自身多数节含有个或多个通过“可选头”内数据目录项引用目录没有目录类型内容是化数据或者可执行代码(节是物理意义上内容组织目录是逻辑意义上内容

实验1《 PE文件剖析实验》

《PE文件剖析实验》报告 学院:计算机学院 日期: 2016年 4 月 25 日

目录 1. 实验目的 (2) 2. 实验过程 (2) 3. 实现结果 (2) 4. 遇到的问题及感想收获 (5)

1. 实验目的 熟悉各种PE编辑查看工具,详细了解PE文件格式,为后续计算机病毒学习打下基础,学会分析PE文件文件头、引入表、引出表以及资源表。 2. 实验过程 PE文件被称为可移植的执行体,是Portable Execute的简称,常见的EXE、DLL、OCX、SYS、COM等文件都是PE文件。 本次实验将综合运用Peview和LordPE,自由选择一款EXE文件或DLL文件,对其展开分析,找出文件的PE标志,入口地址、基址,节表个数及列出节表、输出表、输入表等信息。 3. 实现结果 ●自由选择一款EXE文件或DLL文件,对其展开分析,各项结果截图如下:●文件的PE标志

●入口地址 ●基址 ●节表个数及列出节表

●输出表 ●输入表

4. 遇到的问题及感想收获 本次实验时对PE文件格式进行分析,对PE文件有了一个大致的了解,如什么是PE文件的文件头,什么是区段,什么是数据目录。由于现阶段大都的病毒都是PE病毒,所以了解它们可以更好地知道PE病毒是如何感染PE文件的。不仅如此,对PE文件的修改加壳等操作也证实了PE文件并不是不可编辑的,也可以让我们更好地了解PE文件的内部结构。 这次实验主要使用了LoadPE和Peview软件对PE文件进行查看,提高了我们对PE文件结构的认识,帮助了我们吸收理论课上所学的知识,如基址与相对虚拟地址及其查看方法,PE文件首部,区段的含义等。这对我们以后的学习有很大的帮助,达到了预期的实验目的。 通过本次课程设计,我深刻认识到要掌握知识,不仅仅是要把书上的基本知识学好而且还要不断进行实践,将所学的跟实践操作结合起来才能更好地巩固所学,才能提高自己的实践能力。

公文的格式规范—版头

公文的格式规范—版头 一谈起公文,相比很多考生都会唏嘘,因为这部分的知识点很细,需要大量的记忆才能把握,所以也是被很多考生视为鸡肋的一门学科,学起来痛苦,丢弃了又太可惜。那么,今天主要和大家介绍一下,我们版头这部分的要素怎么去学习,会更有效率。 首先,大家要明确,公文的格式规范,也就是公文的各个构成要素,在考试中会以多种形式考查,比如单选、多选、判断,甚至还有公文改错。出题形式比较灵活,主要侧重记忆性考查。 其次,在这部分的学习中,要掌握三个要素:是什么,为什么,怎么写。这能帮助大家解决知识点乱的问题。现在我们就围绕着三要素去分析一下。 一、份号。是顺序号,如果文件数量较多,可能会需要标注,是为了方便回收。但是涉密公文是一定要标注的,这是为了防止泄密。所以份号并不是所有公文都具备的要素哦。在写法上,重点关注是6位阿拉伯数字了。 二、密级和保密期。既然这里提到了密级,那么肯定和秘密有关。因此,这里需要标注:秘密、机密、绝密三种,还需要标注保密期。在写法上,先写密级再写保密期。这里是要引起重视的,因为公文改错部分经常会出题,最后还需要注意,密级和保密期之间用实体五角星连接。 三、紧急程度。这个是为了标注出这份公文是否需要赶时间,那么我们的紧急公文需要标注特急、加急就可以了。具体写法一次在份号、密级的下方,版心左上角标注。 那么到这里,大家会发现,左上角的部分我们已经梳理完了,也能发现,份号、密级、紧急程度这三部分要素,并不是所有公文都具备的。 四、发文机关标志。这部分,我们之所以称公文未红头文件,是因为发文机关标志红色醒目得名的。这部分要素也是版头的核心。在写法上,需要注意发文机关全称、简称+文件二字组成,其中,文件二字是可以省略的。这里也是常考点。 五、发文字号。由发文机关代字+年份+顺序号组成。这里考点很多也很细,所以建议大家去记忆一个例子;国发〔2012〕12号。在做题时,按着这个格式走,就可以了。 六、签发人。这个只有在上行文中有。因为下级机关很多,标注签发人姓名是为了能让上级知晓是那个机关的。所以,签发人这个要素也不是所有公文都具备的要素。 好了,以上就是这版头的六大要素了,在学习时,还是需要多画图记忆的,不要单独去看文字,文字转化成图形这样记忆效果会更好。下面我们做一下题来试试吧。 单选下列关于公文版头的构成要素的表述正确的是( ) A 份号、密级保密期和紧急程度是每个公文必备要素。 B 签发人也是是每个公文必备要素。

PE结构4——区段与代码类型

甲壳虫免杀VIP教程 https://www.360docs.net/doc/0410414179.html, 专业的免杀技术培训基地 我们的口号:绝对不一样的免杀教程!绝对不一样的实战体验!清晰的思路!细致全面的讲解!让你感到免杀原来可以这么简单! 动画教程只是起到技术交流作用.请大家不用利用此方法对国内的网络做破坏. 国人应该团结起来一致对外才是我们的责任.由此动画造成的任何后果和本站 无关. -------------------------------------------------------------------- 【免杀PE结构班】制作:Just41(carrieyz) 第四节【PE文件常见区段及其代码类型】 一、区段表的结构 PE文件格式中,所有的区段信息位于可选PE头之后。每个区段信息为40个字节长,并且没有任何填充信息。区段信息被定义为以下的结构: 学名:免杀技术说明大小LOADPE Name:区段名称,如".text" [8h] SizeOfRawData:RV A偏移大小[4h] VSize VirtualAddress:区段RV A起始地址[4h] VOffset PointerToRawData:区段物理偏移大小(偏移量)[4h] RSize PhysicalAddress:区段物理起始地址[4h] ROffset VirtualSize:真实长度[4h] PointerToRelocations:重定位的偏移[4h] PointerToLinenumbers:行号表的偏移[4h] NumberOfRelocations:重定位项数目[2h] NumberOfLinenumbers:行号表的数目[2h] Characteristics:区段属性[4h] 标志 计算方式: 区段表的文件偏移地址=PE头的文件偏移地址+14h+可选PE头大小+1 首先从0X3Ch处得到PE头的文件偏移地址,然后由PE头的文件偏移地址+14h得到可选PE头大小,再将上面三个数据相加再+1就得到区段表的文件偏移地址了。 VSize的大小只是效验下是否跨越下一个节了,或者是否超出了SizeOfImage,如果出现越界问题,提示非法32位应用程序,否则的话,它的值没有意义,节的大小不是由它决定的......对非最后一个节,按节间VOffset之差,最后一节用SizeOfImage-VOffset。

红头文件格式标准样板最新(最新)

格式: 眉首:(文头,红色反线以上部分) 印制份数序号、密级和保密期限、紧急程度、发文机关标识、发文字号、签发人 1公文份数顺序号7位数(版心左上角顶格第1行,机密、绝密件才标注) 2密级和保密期限(秘密、机密、绝密*30年) 秘密件指内容涉及国家一般秘密,一旦泄露会使国家的安全和利益遭受一定损害的公文。机密件指内容涉及国家重要秘密,一旦泄露会使国家的安全和利益遭受严重损害的公文。绝密件指内容涉及国家核心秘密,一旦泄露会使国家的安全和利益遭受重大损害的公文。 3紧急程度 急件、特急;电报:特提、特急、加急、平急 (3号黑体字,顶格标识在版心右上角第1行,两字间空1字;如同时标识密级和紧急程度,密级在第1行,紧急程序在第2行) 4发文机关标识(小标宋体字,红色) 《XXX人民政府文件》——主要用于向上级机关报告工作,颁布行政规章,发布政府的决定或通知、印发重要会议纪要和政府领导讲话,转发上级或批转下级重要文件等) 《XXX人民政府》——主要用于印发函件及处理一般事项的通知、批复等下行文。联合行文(党、政、军、群) 5发文字号(发文机关标识下空2行,用3号仿宋体字,居中排布。联合行文只标主办机关的发文字号) 发文机关代字(渝府发)——年份〔2005〕——序号 6签发人 只有上行文才标注。平行排列于发文字号右侧。发文字号居左空1字,签发人姓名居右空1字。“签发人”用3号仿宋字,后用3号楷体字标识签发人姓名。 二、主体(红色反线下方,主题词上方) 标题、主送机关、正文、附件、发文机关、成文时间、印章、附注

1标题(位于红色反线空两行之下,2号小标宋体字,居中) 三要素:发文机关——事由(关于?的)——文种 要求:切题、简明、醒目、得体 2主送机关(左侧顶格用3号仿宋体字标识) 全称或规范化简称、统称 注:公告、通告等属周知性的公文,没有主送单位。 3公文正文:首页必须显示正文 4附件(正文下空1行左空2字,用3号仿宋体标识) 附件是正文内容的组成部分,与公文正文一样具有同等效力。 5成文日期(行政机关公文用汉字,党委系统用阿拉伯数码标识;法规性公文的成文时间一般在标题下方正中,并加一圆括号) 成文日期确定的原则: (1)会议通过的决定、决议等以会议通过日期为准; (2)领导签发的,以签发日期为准; (3)联合行文,以最后签发机关的领导签发日期为准;

相关文档
最新文档