流水账笔记:PE文件格式(Dos Header)

来源:互联网 发布:2016成都程序员工资 编辑:程序博客网 时间:2024/05/16 07:25

PE 文件 格式种类:

种类 主扩展名 可执行系列 EXE、SCR 库系列 DLL、OCX、CPL、DRV 驱动程序系列 SYS、VXD 对象文件系列 OBJ

严格的说,OBJ(对象)之外的所有文件都是可执行文件。DLL、SYS 虽然不能直接在 Shell (Explorer.exe) 中运行,但可以使用其他方法执行。

提示:根据 PE 正式规范,编译结果 OBJ 文件也视为 PE 文件。但是 OBJ 文件本身不能以任何形式执行,在代码逆向分析中几乎不需要关注它。

————《逆向工程核心原理》

  有关文件格式,微软并没有完全公开,只在 windows 的头文件中,定义了有关文件格式的结构体
  
  学习文件格式,不仅仅要知道文件格式中各个字段的意义,还要懂得通过分析文件格式,来应对畸形文件格式
  
  有时,通过修改文件格式,也可以达到反调试的目的

Dos文件头

  所以最初的 60 个字节是dos系统下 可执行文件 的格式。
  
这里写图片描述

  紫色框 开头的地址,才是真正的 32位(或64位)系统下的可执行文件格式

Dos文件头的结构体

  我们在VS2013中,通过定义结构体 IMAGE_DOS_HEADER ,可以找到有有关文件格式的结构体。结构体大小为 64 个字节。
  IMAGE_DOS_HEADER结构体

  结构体中简要说明了各个字段的作用,但是除了e_magic以及e_lfanew,我们并不关心其他成员。

文件头中的 Dos 代码段

  如果我们在Dos环境下运行 32 位的应用程序,则会提示:
  这里写图片描述

  该字符串是如何出现的?代码的实现,即是在 Dos 文件头的下一段空间
  
Dos代码段

  如果我们 dos 环境下调试32位程序,查看汇编代码时:
  这里写图片描述

  可以看到将要执行的代码二进制即是那一段蓝框内的二进制数据,其中还调用了 int 中断
  
  实际上,对于 32 位的应用程序,dos的文件头中只有 2 处信息是有效的,其余的信息即使全部填充为 0xff ,程序照样可以正常运行
  
这里写图片描述

其中,红框 处表示的是 Dos签名紫框 处表示 NT头的偏移