win32下PE文件分析之DOS头

时间:2021-07-08 02:26:45

(一).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: