⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pe文件格式.txt

📁 这是一些关于C++的小知识!
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    SizeOfOptionalHeader:可选头的长度(sizeof IMAGE_OPTIONAL_HEADER)你可以用它
来检验PE文件的正确性。
    Characteristics:是一个标志的集合,其中大部分的位用在目标文件(OBJ)或库文件
(LIB)中:
        Bit 0 (IMAGE_FILE_RELOCS_STRIPPED):置1表示文件中没有重定向信息。每个段都
有它们自己的重定向信息。这个标志在可执行文件中没有使用,在可执行文件中是用一个叫做
基址重定向目录表来表示重定向信息的,这将在下面介绍。
        Bit 1 (IMAGE_FILE_EXECUTABLE_IMAGE):置1表示该文件是可执行文件(也就是说
不是一个目标文件或库文件)。
        Bit 2 (IMAGE_FILE_LINE_NUMS_STRIPPED):置1表示没有行数信息;在可执行文件
中没有使用。
        Bit 3 (IMAGE_FILE_LOCAL_SYMS_STRIPPED):置1表示没有局部符号信息;在可执行
文件中没有使用。
        Bit 4 (IMAGE_FILE_AGGRESIVE_WS_TRIM):
        Bit 7 (IMAGE_FILE_BYTES_REVERSED_LO)
        Bit 15 (IMAGE_FILE_BYTES_REVERSED_HI):表示文件的字节顺序如果不是机器所期
望的,那么在读出之前要进行交换。在可执行文件中它们是不可信的(操作系统期望按正确的
字节顺序执行程序)。
        Bit 8 (IMAGE_FILE_32BIT_MACHINE):表示希望机器为32位机。这个值永远为1。
        Bit 9 (IMAGE_FILE_DEBUG_STRIPPED):表示没有调试信息,在可执行文件中没有使
用。
        Bit 10 (IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP):置1表示该程序不能运行于可移
动介质中(如软驱或CD-ROM)。在这种情况下,OS必须把文件拷贝到交换文件中执行。
        Bit 11 (IMAGE_FILE_NET_RUN_FROM_SWAP):置1表示程序不能在网上运行。在这种
情况下,OS必须把文件拷贝到交换文件中执行。
        Bit 12 (IMAGE_FILE_SYSTEM):置1表示文件是一个系统文件例如驱动程序。在可执
行文件中没有使用。
        Bit 13 (IMAGE_FILE_DLL):置1表示文件是一个动态链接库(DLL)。
        Bit 14 (IMAGE_FILE_UP_SYSTEM_ONLY):表示文件被设计成不能运行于多处理器系
统中。

四、可选头(Optional Header)
    文件头下面就是可选头,这是一个叫做IMAGE_OPTIONAL_HEADER的结构。它包含很多关于
