当前位置: 首页 > news >正文

Windows逆向工程提升之IMAGE_DOS_HEADER

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

什么是IMAGE_DOS_HEADER

DOS头的结构定义:

核心字段解析

(1) e_magic(OFFSET → 0 WORD)

(2) e_lfanew(OFFSET → 0X3C DWORD)

(3) ecblp, ecp

(4) eip, ecs

(5) eres 和 eres2

(6) eoemid 和 eoeminfo

DOS头的作用

PE文件结构拓展

学习与调试中的常见问题


什么是IMAGE_DOS_HEADER

IMAGE_DOS_HEADER 是PE文件(Portable Executable)结构中的第一部分,它包含了DOS程序使用的起始信息。尽管现代Windows操作系统直接运行PE文件(而不是DOS程序),但DOS头依然被保留下来,主要用于兼容性。

DOS头的结构定义:

typedef struct _IMAGE_DOS_HEADER {  WORD e_magic;    // 用于标记DOS可执行文件(0x5A4D,即"ZM")。  WORD e_cblp;     // 最后一页的字节数。  WORD e_cp;       // 文件的页总数。  WORD e_crlc;     // 重定位项数目。  WORD e_cparhdr;  // 段信息表中的段头大小。  WORD e_minalloc; // 最小数据长度需求。  WORD e_maxalloc; // 最大数据长度需求。  WORD e_ss;       // 初始堆栈段。  WORD e_sp;       // 堆栈指针初值。  WORD e_csum;     // 校验和。  WORD e_ip;       // 程序起始指针地址(入口地址)。  WORD e_cs;       // 代码段。  WORD e_lfarlc;   // 重定位表地址。  WORD e_ovno;     // 溢出值。  WORD e_res[4];   // 保留区。  WORD e_oemid;    // OEM标识符。  WORD e_oeminfo;  // OEM信息。  WORD e_res2[10]; // 额外的保留部分。  DWORD e_lfanew;  // PE头起始地址的偏移量。  
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;  

 

核心字段解析

(1) e_magic(OFFSET → 0 WORD)
  • 值: 0x5A4D (ASCII形式是 "MZ")。

  • 含义: DOS可执行文件的标志。

  • 功能: 帮助识别文件类型,也称为“幻数(Magic Number)”。

(2) e_lfanew(OFFSET → 0X3C DWORD)
  • 值: 一个DWORD值,表示PE文件头(IMAGENTHEADERS)在文件中的偏移量。

  • 功能: 引导操作系统直接跳到PE文件头,加载PE部分。

(3) ecblp, ecp
  • 功能: 定义DOS程序的页结构,但现代Windows中已无实际意义,通常被保留为固定值。
(4) eip, ecs
  • 功能: 在DOS环境下,这些字段指向程序的入口地址。现代PE文件会跳过这些字段。
(5) eres 和 eres2
  • 功能: 保留字段,目前无具体用途,通常填充零。
(6) eoemid 和 eoeminfo
  • 功能: 标识附加的信息,可能由特定的OEM厂商定义。

DOS头的作用

  • 兼容旧的DOS环境:
    • 在DOS模式下运行时,DOS头包含必须的元信息,支持跳转到DOS Stub程序。
    • 如果在不兼容的平台运行,系统可显示一条错误信息(一般是“此程序不能在DOS模式下运行”)。这条信息存储在DOS Stub部分中。
  • 用于定位PE文件头:
    • e_lfanew字段用于提供PE头的偏移量。
    • 系统通过此字段快速跳转到PE核心内容。
  • 保持文件格式兼容性:
    • 向下兼容既有机制,同时支持现代Windows加载器解析文件。

PE文件结构拓展

IMAGE_DOS_HEADER 是PE文件结构的起点。在PE文件中,其后依次包含以下关键部分:

  • DOS Stub(位于DOS头之后):
    • 一个小型程序,用于在DOS下提示“程序无法运行”的信息。
  • IMAGE_NT_HEADERS:
    • 包括PE签名("PE\0\0")和核心的文件头(IMAGE_FILE_HEADER部分)。
  • IMAGE_SECTION_HEADERs:
    • 描述文件的各个部分(如.text, .data, .rdata等)。

学习与调试中的常见问题

  • 如何分析e_lfanew指向的地址?
    • 用十六进制编辑器查看文件偏移值位置。
    • 在Debug工具中,跟踪文件头,验证跳转逻辑。
  • e_magic值如何用于文件完整性检查?
    • 文件加载器首先检查e_magic是否为0x5A4D。
    • 如果不匹配,则文件会被判定非有效PE文件。
http://www.xdnf.cn/news/557191.html

相关文章:

  • 定时任务延迟任务
  • linux内核编译学习笔记
  • Java异常处理与File类终极指南
  • 【基础知识】SPI协议的种类及异同
  • 数据库 1.0.1
  • DAY28类
  • MYSQL备份恢复知识:第四章:备份锁
  • 【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite
  • MySQL中添加一个具有创建数据库权限的用户
  • Java并发进阶系列:深度讨论jdk1.8 ConcurrentHashMap并发环境下transfer方法桶位分配过程
  • C/C++ Select Poll Epoll 多路转接
  • python -> matplotlib简单用法
  • Unity3D仿星露谷物语开发47之砍树时落叶特效
  • Wan2.1 加速推理方法
  • 使用cursor自动生成前后端分离的web应用程序
  • ROS2 pkg 创建功能包
  • [ 计算机网络 ] 深入理解OSI七层模型
  • 经验过程简介与suprema的集中(Guntuboyina理论统计学笔记)
  • QT高DPI支持
  • linux之 pcie MSI-X中断编程
  • 自动化测试核心知识梳理与 Java 代码详解
  • 基于正点原子阿波罗F429开发板的LWIP应用(3)——Netbiosns功能
  • 嵌入式培训之系统编程(一)标准IO、文件操作
  • Liquid Wire 柔性应变传感器:金属凝胶导体 | 仿生肌肉长度监测 | 高精度动作控制
  • 特定领域 RAG中细调嵌入模型能否提升效果?
  • IVX:重构 AI 原生开发范式,让模型调用成为指尖艺术​
  • PostgreSQL简单使用
  • 深入浅出人工智能:机器学习、深度学习、强化学习原理详解与对比!
  • 【深度学习-Day 14】从零搭建你的第一个神经网络:多层感知器(MLP)详解
  • 第六天的尝试