精选文章 PE格式详细讲解2 - 系统篇02

PE格式详细讲解2 - 系统篇02

作者:donghua4539 时间: 2021-02-07 01:49:56
donghua4539 2021-02-07 01:49:56
【摘要】原作者:小甲鱼 
  (注:最左边是文件头的偏移量。) 
IMAGE_DOS_HEADER STRUCT 
{ 
+0h WORD e_magic // Magic DOS signature MZ(4Dh 5Ah) DOS可执行文件标记 
+2h WORD e_cblp // Bytes on last page of file +4h WORD e_cp // Pages in file...

原作者:小甲鱼

(注:最左边是文件头的偏移量。) 
IMAGE_DOS_HEADER STRUCT 
{ 
+0h WORD e_magic // Magic DOS signature MZ(4Dh 5Ah) DOS可执行文件标记 
+2h WORD e_cblp // Bytes on last page of file +4h WORD e_cp // Pages in file +6h WORD e_crlc // Relocations +8h WORD e_cparhdr // Size of header in paragraphs +0ah WORD e_minalloc // Minimun extra paragraphs needs +0ch WORD e_maxalloc // Maximun extra paragraphs needs +0eh WORD e_ss // intial(relative)SS value DOS代码的初始化堆栈SS 
+10h WORD e_sp // intial SP value DOS代码的初始化堆栈指针SP 
+12h WORD e_csum // Checksum 
+14h WORD e_ip //   intial IP value DOS代码的初始化指令入口[指针IP] 
+16h WORD e_cs // intial(relative)CS value DOS代码的初始堆栈入口 
+18h WORD e_lfarlc // File Address of relocation table 
+1ah WORD e_ovno //   Overlay number 
+1ch WORD e_res[4] //   Reserved words 
+24h WORD e_oemid //   OEM identifier(for e_oeminfo) 
+26h WORD e_oeminfo //   OEM information;e_oemid specific  
+29h WORD e_res2[10] //   Reserved words 
+3ch DWORD e_lfanew //   Offset to start of PE header 指向PE文件头 
} IMAGE_DOS_HEADER ENDS

PE Header 是PE相关结构NT映像头(IMAGE_NT_HEADER)的简称,里边包含着许多PE装载器用到的重要字段。下边小甲鱼将为大家详细讲解哈~

首先是IMAGE_NT_HEADERS 结构的定义:(啥?结构不会,先看看小甲鱼童鞋的《零基础入门学习C语言》关于结构方面的章节吧~)

IMAGE_NT_HEADERS STRUCT 
{
+0h DWORDSignature  
+4h IMAGE_FILE_HEADER FileHeader 
+18h IMAGE_OPTIONAL_HEADER32OptionalHeader } IMAGE_NT_HEADERS ENDS

Signature字段:

在一个有效的 PE 文件里,Signature 字段被设置为00004550h, ASCII 码字符是“PE00”。标志这 PE 文件头的开始。

“PE00” 字符串是 PE 文件头的开始,DOS 头部的 e_lfanew 字段正是指向这里。

如下图所示:

PE格式详细讲解2 - 系统篇021

 

IMAGE_FILE_HEADER 结构

typedef struct _IMAGE_FILE_HEADER 
{
+04h WORD Machine; // 运行平台
+06h WORD NumberOfSections; // 文件的区块数目
+08h DWORD TimeDateStamp; // 文件创建日期和时间
+0Ch DWORD PointerToSymbolTable; // 指向符号表(主要用于调试)
+10h DWORD NumberOfSymbols; // 符号表中符号个数(同上)
+14h WORD SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER32 结构大小
+16h WORD Characteristics; // 文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

该结构如下图所示:

PE格式详细讲解2 - 系统篇022

 

下边,小甲鱼童鞋为大家详细解释各个成员的含义和用法:

(1)Machine:可执行文件的目标CPU类型。

ValueMeaning
IMAGE_FILE_MACHINE_I386 0x014c
x86
IMAGE_FILE_MACHINE_IA64   0×0200
Intel Itanium
IMAGE_FILE_MACHINE_AMD64 0×8664
x64

 

 

 

 

 

 

(2)NumberOfSection: 区块的数目。(注:区块表是紧跟在 IMAGE_NT_HEADERS 后边的)

(3)TimeDataStamp: 表明文件是何时被创建的。

这个值是自1970年1月1日以来用格林威治时间(GMT)计算的秒数,这个值是比文件系统(FILESYSTEM)的日期时间更加精确的指示器。如

何将这个值翻译请看:传送门

提示:VC的话可以用_ctime 函数或者 gmtime 函数。

(4)PointerToSymbolTable: COFF 符号表的文件偏移位置,现在基本没用了。

(5)NumberOfSymbols: 如果有COFF 符号表,它代表其中的符号数目,COFF符号是一个大小固定的结构,如果想找到COFF 符号表的结束位置,则需要这个变量。

(6)SizeOfOptionalHeader: 紧跟着IMAGE_FILE_HEADER 后边的数据结构(IMAGE_OPTIONAL_HEADER)的大小。(对于32位PE文件,这个值通常是00E0h;对于64位PE32+文件,这个值是00F0h )。

(7)Characteristics: 文件属性,有选择的通过几个值可以运算得到。( 这些标志的有效值是定义于 winnt.h 内的 IMAGE_FILE_** 的值,具体含义见下表。

普通的EXE文件这个字段的值一般是 0100h,DLL文件这个字段的值一般是 210Eh。)小甲鱼温馨提示:多种属性可以通过 “或运算” 使得同时拥有!

 

The characteristics of the image. This member can be one or more of the following values.

 

ValueMeaning
IMAGE_FILE_RELOCS_STRIPPED 0×0001
Relocation information was stripped from the file. The file must be loaded at its preferredbase address. If the base address is notavailable, the loader reports an error.
IMAGE_FILE_EXECUTABLE_IMAGE 0×0002
The file is executable (there are no unresolved external references).
IMAGE_FILE_LINE_NUMS_STRIPPED 0×0004
COFF line numbers were stripped from the file.
IMAGE_FILE_LOCAL_SYMS_STRIPPED 0×0008
COFF symbol table entries were stripped from file.
IMAGE_FILE_AGGRESIVE_WS_TRIM 0×0010
Aggressively trim the working set. This value is obsolete as of Windows 2000.
IMAGE_FILE_LARGE_ADDRESS_AWARE 0×0020
The application can handle addresses larger than 2 GB.
IMAGE_FILE_BYTES_REVERSED_LO 0×0080
The bytes of the word are reversed. This flag is obsolete.
IMAGE_FILE_32BIT_MACHINE 0×0100
The computer supports 32-bit words.
IMAGE_FILE_DEBUG_STRIPPED 0×0200
Debugging information was removed and stored separately in another file.
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0×0400
If the image is on removable media, copy it toand run it from the swap file.
IMAGE_FILE_NET_RUN_FROM_SWAP 0×0800
If the image is on the network, copy it to and run it from the swap file.
IMAGE_FILE_SYSTEM 0×1000
The image is a system file.
IMAGE_FILE_DLL 0×2000
The image is a DLL file. While it is an executable file, it cannot be run directly.
IMAGE_FILE_UP_SYSTEM_ONLY 0×4000
The file should be run only on a uniprocessor computer.
IMAGE_FILE_BYTES_REVERSED_HI 0×8000

 来源: <http://blog.fishc.com/1551.html/2>

转载于:https://www.cnblogs.com/Lthis/p/4197318.html

勿删,copyright占位
您找到想要的结果了吗?
PE格式详细讲解2 - 系统篇02
提交成功!非常感谢您的反馈,我们会继续努力做到更好
分享文章到微博
分享文章到朋友圈

上一篇:API HOOK

下一篇:PE格式详细讲解3 - 系统篇03

您可能感兴趣

  • win10下CUDA和CUDNN的安装(超详细)!亲测有效!

      CUDA11安装配置 CUDA8的安装包可直接从NVIDIA官网下载。根据相应的系统选项,我选择的是cuda_8.0.61_win10.exe(大小为1.3G),安装的时候建议选择 自定义 而不是“精简”(从下面的英文解释可以看出,其实这里的精简写成完整应该更贴切,他会安装所有组件并覆盖现有驱动,然而我并不想安装全家桶,何况我的官方显卡驱动比...

  • git使用注意解疑总结篇(Git教程 By 廖雪峰学习)

    git使用总结整理 笔者是在Windows下完成的git学习安装: 使用Windows的要特别注意: 注意1:千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一 个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可...

  • 树讲解(6)——让我们异或吧

    洛谷——P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见。比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能够成为情侣 好了,现在我们来制造和处理一些复杂的情况。比如我们将给出一颗树,它很高兴自己有N个...

  • VirtualBox内Linux系统与Windows共享文件夹

    在日常工作或学习中我们经常需要在一台电脑上同时使用Windows和Linux(这里以Ubuntu为例)两个系统,我们通常的做法有两种: 一种安装双系统(双系统的安装方法经验里已经有很多,大家可以去参照) 另一种更为普遍的是在Windows本机用虚拟机安装Linux系统,然而Windows本机与虚拟机内Linux系统的文件该如何交换呢,其实...

  • 交换篇(6.0) 01. 基本配置 ❀ 飞塔交换机 (FortiSwitch)

            【简介】FortiSwitch是飞塔的产换机产品,它最大的优点是可以由防火墙统一管理,在一个窗口下就可以用图形介面管理整个局域网络的FortiSwitch交换机。   FortiSwitch 交换机与 FortiGate 防火墙的连接         通常FortiSwitch交换机会预留几个接口与其它交换机或防火墙连接。    ...

  • 数据挖掘读书笔记-典型的数据挖掘系统

    基于数据挖掘是从存放在数据库,数据仓库或其他信息库中的大量数据中发现有趣知识的过程这样一种观点,典型的数据挖掘系统具有以下主要成分: 用户界面 模式评估 知识库 数据挖掘引擎 数据库或者数据仓库服务器 模式评估模块通常使用兴趣度度量,并与数据挖掘模块交互,以便将搜索聚焦在有趣模式上。 知识库这是领域知识,用于指导搜索或者评估结果...

  • Java 批量将utf-8有bom格式的java文件转成 utf-8无bom 格式 工具

    Java 批量将utf-8有bom格式的java文件转成 utf-8无bom 格式 工具 import java.io.*; import java.util.ArrayList; import java.util....

  • 解决thinkPHP3.2.3使用Smarty模板后无法使用系统常量问题

    https://blog.csdn.net/u014520745/article/details/52029411     在ThinkPHP/Library/Think/View.class.php 输出模板内容之前,加上字符替换行为,即在:第130附近的fetch() 方法中修改: 修改前: // 获取并清空缓存 $con...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。
PE格式详细讲解2 - 系统篇02介绍:华为云为您免费提供PE格式详细讲解2 - 系统篇02在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多PE格式详细讲解2 - 系统篇02的相关内容。| 移动地址: PE格式详细讲解2 - 系统篇02 | 写博客