二进制安全-PE文件入门
PE文件入门
PE文件基础
Q.为什么要学习PE文件?有什么用?
A.在逆向中,PE文件格式的学习是必不可少的,无论是要做加壳项目还是脱壳等等都需要对PE文件有一定的熟悉,在大部分的病毒攻击中,都对PE文件做了一定的修改,还有就是在Windows内核开发的过程中驱动程序与系统核心进行交互的时候,PE文件是驱动程序的基本格式,理解PE文件在内核开发中的帮助更大。
前置知识
在讲解PE文件之前,有必要讲一下C/C++中的结构体(struct)和联合体(union)
结构体和联合体的区别
1.内存分配方式不同:
- 结构体中的每个成员都有自己的内存空间,所有成员会同时存在,结构体的总大小等于所有成员的大小之和(加上可能的内存对齐)。
- 联合体中的所有成员共享同一块内存,联合体的总大小等于其最大成员的大小,任何时刻只能存储一个成员的值。
2.存储多个值 vs 存储一个值:
- 结构体可以存储所有成员的值,因为每个成员都有独立的内存空间。
- 联合体在一个时刻只能存储一个成员的值,因为所有成员共享同一块内存,存储一个成员的值会覆盖其他成员的值。
示例说明:
1 |
|
总结:结构体的每个成员变量都是 独立的,而联合体虽然定义了1或多个成员变量,但他们都同属于一个,在给其中一个成员变量赋值的时候会覆盖另一个,所以取值的时候通常只需要取其中的一个作为参考。
PE文件
PE文件是什么?
PE(Portable Executable)文件是Windows操作系统下的可移植可执行文件格式,它用于描述和组织可执行程序、动态链接库(DLL)以及系统驱动程序等文件。PE文件是Windows操作系统的标准二进制格式,用于在内存中加载和执行程序。
PE文件的特点与结构
1.通用性
PE格式在不同的Windows平台(如32位和64位)上是通用的,它可以支持多种CPU架构,如x86、x64和ARM等
2.典型的PE文件类型
.exe 文件:可执行文件,用于启动应用程序(通常是应用层)。
.dll 文件:动态链接库,提供程序调用的共享代码库。
.sys 文件:设备驱动程序文件(内核层)。
PE文件的组成
解释
我们都知道在计算机中所有数据都是二进制的形式存储的,但是二进制表示起来太大了太复杂了, 所有就有了十六进制与二进制的关系,也就延伸出了十六进制编译器,通过十六进制编译器我们可以清楚的看到以PE文件在计算机上的存储的数据。
一个完整的PE文件通常有以下组成:
1.DOS头(DOS Header):包含兼容MS-DOS的程序头,用于在旧版本的Windows或MS-DOS环境下显示“此程序无法在DOS模式下运行”的信息.
2.PE头(PE Header):描述PE文件的主要结构和信息,比如目标机器、节表信息、入口点等.
3.节表(Section Table):描述不同的节(Section),每个节存储不同类型的数据,如代码、数据、资源等。常见的节包括:
3.1:.text节:包含可执行代码.
3.2:.data节:包含已初始化的全局或静态变量.
3.3:.bss节:包含未初始化的全局或静态变量.
3.4:.rdata节:包含只读数据,比如字符串常量和导入表.
节表只存储该节的基本信息,例如:节的文件偏移,内存偏移,节的大小。
信息
接下来我使用010 Editor解释PE文件:
这是PE文件的一些基本信息,这些信息都有对应的名称和他们的作用。接下来一一解释:
这个部分称为PE-DOS头,包含兼容MS-DOS的程序头,用于在旧版本的Windows或MS-DOS环境下显示“此程序无法在DOS模式下运行”的信息,
DOS头的信息使用最多的就是e_magic魔数,前两个字节就是e_magic,MZ是MS-DOS原架构师Mark Zbikowski姓名的首字母缩写还有一个使用较多的就是e_lfanew通常使用这个字段的值定位到PE头。
这部数据称为DOS存根程序 或 DOS Stub,主要作用就是兼容旧的MS—DOS系统,过渡和占位,这对PE文件格式的解析和加载至关重要。
这部分数据可称为是NT头,我们查看PE文件格式文档找到NT头对该部分数据的解释
前4个字节是PE头的签名,通常是50 45 00 00翻译过来就是PE,这里通常作为判断是否是PE文件的方法之一。
接着我们看到下一个字节是是一个_IMAGE_FILE_HEADER结构体,名称是FileHeader标准PE头结构。
一共有20个字节,对应着各个数据。
在下一个字节是_IMAGE_OPTIONAL_HEADER结构体,名称是OptionalHeader可选PE头结构