1 #include<iostream>
 2 #include<Windows.h>
 3 using namespace std;
 4 
 5 /*
 6 获取可执行程序PE结构的流程
 7     1    将一个可执行程序完整拷贝给一个缓冲区来处理
 8     2    获取DOS头内容
 9     3    利用DOS头中的lfanew偏移找到PE头的位置
10     4    获取PE头中的内容
11 */
12 
13 int main()
14 {
15     //1 打开文件将内容给缓冲区FileBuff处理
16     HANDLE hFile = CreateFile(L"E:\\Project_Sum\\CC++\\test\\test\\Thread_syn.exe",
17         GENERIC_READ,
18         FILE_SHARE_READ,
19         NULL,
20         OPEN_EXISTING,
21         FILE_ATTRIBUTE_NORMAL,
22         NULL
23     ); 
24     DWORD FileSize = GetFileSize(hFile,NULL);
25     char* FileBuff = new char[FileSize];
26     DWORD RealSize = 0;
27     BOOL ret = false;
28     ret = ReadFile(hFile,FileBuff,FileSize,&RealSize,NULL);
29 
30     //2获取PE文件的DOS头内容
31     PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)FileBuff;
32     if (ret == true)
33     {
34         //获取DOS头内容
35         if (pDosHeader->e_magic != 0x5A4D)
36         {
37             cout << "该文件不是有效的PE文件" << endl;
38             delete[] FileBuff;
39             CloseHandle(hFile);
40             return 0;
41         }
42         cout << "该文件是有效的PE文件" << endl;
43         cout << "PE头的偏移为" << pDosHeader->e_lfanew << endl;
44     }
45 
46     //3根据DOS头中的lfanew来找到PE头的位置
47     PIMAGE_NT_HEADERS pNtHeader = PIMAGE_NT_HEADERS(FileBuff + pDosHeader->e_lfanew);
48     
49     //4获取PE头中的内容
50     //4.1获取PE头标识
51     cout << pNtHeader->Signature << endl;
52 
53     //4.2获取PE标准头(文件头)的内容
54     PIMAGE_FILE_HEADER pFileHeader = &(pNtHeader->FileHeader);
55     cout << pFileHeader->Machine << endl;
56 
57 
58     //4.3获取PE可选头的内容
59     PIMAGE_OPTIONAL_HEADER pOptionalHeader = &(pNtHeader->OptionalHeader);
60     cout << pOptionalHeader->ImageBase << endl;
61 
62 
63 
64 
65     delete[] FileBuff;
66     CloseHandle(hFile);
67     return 0;
68 }