可选头 IMAGE_OPTIONAL_HEADER
//IMAGE_OPTIONAL_HEADER结构(可选映像头)
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic; //幻数,一般为10BH
BYTE MajorLinkerVersion; //链接程序的主版本号
BYTE MinorLinkerVersion; //链接程序的次版本号
DWORD SizeOfCode; //代码段大小
DWORD SizeOfInitializedData; //已初始化数据块的大小
DWORD SizeOfUninitializedData; //未初始化数据库的大小
DWORD AddressOfEntryPoint; //程序开始执行的入口地址,这是一个RVA(相对虚拟地址)
DWORD BaseOfCode; //代码段的起始RVA 一般来说 是 1000h
DWORD BaseOfData; //数据段的起始RVA
//
// NT additional fields.
//
DWORD ImageBase; //可执行文件默认装入的基地址
DWORD SectionAlignment; //内存中块的对齐值(默认的块对齐值为1000H,4KB个字节)
DWORD FileAlignment;//文件中块的对齐值(默认值为200H字节,为了保证块总是从磁盘的扇区开始的)
WORD MajorOperatingSystemVersion;//要求操作系统的最低版本号的主版本号
WORD MinorOperatingSystemVersion;//要求操作系统的最低版本号的次版本号
WORD MajorImageVersion;//该可执行文件的主版本号
WORD MinorImageVersion;//该可执行文件的次版本号
WORD MajorSubsystemVersion;//要求最低之子系统版本的主版本号 默认 0004
WORD MinorSubsystemVersion;//要求最低之子系统版本的次版本号 默认 0000
DWORD Win32VersionValue;//保留字 默认00000000
DWORD SizeOfImage;//映像装入内存后的总尺寸 一般为00004000 映射到内存中一个块1000内存
DWORD SizeOfHeaders;//部首及块表的大小
DWORD CheckSum;//CRC检验和 一般为00000000
WORD Subsystem;//程序使用的用户接口子系统
WORD DllCharacteristics;//DLLmain函数何时被调用,默认为0
DWORD SizeOfStackReserve;//初始化时堆栈大小
DWORD SizeOfStackCommit;//初始化时实际提交的堆栈大小
DWORD SizeOfHeapReserve;//初始化时保留的堆大小
DWORD SizeOfHeapCommit;//初始化时实际提交的对大小
DWORD LoaderFlags;//与调试有关,默认为0
DWORD NumberOfRvaAndSizes;//数据目录结构的数目
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表
}
具有31个成员 Magic 幻数,32位pe文件总为010B
这个常数的定义如下: #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10B
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20B
#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 MajorLinkerVersion 连接程序的主版本号 如vc6.0的为06h MinorLinkerVersion 连接程序的次版本号 如vc6.0的为00h SizeOfCode pe文件代码段的大小.是FileAlignment的整数倍. SizeOfInitializedData 所有含已初始化数据的块的大小,一般在.data段中. SizeOfUninitializedData 所有含未初始化数据的块的大小,一般在.bss段中. AddressOfEntryPoint 程序开始执行的地址,这是一个RVA(相对虚拟地址).对于exe文件,这里是启动代码;对于dll文件,这里是libMain()的地址.
在脱壳时第一件事就是找入口点,指的就是这个值. BaseOfCode 代码段基地址,微软的连接程序生成的程序一般把这个值置为1000h, BaseOfData 数据段基地址 ImageBase pe文件默认的装入地址.windows9x中exe文件为400000h,dll文件为10000000h. SectionAlignment 内存中区块的对齐单位.区块总是对齐到这个值的整数倍.x86的32位系统上默认值位1000h FileAlignment pe文件中区块的对齐单位.pe文件中默认值为 200h. MajorOperatingSystemVersion
MinorOperatingSystemVersion
上面两个域是指运行这个pe文件所需的操作系统的最低版本号.windows95/98和windows nt 4.0 的内部版本号都是 4.0 ,而windows2000的内部版本号是5. MajorImageVersion
MinorImageVersion
上面两个域是指用户自定义的pe文件的版本号.可以通过连接程序来设置,如: LINK /VERSION:2.0 MyApp.obj一般在升级时使用. MajorSubsystemVersion
MinorSubsystemVersion
上面两个域是指运行这个pe文件所要求的子系统的版本号. Win32VersionValue 总是0 SizeOfImage pe文件装入内存后映像的总大小.如果SectionAlignment域和FileAlignment域相等,那么这个值也是pe文件在硬盘上的大小. SizeOfHeaders 从文件开始到节表(包含节表)的总大小.其后是各个区段的数据.
PE头结构大小为220H,但是映射到内存中对齐粒度是200H实际上占用400H的空间 CheckSum pe文件的CRC校验和. Subsystem pe文件的用户界面使用的子系统类型.定义如下:
#define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem.
#define IMAGE_SUBSYSTEM_NATIVE 1 // 不需要子系统一般用在驱动当中。
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // WIN32 console程序一般用在exe文件中
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // WIN32 console程序一开始就会打开一个控制台
#define IMAGE_SUBSYSTEM_OS2_CUI 5 // OS/2格式所以很少用在PE文件中
#define IMAGE_SUBSYSTEM_POSIX_CUI 7 // POSIX console程序
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8 // image is a native Win9x driver.
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 // Image runs in the Windows CE subsystem. DllCharacteristics 总为0 SizeOfStackReserve 为线程的栈初始保留的虚拟内存的大小,默认为00100000h.如果在调用CreateThread函数时指定堆栈的大小为0,被创建的线程的堆栈的初始大小就与这个值相同. SizeOfStackCommit 为线程的栈初始提交的虚拟内存的大小.微软的连接程序把这个值置为 1000h. SizeOfHeapReserve 为进程的堆保留的虚拟内存的大小.默认值为 00100000h. SizeOfHeapCommit 为进程的堆初始提交的虚拟内存的大小.微软的连接程序把这个值置为1000h. LoaderFlags 通常为0 NumberOfRvaAndSizes 数据目录结构数组的项数,总为 00000010h
这个值定义如下:
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 IMAGE_DATA_DIRECTORY DataDirectory[0x10] 数据目录结构数组 #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 // (X86 usage)
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // 版权信息
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP
#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT 12 // 导入函数地址表
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;// 相对虚拟地址
DWORD Size; //大小
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
可选头 IMAGE_OPTIONAL_HEADER的更多相关文章
- UNIX标准化及实现之POSIX标准可选头文件
POSIX标准定义的可选头文件 头文件 说明 <aio.h> 异步I/O <mqueue.h> 消息队列 <pthread.h> 线程 <sched.h> ...
- PE文件格式详解,第三讲,可选头文件格式,以及节表
PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...
- C/C++ 程序反调试的方法
C/C++ 要实现程序反调试有多种方法,BeingDebugged,NtGlobalFlag,ProcessHeap,CheckRemoteDebuggerPresent,STARTUPINFO,Is ...
- NT头 IMAGE_NT_HEADER
typedef struct_IMAGE_NT_HEADERS{ DWORD Signature; // 固定为 0x00004550 “PE00" IMAGE_FILE_HEADER Fi ...
- PE头详细分析
目录 PE头详细分析 0x00 前言 0x01 PE文件介绍 0x02 PE头详细分析 DOS头解析 NT头解析 标准PE头解析 可选PE头解析 可选PE头结构 基址 代码段地址 数据段地址 OEP程 ...
- 常用 C 头文件
ISO C 标准定义的头文件 头文件 说明 <assert.h> 验证程序断言 <complex.h> 复数算术运算支持 <ctype.h> 字符分类和映射支持 & ...
- linux常用头文件及说明
linux常用头文件及说明 1. Linux中一些头文件的作用: <assert.h>:ANSI C.提供断言,assert(表达式)<glib.h>:GCC.GTK,GNOM ...
- PE文件结构详解(二)可执行文件头
在PE文件结构详解(一)基本概念里,解释了一些PE文件的一些基本概念,从这篇开始,将详细讲解PE文件中的重要结构. 了解一个文件的格式,最应该首先了解的就是这个文件的文件头的含义,因为几乎所有的文件格 ...
- (转)linux中常用的头文件
头文件主目录include 头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个.这些头文件各自的功能如下,具体的作用和所包 ...
随机推荐
- treap启发式合并
注意输入v要在建根的前面. #include <cstdio> #include <iostream> #include <algorithm> #include ...
- -_-#【Mac】快捷操作
快捷键 command + 拖拽 = 剪切option + 拖拽 = 复制command + option + 拖拽 = 快捷方式 command + ] 前进command + [ 后退 comma ...
- 【中国剩余定理】POJ 1006 & HDU 1370 Biorhythms
题目链接: http://poj.org/problem?id=1006 http://acm.hdu.edu.cn/showproblem.php?pid=1370 题目大意: (X+d)%23=a ...
- SET NOCOUNT (Transact-SQL)
阻止在结果集中返回显示受 Transact-SQL 语句或存储过程影响的行计数的消息. 语法 SET NOCOUNT { ON | OFF } 注释 当 SET NOCOUNT 为 ON 时,不返回 ...
- Android中bitmap的相关处理
加载大图片 Options options=new Options(); options.inJustDecodeBounds=true;//不加载图片,只加载文件信息 //加载图片,获取到配置信息 ...
- GC与显式内存管理
C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新.然而,从这两年的效果而言,C++的复兴并没有发生.一方面随着世界经 ...
- C# 自己定义 implicit和explicit转换
explicit 和 implicit 属于转换运算符,如用这两者能够让我们自己定义的类型支持相互交换explicti 表示显式转换.如从 A -> B 必须进行强制类型转换(B = (B)A) ...
- 【代码优化】equals深入理解
覆盖equals时,遵守通用约定 对equal方法的覆盖看起来非常easy,可是有很多情况是容易导致错误,最好的避免这些错误的办法 就是不覆盖equals方法. 必须遵循的原则: 自反性--对于不论什 ...
- Android Configuration change引发的问题及解决方法
之前在学习Fragment和总结Android异步操作的时候会在很多blog中看到对Configuration Change的讨论,以前做的项目都是固定竖屏的,所以对横竖屏切换以及横竖屏切换对程序有什 ...
- Java基础知识强化97:final、finally、finally区别
1. final修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此,一个类不能既被声明为abstract,又被声明为final. 将 ...