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 }