可执行文件
可执行文件,是由操作系统进行加载执行的文件,不可执行文件,如jpg,png需要由其它软件加载
在windows平台下:PE文件结构
在linux平台下:ELF文件结构
PE文件的指纹特征
受PE结构影响以十六进制打开PE文件时:
文件开头是4d5a(MZ)
在地址3C处存有指向PE文件头标识的地址数据。PE 00
不能只看文件后缀exe
PE文件结构
PE文件有四个部分组成:DOS部分,PE文件头,节表,节数据。
在PE文件中,其中使用了很多结构体,我们需要知道结构体的作用。
DOS部分
DOS部分又分为两个部分,DOS MZ文件头和DOS块。
DOS MZ文件头
DOS MZ文件头本质是一个IMAGE_DOS_HEADER结构体,在内存中大小为64字节。
以记事本程序为例,路径为c:windows\system32\notepad.exe,大家可以自己尝试。
此时选中的部分就是64字节,都是DOS MZ部分的数据
在结构体中,含有以下成员,其中现在使用的成员只有第一个(标记文件是否为可执行)和最后一个(指向PE文件头的标识PE00),其它的成员可以任意修改,每一个成员前面为对应地址。
1 | struct _IMAGE_DOS_HEADER{ |
其中第一个成员和最后一个成员依次对应如下:
问题一:修改数据无法打开。
DOS块
dos块大小不确定,给连接器使用。
范围是从DOS MZ文件头后面,到PE文件头之间
从64字节到3c所指向的地址处,内容可以修改
PE文件头
PE文件头是结构体IMAGE_NT_HEADERS,其中含有三个成员:
Signature 4个字节,标准PE头 20个字节,扩展PE头 分32和64位
1 | struct _IMAGE_NT_HEADERS{ |
PE标识
Signature:PE标识,对应PE 00,占四个字节
不能更改
标准PE头
_IMAGE_FILE_HEADER FileHeader
20个字节
选中部分即标准PE头
1 | typedef struct _IMAGE_FILE_HEADER { |
上面可以看到:
- Machine是8664(小端序),为x64机器上
- NumberOfSections这里有七个节
- TimeDateStamp时间戳,不是创建时间,修改时间。可以自己修改
- PointerToSymbolTable,用于调试
- NumberOfSymbols,用于调试
- SizeOfOptionalHeader函数决定扩展PE头的大小。32位为E0,64位为F0
- Characteristics,最后选中的为十六进制的0022,转化为二进制0000 0000 0010 0010,然后根据属性图查相关属性
扩展PE头
_IMAGE_OPTIONAL_HEADER32
或者
_IMAGE_OPTIONAL_HEADER64
32位:
1 | typedef struct _IMAGE_OPTIONAL_HEADER { |
- ImageBase+AddressOfEntryPoint = 运行在内存中的地址
- FileAlignment,文件对齐是硬盘中
- SectionAlignment,内存对齐是在内存中
- 关于文件特征DllCharacteristics,也是转二进制查属性
节表
节表有多个结构体,每一个结构体占用40字节,对应节数据。
1 | typedef struct _IMAGE_SECTION_HEADER |