1. //IMAGE_OPTIONAL_HEADER结构(可选映像头)
  2. typedef struct _IMAGE_OPTIONAL_HEADER {
  3. //
  4. // Standard fields.
  5. //
  6. WORD Magic; //幻数,一般为10BH
  7. BYTE MajorLinkerVersion; //链接程序的主版本号
  8. BYTE MinorLinkerVersion; //链接程序的次版本号
  9. DWORD SizeOfCode; //代码段大小
  10. DWORD SizeOfInitializedData; //已初始化数据块的大小
  11. DWORD SizeOfUninitializedData; //未初始化数据库的大小
  12. DWORD AddressOfEntryPoint; //程序开始执行的入口地址,这是一个RVA(相对虚拟地址)
  13. DWORD BaseOfCode; //代码段的起始RVA 一般来说 是 1000h
  14. DWORD BaseOfData; //数据段的起始RVA
  15. //
  16. // NT additional fields.
  17. //
  18. DWORD ImageBase; //可执行文件默认装入的基地址
  19. DWORD SectionAlignment; //内存中块的对齐值(默认的块对齐值为1000H,4KB个字节)
  20. DWORD FileAlignment;//文件中块的对齐值(默认值为200H字节,为了保证块总是从磁盘的扇区开始的)
  21. WORD MajorOperatingSystemVersion;//要求操作系统的最低版本号的主版本号
  22. WORD MinorOperatingSystemVersion;//要求操作系统的最低版本号的次版本号
  23. WORD MajorImageVersion;//该可执行文件的主版本号
  24. WORD MinorImageVersion;//该可执行文件的次版本号
  25. WORD MajorSubsystemVersion;//要求最低之子系统版本的主版本号 默认 0004
  26. WORD MinorSubsystemVersion;//要求最低之子系统版本的次版本号 默认 0000
  27. DWORD Win32VersionValue;//保留字 默认00000000
  28. DWORD SizeOfImage;//映像装入内存后的总尺寸 一般为00004000 映射到内存中一个块1000内存
  29. DWORD SizeOfHeaders;//部首及块表的大小
  30. DWORD CheckSum;//CRC检验和 一般为00000000
  31. WORD Subsystem;//程序使用的用户接口子系统
  32. WORD DllCharacteristics;//DLLmain函数何时被调用,默认为0
  33. DWORD SizeOfStackReserve;//初始化时堆栈大小
  34. DWORD SizeOfStackCommit;//初始化时实际提交的堆栈大小
  35. DWORD SizeOfHeapReserve;//初始化时保留的堆大小
  36. DWORD SizeOfHeapCommit;//初始化时实际提交的对大小
  37. DWORD LoaderFlags;//与调试有关,默认为0
  38. DWORD NumberOfRvaAndSizes;//数据目录结构的数目
  39. IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表
  40. }
  41. 具有31个成员
  42.  
  43. Magic 幻数,32pe文件总为010B
  44. 这个常数的定义如下:
  45.  
  46. #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10B
  47. #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20B
  48. #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
  49.  
  50. MajorLinkerVersion 连接程序的主版本号 vc6.0的为06h
  51.  
  52. MinorLinkerVersion 连接程序的次版本号 vc6.0的为00h
  53.  
  54. SizeOfCode pe文件代码段的大小.是FileAlignment的整数倍.
  55.  
  56. SizeOfInitializedData 所有含已初始化数据的块的大小,一般在.data段中.
  57.  
  58. SizeOfUninitializedData 所有含未初始化数据的块的大小,一般在.bss段中.
  59.  
  60. AddressOfEntryPoint 程序开始执行的地址,这是一个RVA(相对虚拟地址).对于exe文件,这里是启动代码;对于dll文件,这里是libMain()的地址.
  61. 在脱壳时第一件事就是找入口点,指的就是这个值.
  62.  
  63. BaseOfCode 代码段基地址,微软的连接程序生成的程序一般把这个值置为1000h,
  64.  
  65. BaseOfData 数据段基地址
  66.  
  67. ImageBase pe文件默认的装入地址.windows9xexe文件为400000h,dll文件为10000000h.
  68.  
  69. SectionAlignment 内存中区块的对齐单位.区块总是对齐到这个值的整数倍.x8632位系统上默认值位1000h
  70.  
  71. FileAlignment pe文件中区块的对齐单位.pe文件中默认值为 200h.
  72.  
  73. MajorOperatingSystemVersion
  74. MinorOperatingSystemVersion
  75. 上面两个域是指运行这个pe文件所需的操作系统的最低版本号.windows95/98windows nt 4.0 的内部版本号都是 4.0 ,而windows2000的内部版本号是5.
  76.  
  77. MajorImageVersion
  78. MinorImageVersion
  79. 上面两个域是指用户自定义的pe文件的版本号.可以通过连接程序来设置,如: LINK /VERSION:2.0 MyApp.obj一般在升级时使用.
  80.  
  81. MajorSubsystemVersion
  82. MinorSubsystemVersion
  83. 上面两个域是指运行这个pe文件所要求的子系统的版本号.
  84.  
  85. Win32VersionValue 总是0
  86.  
  87. SizeOfImage pe文件装入内存后映像的总大小.如果SectionAlignment域和FileAlignment域相等,那么这个值也是pe文件在硬盘上的大小.
  88.  
  89. SizeOfHeaders 从文件开始到节表(包含节表)的总大小.其后是各个区段的数据.
  90. PE头结构大小为220H,但是映射到内存中对齐粒度是200H实际上占用400H的空间
  91.  
  92. CheckSum pe文件的CRC校验和.
  93.  
  94. Subsystem pe文件的用户界面使用的子系统类型.定义如下:
  95. #define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
  96. #define IMAGE_SUBSYSTEM_NATIVE 1 // 不需要子系统一般用在驱动当中。
  97. #define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // WIN32 console程序一般用在exe文件中
  98. #define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // WIN32 console程序一开始就会打开一个控制台
  99. #define IMAGE_SUBSYSTEM_OS2_CUI 5 // OS/2格式所以很少用在PE文件中
  100. #define IMAGE_SUBSYSTEM_POSIX_CUI 7 // POSIX console程序
  101. #define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // image is a native Win9x driver.
  102. #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Image runs in the Windows CE subsystem.
  103.  
  104. DllCharacteristics 总为0
  105.  
  106. SizeOfStackReserve 为线程的栈初始保留的虚拟内存的大小,默认为00100000h.如果在调用CreateThread函数时指定堆栈的大小为0,被创建的线程的堆栈的初始大小就与这个值相同.
  107.  
  108. SizeOfStackCommit 为线程的栈初始提交的虚拟内存的大小.微软的连接程序把这个值置为 1000h.
  109.  
  110. SizeOfHeapReserve 为进程的堆保留的虚拟内存的大小.默认值为 00100000h.
  111.  
  112. SizeOfHeapCommit 为进程的堆初始提交的虚拟内存的大小.微软的连接程序把这个值置为1000h.
  113.  
  114. LoaderFlags 通常为0
  115.  
  116. NumberOfRvaAndSizes 数据目录结构数组的项数,总为 00000010h
  117. 这个值定义如下:
  118. #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
  119.  
  120. IMAGE_DATA_DIRECTORY DataDirectory[0x10] 数据目录结构数组
  121.  
  122. #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // 导出表
  123. #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // 导入表
  124. #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // 资源
  125. #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // 异常
  126. #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // 安全
  127. #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // 重定位表
  128. #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // 调试信息
  129. #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage)
  130. #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // 版权信息
  131. #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP
  132. #define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
  133. #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
  134. #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers
  135. #define IMAGE_DIRECTORY_ENTRY_IAT 12 // 导入函数地址表
  136. #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors
  137. #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor
  138.  
  139. typedef struct _IMAGE_DATA_DIRECTORY {
  140. DWORD VirtualAddress;// 相对虚拟地址
  141. DWORD Size; //大小
  142. } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

