美文网首页逆向工程
连载13:IMAGE_FILE_HEADER 字段解释

连载13:IMAGE_FILE_HEADER 字段解释

作者: 码农UP2U | 来源:发表于2020-02-13 16:27 被阅读0次

    回顾 IMAGE_FILE_HEADER 数据结构

    上篇文章已经给出了 IMAGE_FILE_HEADER 的定义,这里再次回顾一下该数据结构,其数据结构的定义如下:

    //
    // File header format.
    //
    
    typedef struct _IMAGE_FILE_HEADER {
        WORD    Machine;
        WORD    NumberOfSections;
        DWORD   TimeDateStamp;
        DWORD   PointerToSymbolTable;
        DWORD   NumberOfSymbols;
        WORD    SizeOfOptionalHeader;
        WORD    Characteristics;
    } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
    
    #define IMAGE_SIZEOF_FILE_HEADER             20
    

    该定义在 winnt.h 文件中,且该数据结构的大小为 20 个字节,该数据结构的大小在 winnt.h 中由宏给出了定义。

    下面对它的字段进行一个解释

    IMAGE_FILE_HEADER 数据结构解释

    IMAGE_FILE_HEADER 结构体中的字段实际能用到的一共由 4 个,分别是:MachineNumberOfSectionsSizeOfOptionalHeaderCharacteristics

    • Machine:该文件的目标 CPU 类型。在 winnt.h 文件中定义一些相关的宏,但是常见就两个,如下:
    #define IMAGE_FILE_MACHINE_UNKNOWN           0
    #define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
    #define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
    ……
    #define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
    #define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
    ……
    

    常见的两个分别是 IMAGE_FILE_MACHINE_I386IMAGE_FILE_MACHINE_IA64

    IMAGE_FILE_MACHINE_I386 表示该可执行程序为 Intel 32 位兼容平台
    IMAGE_FILE_MACHINE_IA64 表示该可执行程序为 Intel 64 位兼容平台

    • NumberOfSections:表示该文件的节区数
    • SizeOfOptionalHeader:表示在 IMAGE_FILE_HEADER 后面的 IMAGE_OPTIONAL_HEADER 结构体的大小,该结构体分为 32 位和 64 位 两个版本,因此结构体的大小会有所不同。这样的设计也是为了保证向后的兼容。
    • Characteristics:指定该文件的类型,毕竟 PE 文件的类型也很多,比如 EXE 和 DLL 虽然都是 PE 文件,但是它们还是有区别的。因此,需要用具体的文件属性来进行区分类型。该字段在 winnt.h 中有响应的宏定义,定义如下:
    #define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
    #define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved external references).
    #define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
    #define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.
    #define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Aggressively trim working set
    #define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // App can handle >2gb addresses
    #define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
    #define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
    #define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from file in .DBG file
    #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, copy and run from the swap file.
    #define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // If Image is on Net, copy and run from the swap file.
    #define IMAGE_FILE_SYSTEM                    0x1000  // System File.
    #define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
    #define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // File should only be run on a UP machine
    #define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.
    

    其中,常见的有 IMAGE_FILE_RELOCS_STRIPPEDIMAGE_FILE_EXECUTABLE_IMAGEIMAGE_FILE_SYSTEMIMAGE_FILE_DLLIMAGE_FILE_32BIT_MACHINE

    IMAGE_FILE_RELOCS_STRIPPED:文件中不存在重定位信息
    IMAGE_FILE_EXECUTABLE_IMAGE:文件可执行
    IMAGE_FILE_SYSTEM:系统文件
    IMAGE_FILE_DLL:DLL 文件
    IMAGE_FILE_32BIT_MACHINE:目标平台为 32 位平台

    Characteristics 通常是由若干个宏 或运算 后的值

    本篇文章把 IMAGE_FILE_HEADER 进行了解释,关于 IMAGE_FILE_HEADER 结构体在 PE 文件中的具体分析在下篇文章中进行介绍。



    微信中搜索 “码农UP2U” 关注我的公众号吧!!!

    相关文章

      网友评论

        本文标题:连载13:IMAGE_FILE_HEADER 字段解释

        本文链接:https://www.haomeiwen.com/subject/xqwcfhtx.html