(一).win32下的PE文件:
PE是Portable Execute的缩写,是可移植可执行的意思,只要文件的数据结构遵循PE结构,就属于PE文件,windows中常见的PE文件有
*.sys驱动类文件
*.dll动态链接库文件
*.exe可执行文件
*.ocx对象类别扩充组建
*.obj目标文件等.
同样,linux中使用的是ELF格式,和windows的PE格式有一定的差别,如:
可重定位文件*.o
可执行文件如/bin/ls等
共享目标文件*.so
核心转储文件core
都遵循ELF数据结构. unix从system v4开始也使用ELF了,而他们的始祖都是unix system v3的中COFF.如下图:
(二).win32中的PE文件二进制数据结构:
二进制数据结构如下图,看起来就比较复杂,但是当你亲自动手解析一波,那可能会改变你的世界观,前提是初学者.为了全部显示出来,看不太清,放附件里了.
(三).win32中PE的逻辑图:
一个标准的PE文件由DOS头,stub,NT头(包含PE标识,标准PE头和可选PE头三个成员),节表,节的内容以及一些为了内存对齐而填充的0.
以上就是一个PE文件的大体逻辑图,它里面的内容虽然是二进制,但绝不是随意填充的数据,而是严格遵循一定格式生成的,比如C语言写的一段代码,通过预处理, 汇编, 编译, 链接后生成的一个exe文件(PE文件中的一种),生成过程是由编译器来完成的.
(四).DOS头中的数据结构:
Visual C++ 6.0中winnt头文件中的定义:
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
(五).C语言实现对win32中notepad.exe的DOS头的简单解析:
该代码中只是输出了DOS头中两个较为有用的数据,第一个和最后一个(e_magic和e_lfanew),代码如下:
Dos_Header_Analyze.cpp: