阿西吧 发表于 2017-8-25 20:25:14

PE-NT头

IMAGE_NT_HEADERS STRUCT
{
+0hDWORDSignature        //签名:(PE)
+4hIMAGE_FILE_HEADER FileHeader         //文件头
+18hIMAGE_OPTIONAL_HEADER32OptionalHeader       //可选头
} IMAGE_NT_HEADERS ENDS

这一段红框中的就是NT头部分

文件头:
typedef         struct _IMAGE_FILE_HEADER
{
+04h        WORD                Machine;                                      // 运行平台
+06h        WORD                NumberOfSections;                        // 文件的区块数目
+08h        DWORD                 TimeDateStamp;                        // 文件创建日期和时间
+0Ch        DWORD                 PointerToSymbolTable;                // 指向符号表(主要用于调试)
+10h         DWORD                 NumberOfSymbols;                        // 符号表中符号个数(同上)
+14h        WORD                SizeOfOptionalHeader;                // IMAGE_OPTIONAL_HEADER32 结构大小
+16h        WORD                Characteristics;                                // 文件属性
} IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;

重要的有五个:
第一个是运行平台:一般Intel 386 x86的就是0X14C
第二个是节区数目:一定和实际的节区要相同,不然会运行错误
第三个是文件创建日期和时间:用C语言的ctime函数可以进行转换
第四个是可选头的大小:从IMAGE_OPTIONAL_HEADER的起始偏移加上SizeOfOptionalHeader才是真正的IMAGE_SECTION_HEADER
第五个是文件属性:用来标识文件是否可运行状态,是否为DLL等。(按位OR来组合)


typedef struct _IMAGE_OPTIONAL_HEADER
{
    //
    // Standard fields.
    //
+18h    WORD    Magic;         // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)
+1Ah    BYTE      MajorLinkerVersion;   // 链接程序的主版本号
+1Bh    BYTE      MinorLinkerVersion;   // 链接程序的次版本号
+1Ch    DWORD   SizeOfCode;   // 所有含代码的节的总大小
+20h    DWORD   SizeOfInitializedData;    // 所有含已初始化数据的节的总大小
+24h    DWORD   SizeOfUninitializedData; // 所有含未初始化数据的节的大小
+28h    DWORD   AddressOfEntryPoint;    // 程序执行入口RVA
+2Ch    DWORD   BaseOfCode;      // 代码的区块的起始RVA
+30h    DWORD   BaseOfData;      // 数据的区块的起始RVA
    //
    // NT additional fields.    以下是属于NT结构增加的领域。
    //
+34h    DWORD   ImageBase;      // 程序的首选装载地址
+38h    DWORD   SectionAlignment;      // 内存中的区块的对齐大小
+3Ch    DWORD   FileAlignment;      // 文件中的区块的对齐大小
+40h    WORD    MajorOperatingSystemVersion;// 要求操作系统最低版本号的主版本号
+42h    WORD    MinorOperatingSystemVersion;// 要求操作系统最低版本号的副版本号
+44h    WORD    MajorImageVersion;       // 可运行于操作系统的主版本号
+46h    WORD    MinorImageVersion;       // 可运行于操作系统的次版本号
+48h    WORD    MajorSubsystemVersion;// 要求最低子系统版本的主版本号
+4Ah    WORD    MinorSubsystemVersion;// 要求最低子系统版本的次版本号
+4Ch    DWORD   Win32VersionValue;       // 莫须有字段,不被病毒利用的话一般为0
+50h    DWORD   SizeOfImage;       // 映像装入内存后的总尺寸
+54h    DWORD   SizeOfHeaders;       // 所有头 + 区块表的尺寸大小
+58h    DWORD   CheckSum;       // 映像的校检和
+5Ch    WORD    Subsystem;       // 可执行文件期望的子系统
+5Eh    WORD    DllCharacteristics;       // DllMain()函数何时被调用,默认为 0
+60h    DWORD   SizeOfStackReserve;       // 初始化时的栈大小
+64h    DWORD   SizeOfStackCommit;       // 初始化时实际提交的栈大小
+68h    DWORD   SizeOfHeapReserve;      // 初始化时保留的堆大小
+6Ch    DWORD   SizeOfHeapCommit;      // 初始化时实际提交的堆大小
+70h    DWORD   LoaderFlags;      // 与调试有关,默认为 0
+74h    DWORD   NumberOfRvaAndSizes;// 下边数据目录的项数,这个字段自Windows NT 发布以来      // 一直是16
+78h    IMAGE_DATA_DIRECTORY DataDirectory;
       // 数据目录表
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;



重要的有10个:
第一个Magic:当是IMAGE_OPTIONAL_HEADER32等于10B,当是IMAGE_OPTIONAL_HEADER64等于20B
第二个AddressOfEntryPoint:是程序载入内存后Entry Point的RVA值,内存中EP = ImageBase + AddressOfEntryPoint
第三个ImageBase:程序的首选装载地址,一般exe载入后EP都等于ImageBase + AddressOfEntryPoint,dll可能发生重定位,所以可能不是
第四个SectionAlignment:内存中区段的大小
第五个FileAlignment:磁盘中的文件区块对齐大小        (这两个的大小可能相同也可能不同,但是一般FileAlignment都是小于等于SectionAlignment)
第六个SizeOfImage:PE IMAGE装入内存中的大小
第七个SizeOfHeader:整个PE头的大小,是FileAlignment的整数倍,第一节区开始的位置 = SizeOfHeader
第八个Subsystem:区分驱动文件(*.sys)和(*.exe , *.dll)
第九个NumberOfRvaAndSize:指定数据目录表的成员数(小于等于16)
第十个DataDirectory:数据目录表(结尾是一个空的结构,接下来就是节区头)
DataDirectory:
0        IMAGE_DIRECTORY_ENTRY_EXPORT                导出表
1        IMAGE_DIRECTORY_ENTRY_IMPORT                导入表
2        IMAGE_DIRECTORY_ENTRY_RESOURCE                资源
3        IMAGE_DIRECTORY_ENTRY_EXCEPTION        异常(具体资料不详)
4        IMAGE_DIRECTORY_ENTRY_SECURITY                安全(具体资料不详)
5        IMAGE_DIRECTORY_ENTRY_BASERELOC        重定位表
6        IMAGE_DIRECTORY_ENTRY_DEBUG                调试信息
7        IMAGE_DIRECTORY_ENTRY_ARCHITECTURE        版权信息
8        IMAGE_DIRECTORY_ENTRY_GLOBALPTR        具体资料不详
9        IMAGE_DIRECTORY_ENTRY_TLS                        Thread Local Storage
10        IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG        具体资料不详
11        IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT具体资料不详
12        IMAGE_DIRECTORY_ENTRY_IAT                        导入函数地址表
13        IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT        具体资料不详
14        IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR具体资料不详
15        未使用                                                                就是空的那个






页: [1]
查看完整版本: PE-NT头