zoukankan      html  css  js  c++  java
  • 可选头 IMAGE_OPTIONAL_HEADER

    //IMAGE_OPTIONAL_HEADER结构(可选映像头)
    typedef struct _IMAGE_OPTIONAL_HEADER {
        //
        // Standard fields.
        //
        WORD    Magic;  //幻数,一般为10BH
        BYTE    MajorLinkerVersion;  //链接程序的主版本号
        BYTE    MinorLinkerVersion;  //链接程序的次版本号
        DWORD   SizeOfCode;  //代码段大小
        DWORD   SizeOfInitializedData;  //已初始化数据块的大小
        DWORD   SizeOfUninitializedData;  //未初始化数据库的大小
        DWORD   AddressOfEntryPoint;  //程序开始执行的入口地址,这是一个RVA(相对虚拟地址)
        DWORD   BaseOfCode; //代码段的起始RVA 一般来说 是 1000h
        DWORD   BaseOfData; //数据段的起始RVA
        //
        // NT additional fields.
        //
        DWORD   ImageBase; //可执行文件默认装入的基地址
        DWORD   SectionAlignment; //内存中块的对齐值(默认的块对齐值为1000H,4KB个字节)
        DWORD   FileAlignment;//文件中块的对齐值(默认值为200H字节,为了保证块总是从磁盘的扇区开始的)
        WORD    MajorOperatingSystemVersion;//要求操作系统的最低版本号的主版本号
        WORD    MinorOperatingSystemVersion;//要求操作系统的最低版本号的次版本号
        WORD    MajorImageVersion;//该可执行文件的主版本号
        WORD    MinorImageVersion;//该可执行文件的次版本号
        WORD    MajorSubsystemVersion;//要求最低之子系统版本的主版本号 默认 0004
        WORD    MinorSubsystemVersion;//要求最低之子系统版本的次版本号 默认 0000
        DWORD   Win32VersionValue;//保留字                            默认00000000
        DWORD   SizeOfImage;//映像装入内存后的总尺寸                   一般为00004000 映射到内存中一个块1000内存
        DWORD   SizeOfHeaders;//部首及块表的大小    
        DWORD   CheckSum;//CRC检验和                                   一般为00000000
        WORD    Subsystem;//程序使用的用户接口子系统
        WORD    DllCharacteristics;//DLLmain函数何时被调用,默认为0
        DWORD   SizeOfStackReserve;//初始化时堆栈大小
        DWORD   SizeOfStackCommit;//初始化时实际提交的堆栈大小
        DWORD   SizeOfHeapReserve;//初始化时保留的堆大小
        DWORD   SizeOfHeapCommit;//初始化时实际提交的对大小
        DWORD   LoaderFlags;//与调试有关,默认为0
        DWORD   NumberOfRvaAndSizes;//数据目录结构的数目
        IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表
    } 
    具有31个成员
    
    
    Magic 幻数,32位pe文件总为010B
    这个常数的定义如下:
    
      #define IMAGE_NT_OPTIONAL_HDR32_MAGIC      0x10B
      #define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20B
      #define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
     
    MajorLinkerVersion 连接程序的主版本号 如vc6.0的为06h
    
    MinorLinkerVersion 连接程序的次版本号 如vc6.0的为00h
    
    SizeOfCode pe文件代码段的大小.是FileAlignment的整数倍.
    
    SizeOfInitializedData 所有含已初始化数据的块的大小,一般在.data段中.
    
    SizeOfUninitializedData 所有含未初始化数据的块的大小,一般在.bss段中.
    
    AddressOfEntryPoint 程序开始执行的地址,这是一个RVA(相对虚拟地址).对于exe文件,这里是启动代码;对于dll文件,这里是libMain()的地址.
         在脱壳时第一件事就是找入口点,指的就是这个值.
         
    BaseOfCode 代码段基地址,微软的连接程序生成的程序一般把这个值置为1000h,   
         
    BaseOfData 数据段基地址
    
    ImageBase pe文件默认的装入地址.windows9x中exe文件为400000h,dll文件为10000000h.
    
    SectionAlignment 内存中区块的对齐单位.区块总是对齐到这个值的整数倍.x86的32位系统上默认值位1000h
    
    FileAlignment pe文件中区块的对齐单位.pe文件中默认值为 200h.
    
    MajorOperatingSystemVersion
    MinorOperatingSystemVersion
        上面两个域是指运行这个pe文件所需的操作系统的最低版本号.windows95/98和windows nt 4.0 的内部版本号都是 4.0 ,而windows2000的内部版本号是5.0
       
    MajorImageVersion
    MinorImageVersion
        上面两个域是指用户自定义的pe文件的版本号.可以通过连接程序来设置,如: LINK /VERSION:2.0 MyApp.obj一般在升级时使用.
       
    MajorSubsystemVersion   
    MinorSubsystemVersion
       上面两个域是指运行这个pe文件所要求的子系统的版本号.  
       
    Win32VersionValue 总是0
    
    SizeOfImage pe文件装入内存后映像的总大小.如果SectionAlignment域和FileAlignment域相等,那么这个值也是pe文件在硬盘上的大小.
       
    SizeOfHeaders 从文件开始到节表(包含节表)的总大小.其后是各个区段的数据.   
    PE头结构大小为220H,但是映射到内存中对齐粒度是200H实际上占用400H的空间
                
    
    CheckSum pe文件的CRC校验和.
    
    Subsystem pe文件的用户界面使用的子系统类型.定义如下:
    #define IMAGE_SUBSYSTEM_UNKNOWN              0   // Unknown subsystem.
    #define IMAGE_SUBSYSTEM_NATIVE               1   // 不需要子系统一般用在驱动当中。
    #define IMAGE_SUBSYSTEM_WINDOWS_GUI          2   // WIN32 console程序一般用在exe文件中
    #define IMAGE_SUBSYSTEM_WINDOWS_CUI          3   // WIN32 console程序一开始就会打开一个控制台
    #define IMAGE_SUBSYSTEM_OS2_CUI              5   // OS/2格式所以很少用在PE文件中
    #define IMAGE_SUBSYSTEM_POSIX_CUI            7   // POSIX console程序
    #define IMAGE_SUBSYSTEM_NATIVE_WINDOWS       8   // image is a native Win9x driver.
    #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI       9   // Image runs in the Windows CE subsystem.
    
    DllCharacteristics 总为0
    
    SizeOfStackReserve 为线程的栈初始保留的虚拟内存的大小,默认为00100000h.如果在调用CreateThread函数时指定堆栈的大小为0,被创建的线程的堆栈的初始大小就与这个值相同.
    
    SizeOfStackCommit 为线程的栈初始提交的虚拟内存的大小.微软的连接程序把这个值置为 1000h.
      
    SizeOfHeapReserve 为进程的堆保留的虚拟内存的大小.默认值为 00100000h.
    
    SizeOfHeapCommit  为进程的堆初始提交的虚拟内存的大小.微软的连接程序把这个值置为1000h.
       
    LoaderFlags 通常为0
    
    NumberOfRvaAndSizes 数据目录结构数组的项数,总为 00000010h
       这个值定义如下:
       #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
       
    IMAGE_DATA_DIRECTORY DataDirectory[0x10] 数据目录结构数组
    
    #define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // 导出表
    #define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // 导入表
    #define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // 资源
    #define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // 异常
    #define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // 安全
    #define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // 重定位表
    #define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // 调试信息
    #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage)
    #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // 版权信息
    #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR       8   // RVA of GP
    #define IMAGE_DIRECTORY_ENTRY_TLS             9   // TLS Directory
    #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory
    #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   11   // Bound Import Directory in headers
    #define IMAGE_DIRECTORY_ENTRY_IAT            12   // 导入函数地址表
    #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
    #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor
    
    typedef struct _IMAGE_DATA_DIRECTORY { 
    DWORD   VirtualAddress;// 相对虚拟地址 
    DWORD   Size;           //大小 
    } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
  • 相关阅读:
    描述JSP和Servlet的区别、共同点、各自应用的范围
    JS中的三种弹出式消息提醒(警告窗口、确认窗口、信息输入窗口)的命令是什么?
    如何优化数据库,如何提高数据库的性能?
    什么是数据库的参照完整性?
    常用的设计模式有哪些?说明工厂模式。
    struts2中,Action通过什么方式获得用户从页面输入的数据,又是通过什么方式把其自身的数据传给视图的?
    struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象、临时对象、固定名称的对象、Action对象
    Struts2包含哪些标签?
    说出几个与spring同类型的开源框架,说出几个与hibernate同类型的开源框架,说出几个与struts同类型的开源框架
    Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console、file等。Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别。
  • 原文地址:https://www.cnblogs.com/IMyLife/p/4826077.html
Copyright © 2011-2022 走看看