PE1-什么是pe

向右看齐 2022-05-10 11:08 1115阅读 0赞

PE是什么?

PE即 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff 文件格式。“portable executable”(可移植的执行体)意味着此文件格式是跨win32平台的 : 即使Windows运行在非Intel的CPU上,任何win32平台的PE装载器都能识别和使用该文件格式。当然,移植到不同的CPU上PE执行体必然得有一些改变。所有 win32执行体 (除了VxD和16位的Dll)都使用PE文件格式,包括NT的内核模式驱动程序(kernel mode drivers)。研究PE文件格式给了我们洞悉Windows结构的良机

通常一个操作系统或者用户软件都是用二进制组成的, 有一种结构来约定这些二进制代表什么意义
在这里插入图片描述

当我们随便使用一个16进制编辑工具打开一个软件的时候,展示给我们的就是一个PE结构

在这里插入图片描述
将要学习的PE结构


一、PE为什么要分节?

  1. 1、节省硬盘空间.(这个不是决定的,由编译器决定)

硬盘通常都是1TB,2TB等等,而内存大的也就16G,32G。为什么还要节省硬盘空间呢?
在早起的编译器设置里,硬盘是非常昂贵的。通常移动存储设备也非常小(3.5寸软盘等等),为了方便携带,不占用空间,选择了对pe结构进行压缩,在现代编译器里,通常使用内存对齐和硬盘对齐一样为1000h

在这里插入图片描述

  1. 2、一个应用程序多开

当我们多开的时候,使用了共同的模块或者数据,如果不分节,那么会为每一个进程创建一个完整的pe结构,内存开销会变得无比巨大!" class="reference-link">在这里插入图片描述 当我们多开的时候,使用了共同的模块或者数据,如果不分节,那么会为每一个进程创建一个完整的pe结构,内存开销会变得无比巨大!



尝试解析一个PE结构的时候,我们可以直接在16进制编辑器里进行查看

学习PE可以做什么?

iat hook,导入表注入等等,pe结构是逆向的重中之重



PE头字段
1、DOC头:

WORD e_magic * “MZ标记” 用于判断是否为可执行文件.
DWORD e_lfanew; *PE头相对于文件的偏移,用于定位PE文件

2、标准PE头:

WORD Machine; *程序运行的CPU型号:0x0 任何处理器 / 0x14C 386及后续处理器
WORD NumberOfSections; *文件中存在的节的总数, 如果要新增节或者合并节 就要修改这个值.
DWORD TimeDateStamp; *时间戳:文件的创建时间(和操作系统的创建时间无关),编译器填写的.
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader; *可选PE头的大小,32位PE文件默认E0h 64位PE文件默认为F0h 大小可以自定义.
WORD Characteristics; *每个位有不同的含义,可执行文件值为10F 即0 1 2 3 8位置1

3、可选PE头:

WORD Magic; *说明文件类型:10B 32位下的PE文件 20B 64位下的PE文件
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode; *所有代码节的和,必须是FileAlignment的整数倍 编译器填的 没用
DWORD SizeOfInitializedData; *已初始化数据大小的和, 必须是FileAlignment的整数倍 编译器填的 没用
DWORD SizeOfUninitializedData; *未初始化数据大小的和, 必须是FileAlignment的整数倍 编译器填的 没用
DWORD AddressOfEntryPoint; *程序入口
DWORD 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文件的映射的尺寸,可以比实际的值大,但必须是SectionAlignment的整数倍
DWORD SizeOfHeaders; *所有头 + 节表按照文件对齐后的大小,否则加载会出错
DWORD CheckSum; *校验和,一些系统文件有要求.用来判断文件是否被修改.
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve; *初始化时保留的堆栈大小
DWORD SizeOfStackCommit; *初始化时实际提交的大小
DWORD SizeOfHeapReserve; *初始化时保留的堆大小
DWORD SizeOfHeapCommit; *初始化时实践提交的大小
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes; *目录项数目

  1. //DOS头
  2. typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
  3. WORD e_magic; // Magic number
  4. WORD e_cblp; // Bytes on last page of file
  5. WORD e_cp; // Pages in file
  6. WORD e_crlc; // Relocations
  7. WORD e_cparhdr; // Size of header in paragraphs
  8. WORD e_minalloc; // Minimum extra paragraphs needed
  9. WORD e_maxalloc; // Maximum extra paragraphs needed
  10. WORD e_ss; // Initial (relative) SS value
  11. WORD e_sp; // Initial SP value
  12. WORD e_csum; // Checksum
  13. WORD e_ip; // Initial IP value
  14. WORD e_cs; // Initial (relative) CS value
  15. WORD e_lfarlc; // File address of relocation table
  16. WORD e_ovno; // Overlay number
  17. WORD e_res[4]; // Reserved words
  18. WORD e_oemid; // OEM identifier (for e_oeminfo)
  19. WORD e_oeminfo; // OEM information; e_oemid specific
  20. WORD e_res2[10]; // Reserved words
  21. LONG e_lfanew; // File address of new exe header
  22. } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
  23. //32位NT头
  24. typedef struct _IMAGE_NT_HEADERS {
  25. DWORD Signature;
  26. IMAGE_FILE_HEADER FileHeader;
  27. IMAGE_OPTIONAL_HEADER32 OptionalHeader;
  28. } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
  29. //FILE头
  30. typedef struct _IMAGE_FILE_HEADER {
  31. WORD Machine;
  32. WORD NumberOfSections;
  33. DWORD TimeDateStamp;
  34. DWORD PointerToSymbolTable;
  35. DWORD NumberOfSymbols;
  36. WORD SizeOfOptionalHeader;
  37. WORD Characteristics;
  38. } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
  39. //32位NT头
  40. typedef struct _IMAGE_OPTIONAL_HEADER {
  41. //
  42. // Standard fields.
  43. //
  44. WORD Magic;
  45. BYTE MajorLinkerVersion;
  46. BYTE MinorLinkerVersion;
  47. DWORD SizeOfCode;
  48. DWORD SizeOfInitializedData;
  49. DWORD SizeOfUninitializedData;
  50. DWORD AddressOfEntryPoint;
  51. DWORD BaseOfCode;
  52. DWORD BaseOfData;
  53. //
  54. // NT additional fields.
  55. //
  56. DWORD ImageBase;
  57. DWORD SectionAlignment;
  58. DWORD FileAlignment;
  59. WORD MajorOperatingSystemVersion;
  60. WORD MinorOperatingSystemVersion;
  61. WORD MajorImageVersion;
  62. WORD MinorImageVersion;
  63. WORD MajorSubsystemVersion;
  64. WORD MinorSubsystemVersion;
  65. DWORD Win32VersionValue;
  66. DWORD SizeOfImage;
  67. DWORD SizeOfHeaders;
  68. DWORD CheckSum;
  69. WORD Subsystem;
  70. WORD DllCharacteristics;
  71. DWORD SizeOfStackReserve;
  72. DWORD SizeOfStackCommit;
  73. DWORD SizeOfHeapReserve;
  74. DWORD SizeOfHeapCommit;
  75. DWORD LoaderFlags;
  76. DWORD NumberOfRvaAndSizes;
  77. IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  78. } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

发表评论

表情:
评论列表 (有 0 条评论,1115人围观)

还没有评论,来说两句吧...

相关阅读

    相关 开发 PE

    PE (Portable Executable) 是 Windows 操作系统中的可执行文件格式。它用于存储可在 Windows 中运行的应用程序。 要开发 PE 文件,你需

    相关 PE文件

    PE文件全称:Portable Executable,可移植可执行文件 常见PE文件的后缀名:exe、dll PE文件吧可执行文件分成若干个数据节(section):.te

    相关 PE1-什么pe

    PE是什么? PE即 Portable Executable(可移植的执行体)。它是 Win32环境自身所带的执行体文件格式。它的一些特性继承自 Unix的 Coff 文