您的位置:首页 > 其它

PE结构_01

2016-06-08 10:45 351 查看
ZC: 主要是 非代码的 分析结构

1、

  1.1、DosHeader: PE从偏移0开始就是

  1.2、NtHeader: 位于 紧接着DosHeader的后面(具体位置为: DosHeader的偏移[0] + DosHeader.e_lfanew)

    1.2.1、NtFileHeader: NtHeader.FileHeader

    1.2.2、NtOptionalHeader: NtHeader.OptionalHeader

  1.3、DataDirectory: NtOptionalHeader.DataDirectory

2、

  每次加载exe的基址是否是随机的:(WORD)IMAGE_FILE_HEADER.Characteristics;

    IMAGE_FILE_RELOCS_STRIPPED ==> 0x0001

  if (IMAGE_FILE_HEADER.Characteristics & IMAGE_FILE_RELOCS_STRIPPED != 0)
    exe固定基址
  else
    exe随机基址


3、IAT 在哪里?

  结构体IMAGE_OPTIONAL_HEADER32的最后一个成员:IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

    数组的索引为 IMAGE_DIRECTORY_ENTRY_IAT

4、exe 入口点:

  IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint

100、

  100.1、代码:

#include <stddef.h>
#include <stdio.h>
#include <windows.h>

void main()
{
printf("结构体的大小 :\n");

printf("sizeof(IMAGE_DOS_HEADER) : %d [0x%X]\n", sizeof(IMAGE_DOS_HEADER), sizeof(IMAGE_DOS_HEADER));
printf("sizeof(IMAGE_NT_HEADERS32) : %d [0x%X]\n", sizeof(IMAGE_NT_HEADERS32), sizeof(IMAGE_NT_HEADERS32));

printf("sizeof(IMAGE_FILE_HEADER) : %d [0x%X]\n", sizeof(IMAGE_FILE_HEADER), sizeof(IMAGE_FILE_HEADER));
printf("sizeof(IMAGE_OPTIONAL_HEADER32) : %d [0x%X]\n", sizeof(IMAGE_OPTIONAL_HEADER32), sizeof(IMAGE_OPTIONAL_HEADER32));
printf("sizeof(IMAGE_DATA_DIRECTORY) : %d [0x%X]\n", sizeof(IMAGE_DATA_DIRECTORY), sizeof(IMAGE_DATA_DIRECTORY));

printf("\n");
printf("成员在结构体中的偏移 :\n");

size_t iOffset = offsetof(IMAGE_DOS_HEADER, e_lfanew);
printf("IMAGE_DOS_HEADER.e_lfanew 偏移为 : %d [0x%X]\n", iOffset, iOffset);

iOffset = offsetof(IMAGE_NT_HEADERS32, FileHeader);
printf("IMAGE_NT_HEADERS32.FileHeader 偏移为 : %d [0x%X]\n", iOffset, iOffset);

iOffset = offsetof(IMAGE_NT_HEADERS32, OptionalHeader);
printf("IMAGE_NT_HEADERS32.OptionalHeader 偏移为 : %d [0x%X]\n", iOffset, iOffset);

iOffset = offsetof(IMAGE_OPTIONAL_HEADER32, DataDirectory);
printf("IMAGE_OPTIONAL_HEADER32.DataDirectory 偏移为 : %d [0x%X]\n", iOffset, iOffset);

iOffset = offsetof(IMAGE_OPTIONAL_HEADER32, AddressOfEntryPoint);
printf("IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint 偏移为 : %d [0x%X]\n", iOffset, iOffset);

//IMAGE_NT_OPTIONAL_HDR_MAGIC
}


  100.2、控制台输出:

结构体的大小 :
sizeof(IMAGE_DOS_HEADER) : 64 [0x40]
sizeof(IMAGE_NT_HEADERS32) : 248 [0xF8]
sizeof(IMAGE_FILE_HEADER) : 20 [0x14]
sizeof(IMAGE_OPTIONAL_HEADER32) : 224 [0xE0]
sizeof(IMAGE_DATA_DIRECTORY) : 8 [0x8]

成员在结构体中的偏移 :
IMAGE_DOS_HEADER.e_lfanew 偏移为 : 60 [0x3C]
IMAGE_NT_HEADERS32.FileHeader 偏移为 : 4 [0x4]
IMAGE_NT_HEADERS32.OptionalHeader 偏移为 : 24 [0x18]
IMAGE_OPTIONAL_HEADER32.DataDirectory 偏移为 : 96 [0x60]
IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint 偏移为 : 16 [0x10]
Press any key to continue


101、

  101.1、VC6中 WINNT.H

// Directory Entries

#define IMAGE_DIRECTORY_ENTRY_EXPORT          0   // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT          1   // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE        2   // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION       3   // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY        4   // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC       5   // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG           6   // Debug Directory
//      IMAGE_DIRECTORY_ENTRY_COPYRIGHT       7   // (X86 usage)
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data
#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   // Import Address Table
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor


102、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: