zoukankan      html  css  js  c++  java
  • PE Header中的OptionalHeader

    typedef struct _IMAGE_OPTIONAL_HEADER
    {
    //
    // Standard fields.
    //
    +18h WORD Magic; // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)
    +1Ah BYTE MajorLinkerVersion; // 链接程序的主版本号
    +1Bh BYTE MinorLinkerVersion; // 链接程序的次版本号
    +1Ch DWORD SizeOfCode; // 所有含代码的节的总大小
    +20h DWORD SizeOfInitializedData; // 所有含已初始化数据的节的总大小
    +24h DWORD SizeOfUninitializedData; // 所有含未初始化数据的节的大小
    +28h DWORD AddressOfEntryPoint; // 程序执行入口RVA
    +2Ch DWORD BaseOfCode; // 代码的区块的起始RVA
    +30h DWORD BaseOfData; // 数据的区块的起始RVA
    //
    // NT additional fields. 以下是属于NT结构增加的领域。
    //
    +34h DWORD ImageBase; // 程序的首选装载地址
    +38h DWORD SectionAlignment; // 内存中的区块的对齐大小
    +3Ch DWORD FileAlignment; // 文件中的区块的对齐大小
    +40h WORD MajorOperatingSystemVersion; // 要求操作系统最低版本号的主版本号
    +42h WORD MinorOperatingSystemVersion; // 要求操作系统最低版本号的副版本号
    +44h WORD MajorImageVersion; // 可运行于操作系统的主版本号
    +46h WORD MinorImageVersion; // 可运行于操作系统的次版本号
    +48h WORD MajorSubsystemVersion; // 要求最低子系统版本的主版本号
    +4Ah WORD MinorSubsystemVersion; // 要求最低子系统版本的次版本号
    +4Ch DWORD Win32VersionValue; // 莫须有字段,不被病毒利用的话一般为0
    +50h DWORD SizeOfImage; // 映像装入内存后的总尺寸
    +54h DWORD SizeOfHeaders; // 所有头 + 区块表的尺寸大小
    +58h DWORD CheckSum; // 映像的校检和
    +5Ch WORD Subsystem; // 可执行文件期望的子系统
    +5Eh WORD DllCharacteristics; // DllMain()函数何时被调用,默认为 0
    +60h DWORD SizeOfStackReserve; // 初始化时的栈大小
    +64h DWORD SizeOfStackCommit; // 初始化时实际提交的栈大小
    +68h DWORD SizeOfHeapReserve; // 初始化时保留的堆大小
    +6Ch DWORD SizeOfHeapCommit; // 初始化时实际提交的堆大小
    +70h DWORD LoaderFlags; // 与调试有关,默认为 0
    +74h DWORD NumberOfRvaAndSizes; // 下边数据目录的项数,这个字段自Windows NT 发布以来 // 一直是16
    +78h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    // 数据目录表
    } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
    FieldMeanings
    AddressOfEntryPoint PE装载器准备运行的PE文件的第一个指令的RVA。若您要改变整个执行的流程,可以将该值指定到新的RVA,这样新RVA处的指令首先被执行。
    ImageBase PE文件的优先装载地址。比如,如果该值是400000h,PE装载器将尝试把文件装到虚拟地址空间的400000h处。字眼"优先"表示若该地址区域已被其他模块占用,那PE装载器会选用其他空闲地址。
    SectionAlignment 内存中节对齐的粒度。例如,如果该值是4096 (1000h),那么每节的起始地址必须是4096的倍数。若第一节从401000h开始且大小是10个字节,则下一节必定从402000h开始,即使401000h和402000h之间还有很多空间没被使用。
    FileAlignment

    文件中节对齐的粒度。例如,如果该值是(200h),,那么每节的起始地址必须是512的倍数。若第一节从文件偏移量200h开始且大小是10个字节,则下一节必定位于偏移量400h: 即使偏移量512和1024之间还有很多空间没被使用/定义。

    MajorSubsystemVersion
    MinorSubsystemVersion
    win32子系统版本。若PE文件是专门为Win32设计的,该子系统版本必定是4.0否则对话框不会有3维立体感。
    SizeOfImage 内存中整个PE映像体的尺寸。它是所有头和节经过节对齐处理后的大小。
    SizeOfHeaders 所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸。可以以此值作为PE文件第一节的文件偏移量。
    Subsystem NT用来识别PE文件属于哪个子系统。 对于大多数Win32程序,只有两类值: Windows GUI 和 Windows CUI (控制台)。
    DataDirectory IMAGE_DATA_DIRECTORY 结构数组。每个结构给出一个重要数据结构的RVA,比如引入地址表等。
  • 相关阅读:
    Haskell Interactive Development in Emacs
    Access Java API in Groovy Script
    手工设置Eclipse文本编辑器的配色
    Color Theme of Emacs
    Gnucash的投资记录
    Special Forms and Syntax Sugars in Clojure
    Use w3m as Web Browser
    SSE指令集加速之 I420转BGR24
    【图像处理】 增加程序速度的方法
    TBB 入门笔记
  • 原文地址:https://www.cnblogs.com/wang-can/p/3280339.html
Copyright © 2011-2022 走看看