认识PE文件
什么是PE文件
PE(Portable Executable)文件是Windows操作系统上的一种可执行文件格式。它包含了可执行代码、数据、资源和元数据,以及其他必要的信息,例如程序入口点、导入表、导出表和重定位表等等。PE文件是Windows操作系统中所有可执行文件的标准格式,包括应用程序、动态链接库(DLL)、驱动程序等等
可执行文件在不同的操作系统平台有不同的结构
- Windows平台:PE(Portable Executable)
- Linux平台:ELF(Executable and Linking Format)
常见的PE文件后缀名有EXE, DLL,SYS等
PE指纹
可以通过PE指纹来识别该文件是否为PE文件,首先用notepad打开此文件并查看其16进制格式,可以发现开头的ASCII码是"MZ",然后观察偏移量为3C
的位置,其硬编码为F8
,对应的ASCII码为?
然后再找到偏移量为F8
的位置,发现一个50
和45
,其对应的ASCII码为PE
以下是通过识别PE指纹来判断PE文件的python代码
import os
def is_pe_file(file_path):
with open(file_path, 'rb') as f:
# 读取DOS头的前两个字节,判断是否为MZ
if f.read(2) != b'MZ':
return False
# 读取PE头的偏移量
f.seek(0x3C)
pe_offset = int.from_bytes(f.read(4), byteorder='little') #int.from_bytes(bytes, byteorder)是一个Python内置函数,它将给定字节序列转换为一个整数。bytes参数是待转换的字节序列,byteorder参数指定了字节序,它可以是'little'或'big',分别表示小端序和大端序。在Windows平台上,PE文件的字节序是小端序,因此我们使用'little'作为byteorder参数
# 定位到PE头的位置
f.seek(pe_offset)
# 判断PE头的前两个字节是否为PE
if f.read(2) != b'PE':
return False
return True
# 示例用法
file_path = 'test.exe'
if is_pe_file(file_path):
print(f"{file_path}是一个PE文件")
else:
print(f"{file_path}不是一个PE文件")