pe文件中的3处Characteristics

2024-01-01 14:38
文章标签 pe characteristics

本文主要是介绍pe文件中的3处Characteristics,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先:pe文件结构

1、DOS头,对应结构体IMAGE_DOS_HEADER。

2、DOS存根,大小不定,由编译器决定,没有对应的结构体。

3、NT头,对应结构体IMAGE_NT_HEADER,包括3部分定义如下:

typedef struct _IMAGE_NT_HEADERS {DWORD                 Signature;IMAGE_FILE_HEADER     FileHeader;IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;

4、节区头,对应结构体IMAGE_SECTION_HEADER,有多少个节区就有多少个连续的IMAGE_SECTION_HEADER结构体。

5、各个节区。

 

3处Characteristics分别位于IMAGE_FILE_HEADER、IMAGE_OPTIONAL_HEADER、IMAGE_SECTION_HEADER结构体中

1、IMAGE_FILE_HEADER结构体定义:

typedef struct _IMAGE_FILE_HEADER {WORD  Machine;                   // 定义该pe文件运行在那种cpu上WORD  NumberOfSections;          // 定义节区头有多少个连续IMAGE_SECTION_HEADER结构体     DWORD TimeDateStamp;             // 编译器生成该pe文件的时间  DWORD PointerToSymbolTable;DWORD NumberOfSymbols;WORD  SizeOfOptionalHeader;      // IMAGE_OPTIONAL_HEADER32或者IMAGE_OPTIONAL_HEADER64大小,常用来定位节区头位置WORD  Characteristics;           // 用于表示该pe文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

在WinNT.h中有定义(只列举部分):

#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable
#define IMAGE_FILE_SYSTEM                    0x1000  // System File.
#define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.// 处理机的高位字节是相反的

有样本中专门检测0x8000,如果没有就申请可读写内存空间,有就申请可执行读写的内存空间,如图:

2、IMAGE_OPTIONAL_HEADER结构体定义

typedef struct _IMAGE_OPTIONAL_HEADER {WORD                 Magic;                         // 32位pe文件为0x010B,64位pe文件为0x020BBYTE                 MajorLinkerVersion;BYTE                 MinorLinkerVersion;DWORD                SizeOfCode;DWORD                SizeOfInitializedData;DWORD                SizeOfUninitializedData;DWORD                AddressOfEntryPoint;          // 该pe文件入口点RVADWORD                BaseOfCode;DWORD                BaseOfData;DWORD                ImageBase;                    // 编译器生成的初始镜像加载地址DWORD                SectionAlignment;DWORD                FileAlignment;WORD                 MajorOperatingSystemVersion;WORD                 MinorOperatingSystemVersion;WORD                 MajorImageVersion;WORD                 MinorImageVersion;WORD                 MajorSubsystemVersion;WORD                 MinorSubsystemVersion;DWORD                Win32VersionValue;DWORD                SizeOfImage;                  // 该pe文件对应镜像在内存中总大小,pe加载器根据此处值决定申请连续内存空间大小 DWORD                SizeOfHeaders;                // 该pe文件所有头的总长度,dos头+dos存根+NT头+节区表头,用来把"头"从文件到拷贝到镜像长度DWORD                CheckSum;                     // 该pe文件校验和 WORD                 Subsystem;WORD                 DllCharacteristics;           // ?????????????  DWORD                SizeOfStackReserve;DWORD                SizeOfStackCommit;DWORD                SizeOfHeapReserve;DWORD                SizeOfHeapCommit;DWORD                LoaderFlags;DWORD                NumberOfRvaAndSizes;         // 指明DataDirectory数组元素个数,一直是0x00000010IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

这里DllCharacteristics,好多书上翻译成DLL何时被调用,这个理解感觉…………

找到宏定义:

#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040     // DLL can move.

用od调试样本时发现,这里有0x0040标志时,每次重新调试,镜像基址都会变化(ASLR),把40修改成00,即使有重定位节区,也不会重定位行为,od调试就方便了许多。

DataDirectory数组:

#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data
#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   // Import Address Table
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor// 最后一个保留,未使用

3、IMAGE_SECTION_HEADER结构体定义:

typedef struct _IMAGE_SECTION_HEADER {BYTE  Name[IMAGE_SIZEOF_SHORT_NAME];  // 节区名,最大长度8个字节union {DWORD PhysicalAddress;DWORD VirtualSize;            // 该节区在镜像(内存)中的大小} Misc;DWORD VirtualAddress;           // 该节区在镜像(内存)中的RVADWORD SizeOfRawData;            // 该节区在文件中的大小DWORD PointerToRawData;         // 该节区在文件中的偏移DWORD PointerToRelocations;DWORD PointerToLinenumbers;WORD  NumberOfRelocations;WORD  NumberOfLinenumbers;DWORD Characteristics;          // 该节区属性
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

根据在文件和镜像中的大小和偏移完成从文件到镜像的加载,根据在镜像中位置和大小结合Characteristics值,使用VirtualProtect修改该节区在镜像中的内存属性。

注意:pe文件的节区是多个。

这篇关于pe文件中的3处Characteristics的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/559576

相关文章

Codewarrior中利用PE multilink下载程序debug时不能连接问题

现象:PC连接PE multilink然后连接单片机,mutilink上的与单片机的连接接口是正确的,但点击codewarrior中debug按钮,则会出现连接失败,如下图: 电脑端口也能识别 但就是不能连接。 解决方案:如下图点击[FAQ#29]然后进入, 按照这个界面给的解决方案去解决即可,重装一下驱动(此页面下面会给出相应的BDM驱动)

PE文件结构详解(非常详细)

最近在参考OpenShell为任务栏设置图片背景时,发现里面使用了IAT Hook,这一块没有接触过,去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解,索性将PE文件结构的资料找出来,系统学习一下。 PE文件结构 Portable Executable (PE),可移植的可执行文件。在Windows平台下,所有的可执行文件(包括.exe, .dll, .sys, .ocx,

Windows编程系列:PE文件结构

Windows编程系列:PE文件结构 PE文件结构 Portable Executable (PE),可移植的可执行文件。在Windows平台下,所有的可执行文件(包括.exe, .dll, .sys, .ocx, .com等)均使用PE文件结构。这些使用了PE文件结构的可执行文件也称为PE文件。 PE结构包含的结构体有DOS头,PE标识 、文件头、可选头、目录头、目录结构、节表等 整体结构

EEMD-MPE-KPCA-BiLSTM、EEMD-MPE-BiLSTM、EEMD-PE-BiLSTM故障识别、诊断(Matlab)

EEMD-MPE-KPCA-BiLSTM(集合经验分解-多尺度排列熵-核主元分析-双向长短期网络)故障识别、诊断(Matlab) 目录 EEMD-MPE-KPCA-BiLSTM(集合经验分解-多尺度排列熵-核主元分析-双向长短期网络)故障识别、诊断(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-BiLSTM(集合经验模

全网优质PE工具箱都在这,哪款是你的菜

PE工具箱是我们安装电脑以及系统维护常用工具,小编为大家整理了全网最全的优质PE工具箱,看看哪款是你在用的?你觉得哪个比较好呢? 1.微PE工具箱 微PE工具箱是一款轻量级、免安装的Windows PE救急维护工具,它能够在Windows操作系统无法启动时,通过U盘或其他介质进行启动,从而达到修复、维护和安装系统的目的。微PE工具箱的特点在于其小巧、高效,并且支持多种启动方式,包括从U盘、

问题1,PE文件转到内存中出现解析PE不正确的问题

1,使用fopen(FileName, “r”) r的方式读取文件到内存,此时就可能存在问题了,r以只读方式,有时候不表示字符的有可能就不读了,那么内存中就不会是完整的原始文件。所以此时要采用rb,二进制读取的方式。 bool ReadFileToMem(char* FileName, char**buf) { FILE* f; f = fopen(FileName, “rb”); if

大白菜PE系统进入时一直 ACPI_BIOS_ERROR

安装系统PE不支持,主板不兼容,换个WIN10的PE就解决了,跟之前部分电脑需要WIN8的PE同理 WIN10PE教程 WIN8PE教程

11. 利用MS为Lammps ReaxFF建模(PE/聚乙烯)基础-2

来源: “码农不会写诗”公众号 链接:利用MS为Lammps ReaxFF建模(PE/聚乙烯)基础-2 文章目录 01 msi2lmp工具简介1. 编译生成msi2lmp可执行文件2. 使用方式 02 赋予模型CVFF力场03 导出car/mdf文件04 生成data文件05 data文件进一步处理 文接上篇   上篇利用Material Studio(MS)完成了

设计师应急设计PE (19043)windows准系统 RAMOS/PE 直接 Administrator登录

设计师应急设计PE (19043)windows准系统 RAMOS/PE 直接 Administrator登录 集成组件: MSI组件 VBS组件 DISM组件 、手机MTP、声网视/扫描仪/打印机驱动、VC++8.9.10运行库、7Z压缩、WIMTOOL工具、IMDISK虚拟磁盘、局域网共享、远程终端服务、VM拖拽、Ventoy启动。 支持功能: 聊天、影音、娱乐、下载、分享、直播、录屏、办公

VMware Workstation虚拟机进入U盘PE系统

注意事项 VMware Workstation虚拟机版本不能高于16.1.2版本!!! 本实验使用的版本如下 实际操作 在已安装好的虚拟机处右键,点击设置。虚拟机安装win10教程请参考VMware Workstation安装win10操作系统-CSDN博客 在弹出的窗口点击 添加 选择硬盘 下一步 这里根据需要选择一种磁盘,我这里选择的默认,点击下一步 这里选