PE文件定位的信息。下面分别介绍:
    typedef struct _IMAGE_OPTIONAL_HEADER {
        //
        // Standard fields.
        //
        WORD    Magic;    //0x18
        BYTE    MajorLinkerVersion;  //0x1a
        BYTE    MinorLinkerVersion;  //0x1b
        DWORD   SizeOfCode;    //0x1c
        DWORD   SizeOfInitializedData;  //0x20
        DWORD   SizeOfUninitializedData;  //0x24
        DWORD   AddressOfEntryPoint;  //0x28
        DWORD   BaseOfCode;    //0x2c
        DWORD   BaseOfData;    //0x30
        //
        // NT additional fields.
        //
        DWORD   ImageBase;    //0x34
        DWORD   SectionAlignment;   //0x38
        DWORD   FileAlignment;   //0x3c
        WORD    MajorOperatingSystemVersion; //0x3e
        WORD    MinorOperatingSystemVersion; //0x40
        WORD    MajorImageVersion;   //0x42
        WORD    MinorImageVersion;   //0x44
        WORD    MajorSubsystemVersion;  //0x46
        WORD    MinorSubsystemVersion;  //0x48
        DWORD   Win32VersionValue;   //0x4c
        DWORD   SizeOfImage;   //0x50
        DWORD   SizeOfHeaders;   //0x54
        DWORD   CheckSum;    //0x58
        WORD    Subsystem;    //0x5c
        WORD    DllCharacteristics;  //0x5e
        DWORD   SizeOfStackReserve;  //0x60
        DWORD   SizeOfStackCommit;   //0x64
        DWORD   SizeOfHeapReserve;   //0x68
        DWORD   SizeOfHeapCommit;   //0x6c
        DWORD   LoaderFlags;   //0x70
        DWORD   NumberOfRvaAndSizes;  //0x74
        IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

    Magic:这个值好象总是0x010b。
    MajorLinkerVersion及MinorLinkerVersion:链接器的版本号,这个值不太可靠。
    SizeOfCode:可执行代码的长度。
    SizeOfInitializedData:初始化数据的长度(数据段)。
    SizeOfUninitializedData:未初始化数据的长度(bss段)。
    AddressOfEntryPoint:代码的入口RVA地址,程序从这儿开始执行。
    BaseOfCode:可执行代码起始位置,意义不大。
    BaseOfData:初始化数据起始位置,意义不大。
    ImageBase:载入程序首选的RVA地址。这个在址可被Loader改变。
    SectionAlignment:段加载后在内存中的对齐方式。
    FileAlignment:段在文件中的对齐方式。
    MajorOperatingSystemVersion及MinorOperatingSystemVersion:操作系统版本,Load
er并没有用它。
    MajorImageVersion及MinorImageVersion:程序版本。
    MajorSubsystemVersion及MinorSubsystemVersion:子系统版本号,这个域系统支持;
例如:如果程序运行于NT下,子系统版本号如果不是4.0的话,对话框不能显示3D风格。
    Win32VersionValue:这个值好象总是为0。
    SizeOfImage:程序调入后占用内存大小(字节),等于所有段的长度之和。
    SizeOfHeaders:所有文件头的长度之和,它等于从文件开始到第一个段的原始数据之间
的大小。
    CheckSum:校验和。它仅用在驱动程序中,在可执行文件中可能为0。它的计算方法Mic
rosoft不公开,在imagehelp.dll中的CheckSumMappedFile()函数可以计算它。
    Subsystem:NT子系统,可能是以下的值:
        IMAGE_SUBSYSTEM_NATIVE (1)
            不需要子系统。用在驱动程序中。
        IMAGE_SUBSYSTEM_WINDOWS_GUI(2)
            WIN32 graphical程序(它可用AllocConsole()来打开一个控制台,但是不能在
一开始自动得到)。
        IMAGE_SUBSYSTEM_WINDOWS_CUI(3)
            WIN32 console程序(它可以一开始自动建立)。
        IMAGE_SUBSYSTEM_OS2_CUI(5)
            OS/2 console程序(因为程序是OS/2格式,所以它很少用在PE)。
        IMAGE_SUBSYSTEM_POSIX_CUI(7)
            POSIX console程序。
        Windows95程序总是用WIN32子系统,所以只有2和3是合法的值。
    DllCharacteristics:Dll状态。
    SizeOfStackReserve:保留堆栈大小。
    SizeOfStackCommit:启动后实际申请的堆栈数,可随实际情况变大。
    SizeOfHeapReserve:保留堆大小。
    SizeOfHeapCommit:实际堆大小。
    LoaderFlags:好象没有用。
    NumberOfRvaAndSizes:下面的目录表入口个数,这个值也不可靠,你可用常数IMAGE_N
UMBEROF_DIRECTORY_ENTRIES来代替它,值好象总等于16。
    DataDirectory:是一个IMAGE_DATA_DIRECTORY数组,数组元素个数为IMAGE_NUMBEROF_
DIRECTORY_ENTRIES,结构如下:
        typedef struct _IMAGE_DATA_DIRECTORY {
            DWORD   VirtualAddress;
            DWORD   Size;
        } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
        VirtualAddress:起始RVA地址。
        Size:长度。
    每一个目录表代表以下的值:
    IMAGE_DIRECTORY_ENTRY_EXPORT (0)
    IMAGE_DIRECTORY_ENTRY_IMPORT (1)
    IMAGE_DIRECTORY_ENTRY_RESOURCE (2)
    IMAGE_DIRECTORY_ENTRY_EXCEPTION (3)
    IMAGE_DIRECTORY_ENTRY_SECURITY (4)
    IMAGE_DIRECTORY_ENTRY_BASERELOC (5)
    IMAGE_DIRECTORY_ENTRY_DEBUG (6)
    IMAGE_DIRECTORY_ENTRY_COPYRIGHT (7)
    IMAGE_DIRECTORY_ENTRY_GLOBALPTR (8)
    IMAGE_DIRECTORY_ENTRY_TLS (9)
    IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG (10)
    IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (11)
    IMAGE_DIRECTORY_ENTRY_IAT (12)

后记(猛禽):原文为新浪程序员论坛网友 野草 从英文版中译出,在此表示感谢。此文可能没有译完,据说 MSDN 中有此英文版。 

[Mental Studio]Apr.26-2k 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -