当前位置: 首页 > news >正文

第3章 Windows运行机理-3.4 线程的机制(5)

e_lfanew是相对实际PE头标的相对偏移量(或RVA)。要得到内存中一个指向PE头标的指针,只需将该域的值与映像的基相加:

//Ignoring typecasts and pointer conversion issues for clarity…

pNTHeader= dosHeader + dosHeader->e_lfanew;

其他字段的意义是和DOS头有关的字节,这里没有什么大的作用,就不做介绍了。

2. IMAGE_NT_HEADERS

主PE头标是一个IMAGE_NT_HEADERS类型的结构,该类型在WINNT.H中定义。

在内存中,Windows中把IMAGE_NT_HEADERS结构作为它内存中的模块数据库。在Windows中,每个被装入的EXE或DLL都用一个IMAGE_NT_HEADERS结构来说明。其结构如下:

typedef struct _IMAGE_NT_HEADERS {

DWORD Signature;

IMAGE_FILE_HEADER FileHeader;

IMAGE_OPTIONAL_HEADER32 OptionalHeader;

} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

Signature表示此文件所表示的类型,其意义定义如下:

#define IMAGE_DOS_SIGNATURE 0x4D5A // MZ

#define IMAGE_OS2_SIGNATURE 0x4E45 // NE

#define IMAGE_OS2_SIGNATURE_LE 0x4C45 // LE

#define IMAGE_NT_SIGNATURE 0x50450000 // PE00

如果是PE格式,则Signature为PE\0\0(PE后跟两个0)。

3. IMAGE_FILE_HEADER

PE头标中紧随PE的WORD记号的是一个IMAGE_FILE_HEADER类型的结构,如下所示:

