全称为PE-COFF(Portable Executable and Common Object File Format) 可移植可执行和通用对象文件格式。
主要用于Windows 环境。PE 是 COFF 的改进版。
一个典型的PE文件布局
Dos Stub 程序用于保持向后兼容,但其重要意义在于在逆向工程中指向一个PE头的偏移量。
从图中我们可以看出程序一开始会是DOS 头,但其用处不大。
从文件头开始向后偏移 0x3C 的位置,我们可以找到一个偏移量,这个偏移量可以告诉我们从文件头向后偏移多少是PE的头部。
PE文件头后便是COFF文件头。
COFF 文件头格式:
Machine (机器类型):2个字节,值几乎总是 0x8664(AMD 64) 或 0x14C(AI32)
Number of Section(区段数):指示文件有多少个区段。
Time Date Stamp:时间戳
Pointer to Symbol Table:指向COFF符合表的偏移量
Number of Symbols:符号数
Size of Optional Header:可选头部的大小
Characteristics:指文件的属性,例如是否是DLL等。
可选头部布局:
可选头部布局详细信息
magic:可用于标识 PE版本的一个标志 PE32 :0x10B PE32+:0x20B
size字段:分别指示 .text/code .data .bss区段大大小
RVA(Relative Virtual Address):相对虚拟地址,应用程序开始运行的地址。
(Note:先留个印象吧,回头在实际应用时看看其具体的作用)
ELF 可执行连接格式,UNIX操作系统的文件格式。
e_ident:用于确认ELF文件。确定处理器原生字的大小,指定字节顺序,及ELF头部版本。
它是一个无符号字符数组,共16个元素。
开始4个字节是magic字段 0x7F,E,L,F。
接下来的一个字节指定字的大小或类:0表示无效类,1表示32位,2表示64位。
接下来的一个字节指定文件内数据编码:0表示无效,1表示数据是小端字节序的二进制补码,2表示数据是大端字节序的补码
接下来的一个字节指定ELF头部版本。
e_type:确定文件是何种类型的可执行文件。
0:不是文件类型
1:可重定位的文件
2:可执行文件
3:共享目标文件
e_machine:表示机器类型 3 表示 IA 32
e_version:0表示无效版本, 1 表示当前版本
e_entry:应用程序进入点的VA (Virtual Address),不使用时为 0。
e_phoff:(ph program header),程序头部表的偏移量,0 表示没有程序头部表。
e_shoff:(sh section header),区段头部表的偏移量,0 表示没有区段头部表。
e_flags:包含与处理器相关的字段。
e_ehsize:ELF头部的大小。
e_phnum:表示头部表里记录的数量。
e_shnum:表示区段表里记录的数量。
关于Unix程序,由于实验环境有限,先以Windows为主,这部分作为后面学习的线索先保留在这吧。