PE 文件格式简介

  • PE(Portable Executable)格式:这是 Windows 系统下常用的可执行文件格式。相比于 Linux 系统下的 ELF 格式,PE 格式在 Windows 平台上具有广泛应用。

  • 结构概览

    • IMAGE_DOS_HEADER:文件最开始的 DOS 头(兼容16位),其中包含了一个跳转指令以及一个指向 NT 头的偏移量(e_lfanew)。

    • DOS Stub:一个 DOS 程序,当在 DOS 环境下执行时显示提示信息(通常提示“此程序只能在 Windows NT/2000/XP 等系统上运行”)。

    • IMAGE_NT_HEADERS

      :紧接 DOS Stub 后面的 NT 头,其中包含:

      • Signature:魔数(通常是 “PE\0\0”)。
      • IMAGE_FILE_HEADER:描述文件信息,如目标机器类型、节数量等。
      • IMAGE_OPTIONAL_HEADER:描述程序加载信息(例如入口点、程序内存布局等),以及数据目录数组,用于指向如导入表、导出表、资源表等重要数据结构。
    • IMAGE_SECTION_HEADER:紧随 NT 头之后的节表,每个节描述一个文件内的数据区块(代码区、数据区、资源区等)。

    • 数据部分与附加数据:文件的实际数据,以及可能存在的用户自定义数据(如加密数据、病毒代码、反调试技术等)。

代码说明与作用

  • IMAGE_DOS_HEADER:DOS 头的大小,用于判断 DOS 可执行文件部分。
  • IMAGE_NT_HEADERS32:32位 NT 头的大小,包含文件头、选项头及数据目录等。
  • IMAGE_SECTION_HEADER:节表中单个节描述的大小。

为AA的部分都是与exe文件能否正常运行无关,可以随意修改,

image-20250207230536159

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<stdio.h>
#include<windows.h>
/*
ELF
DOS可执行文件格式(分段)
32位可执行文件格式(分区):PE(Portable Executable)可移植执行格式
PE:
IMAGE_DOS_HEADER e_lfanew(OD)
DOS_STUB[176]
IMAGE_NT_HEADERS NT头
DWORD Signature; //magic number
IMAGE_FILE_HEADER FileHeader; //文件头 描述信息
IMAGE_OPTIONAL_HEADER32 OptionalHeader; //选项头 程序加载的信息
//数据目录(表)
IMAGE_DATA_DIRECTORY[]
//节表 描述区的映射
IMAGE_SECTION_HEADER[]
数据
......
附加数据(用户自定义数据)
*/
//反调试,病毒,加密,解密
int main()
{
//兼容16位
printf("IMAGE_DOS_HEADER:%d\n", sizeof(IMAGE_DOS_HEADER));
printf("IMAGE_NT_HEADERS32:%d\n",sizeof(IMAGE_NT_HEADERS32));//printf("IMAGE_NT_HEADERS64:%d",sizeof(IMAGE_NT_HEADERS64));
printf("IMAGE_SECTION_HEADER:%d\n", sizeof(IMAGE_SECTION_HEADER));
return 0;
}

运行结果

image-20250207000114435