typedef struct _IMAGE_FILE_HEADER {

WORD Machine;

WORD NumberOfSections;

DWORD TimeDateStamp;

DWORD PointerToSymbolTable;

DWORD NumberOfSymbols;

WORD SizeOfOptionalHeader;

WORD Characteristics;

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

这个结构的域只包含了关于文件的最基本的信息。

Machine表示该文件运行所要求的CPU,有如下的CPU ID定义:

#define IMAGE_FILE_MACHINE_UNKNOWN 0

#define IMAGE_FILE_MACHINE_I386 0x014c

// Intel 386.

#define IMAGE_FILE_MACHINE_R3000 0x0162

// MIPS little-endian, 0x160 big-endian

#define IMAGE_FILE_MACHINE_R4000 0x0166

// MIPS little-endian

#define IMAGE_FILE_MACHINE_R10000 0x0168

// MIPS little-endian

#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169

// MIPS little-endian WCE v2

#define IMAGE_FILE_MACHINE_ALPHA 0x0184

// Alpha_AXP

#define IMAGE_FILE_MACHINE_POWERPC 0x01F0

// IBM PowerPC Little-Endian

#define IMAGE_FILE_MACHINE_SH3 0x01a2

// SH3 little-endian

#define IMAGE_FILE_MACHINE_SH3E 0x01a4

// SH3E little-endian

#define IMAGE_FILE_MACHINE_SH4 0x01a6

// SH4 little-endian

#define IMAGE_FILE_MACHINE_ARM 0x01c0

// ARM Little-Endian

#define IMAGE_FILE_MACHINE_THUMB 0x01c2

#define IMAGE_FILE_MACHINE_IA64 0x0200

// Intel 64

#define IMAGE_FILE_MACHINE_MIPS16 0x0266

// MIPS

#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366

// MIPS

#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466

// MIPS

#define IMAGE_FILE_MACHINE_ALPHA64 0x0284

// ALPHA64

#define IMAGE_FILE_MACHINE_AXP64

//IMAGE_FILE_MACHINE_ALPHA64

NumberOfSection表示在EXE或OBJ中的节数。这个很重要,因为它直接表示节表数组的大小。

TimeDateStamp表示连接器生成该文件的时间。该值是指从1969年12月31日下午4点整开始至文件生成时之间的秒数。

PointerToSymbolTable表示文件的COFF符号表的偏移量。该域只用在OBJ文件和带有COFF调试信息的PE文件中,此信息只在调试文件中有用。

NumberOfSymbols表示在COFF符号表中的符号数目,参见前一个域,此信息只在调试文件中有用。

SizeOfOptionalHeader表示紧跟该结构之后的一个可选头标的大小。在可执行文件中,它是紧随该结构的image_file_header结构的大小。这个值必须有效。

Characteristics表示文件的信息化标记。一些重要的域描述如下:

// Relocation info stripped from file.

#define IMAGE_FILE_RELOCS_STRIPPED 0x0001

// File is executable (i.e. no unresolved external references).

#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002

// Line nunbers stripped from file.

#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004

// Local symbols stripped from file.

#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008

// Agressively trim working set

#define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010

// App can handle >2gb addresses

#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020

// Bytes of machine word are reversed.

#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080

// 32 bit word machine.

#define IMAGE_FILE_32BIT_MACHINE 0x0100

// Debugging info stripped from file in .DBG file

#define IMAGE_FILE_DEBUG_STRIPPED 0x0200

// If Image is on removable media, copy and run from the swap file.

#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400

// If Image is on Net, copy and run from the swap file.

#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800

// System File.

#define IMAGE_FILE_SYSTEM 0x1000

// File is a DLL.

#define IMAGE_FILE_DLL 0x2000

// File should only be run on a UP machine

#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000

// Bytes of machine word are reversed.

#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000

我们常见的意义如下。

 0x0001:该文件中没有重定位。

 0x0002:文件是一个可执行的映像(即不是一个OBJ或LIB)。

 0x2000:文件是一个动态连接库,不是一个程序。

http://www.jsqmd.com/news/424946/

相关文章:

  • 第3章 Windows运行机理-3.4 线程的机制(6)
  • 初中语文文言文辅导哪家强?不花冤枉钱,家长直接抄作业 - 品牌测评鉴赏家
  • 矩阵加速
  • println() 与print() 的区别
  • 初中语文网课大揭秘!这几家平台让孩子成绩狂飙 - 品牌测评鉴赏家
  • 小型开发社区:娱乐游戏之后的下一步社交形态
  • 中国个人开发者社区构建的真实阻力与路径选择
  • 中考文言文翻译总丢分?5家宝藏线上机构实测推荐 - 品牌测评鉴赏家
  • 8.ts_内置对象代码雨
  • 开发者社区的“丧尸式“构建策略:从理论到实践
  • 亲测不踩雷!4款初中语文神仙APP,从基础到中考全覆盖(家长必存) - 品牌测评鉴赏家
  • 中考文言文翻译总丢分?5家宝藏线上机构实测推荐,适配不同基础初中生 - 品牌测评鉴赏家
  • PyTorch神经网络组件之Conv2d
  • 中考阅读理解丢分严重?3家靠谱线上机构实测推荐,帮娃高效提分不踩坑 - 品牌测评鉴赏家
  • 看2026上海家装,原木风装修厂家推荐排行来啦,轻奢大平层设计/新中式软装设计/原木风精装房设计,上海家装厂家有哪些 - 品牌推荐师
  • 2026初中语文阅读理解线上辅导大揭秘,选对机构成绩飙升! - 品牌测评鉴赏家
  • 这次终于选对AI论文工具,千笔·专业学术智能体 VS 云笔AI,专科生专属!
  • Task04:字符串
  • 261_尚硅谷_单元测试综合案例
  • 基于YALMIP和CPLEX的Matlab程序实现配电网故障重构模型的二阶锥优化方法,通用性高...
  • 用while循环输出1~1000之间能被5整除的数,并且每行输出3个
  • 实测才敢推!MBA专属降AI神器 —— 千笔·专业降AI率智能体
  • 初中语文提分秘籍!揭秘3家极速提分线上机构 - 品牌测评鉴赏家
  • 干货来了:千笔·降AI率助手,遥遥领先的降AI率工具
  • 2026年灰铁厂家推荐,精密圆棒生产与质量检测认证 - 品牌鉴赏师
  • 小学语文阅读理解辅导哪个平台好?实测5大热门平台,家长闭眼冲不踩坑 - 品牌测评鉴赏家
  • Copilot 模式和 Agent 模式的区别是什么?
  • 论文写不动?千笔ai写作,人气爆表的AI论文网站
  • std::stringstream 超详细讲解(C++ 字符串流)
  • 【ISAC】6G低空经济新突破!协作式ISAC技术实现无人机精准感知与参数估计【附MATLAB代码】