可选头 IMAGE_OPTIONAL_HEADER的更多相关文章

  1. UNIX标准化及实现之POSIX标准可选头文件

    POSIX标准定义的可选头文件 头文件 说明 <aio.h> 异步I/O <mqueue.h> 消息队列 <pthread.h> 线程 <sched.h> ...

  2. PE文件格式详解,第三讲,可选头文件格式,以及节表

    PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...

  3. C/C++ 程序反调试的方法

    C/C++ 要实现程序反调试有多种方法,BeingDebugged,NtGlobalFlag,ProcessHeap,CheckRemoteDebuggerPresent,STARTUPINFO,Is ...

  4. NT头 IMAGE_NT_HEADER

    typedef struct_IMAGE_NT_HEADERS{ DWORD Signature; // 固定为 0x00004550 “PE00" IMAGE_FILE_HEADER Fi ...

  5. PE头详细分析

    目录 PE头详细分析 0x00 前言 0x01 PE文件介绍 0x02 PE头详细分析 DOS头解析 NT头解析 标准PE头解析 可选PE头解析 可选PE头结构 基址 代码段地址 数据段地址 OEP程 ...

  6. 常用 C 头文件

    ISO C 标准定义的头文件 头文件 说明 <assert.h> 验证程序断言 <complex.h> 复数算术运算支持 <ctype.h> 字符分类和映射支持 & ...

  7. linux常用头文件及说明

    linux常用头文件及说明 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言,assert(表达式)<glib.h>:GCC.GTK,GNOM ...

  8. PE文件结构详解(二)可执行文件头

    在PE文件结构详解(一)基本概念里,解释了一些PE文件的一些基本概念,从这篇开始,将详细讲解PE文件中的重要结构. 了解一个文件的格式,最应该首先了解的就是这个文件的文件头的含义,因为几乎所有的文件格 ...

  9. (转)linux中常用的头文件

    头文件主目录include 头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个.这些头文件各自的功能如下,具体的作用和所包 ...

随机推荐

  1. 如何使用SecureCRT连接vmware下ubuntu

    配置SecureCrt 和 ubuntu1. 首先要明白什么是ssh?可以把ssh看做是telnet的加强版,telnet的密码和信息都是不加密的,而ssh则加密.2. 开启ubuntu上的ssh功能 ...

  2. linux关闭防火墙及selinux

    RHEL6.5 查看linux防护墙状态: service iptables status 关闭linux防火墙: 1)永久关闭,重启后生效 开启: chkconfig iptables on 关闭: ...

  3. View inflate方法和LayoutInflater inflate方法的区别详解

    原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/6257510.html 我们在Android开发中,对于将布局填充成View对象,最常用的两种办法 ...

  4. Android 开发经验

    学习社区 eoe移动开发者社区 (link) 链接:http://www.eoeandroid.com/ 环境配置 Cocos2d-x 3.x 全平台新手开发配置教程 链接:http://www.co ...

  5. Managing Hierarchical Data in MySQL

    Managing Hierarchical Data in MySQL Introduction Most users at one time or another have dealt with h ...

  6. jenkins服务器安装

    http://www.360doc.com/content/13/0412/09/10504424_277718090.shtml

  7. Machine Learning—Mixtures of Gaussians and the EM algorithm

    印象笔记同步分享:Machine Learning-Mixtures of Gaussians and the EM algorithm

  8. android Bluetooth(官方翻译)

    Bluetooth Using the Bluetooth APIs, an Android application can perform the following: 使用蓝牙APIs,一个And ...

  9. TsFltMgr.sys系统蓝屏的原因就在于QQ电脑管家!

    同事一WindowsXP系统,正常执行,关闭后,第二天无法启动,详细症状为: (1)安全模式以及带网络功能的安全模式都能够进入: (2)正常模式,还没出现WindowXP滚动栏就開始重新启动: (3) ...

  10. git clone之后自动checkout文件处理

    这个问题发生是因为不同操作系统的行结束符不一致导致的,可在clone之后在仓库根目录修改.gitattributes文件 简单处理的话,注释* text=auto这行即可.也可根据不同系统,做相应设定 ...