LoadPE之PE editor模拟
1 void CPEInfoDlg::OnDropFiles(HDROP hDropInfo) 2 { 3 // TODO: Add your message handler code here and/or call default 4 TCHAR tzFileName[255]={0}; 5 int FileCount = DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0); 6 if (FileCount > 1) 7 { 8 MessageBox("暂时只支持分析一个文件,你传入了多个文件,将分析第一个","",0); 9 } 10 11 if (DragQueryFile(hDropInfo,0,tzFileName,sizeof(tzFileName))) 12 { 13 szFilePath = tzFileName; 14 } 15 DragFinish(hDropInfo); 16 HANDLE hFile = ::CreateFile(szFilePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 17 if ( hFile == INVALID_HANDLE_VALUE) 18 { 19 AfxMessageBox("无效的文件"); 20 return; 21 } 22 23 IMAGE_DOS_HEADER dosHeader; 24 IMAGE_NT_HEADERS32 ntHeader; 25 26 BOOL bValid = FALSE; //是不是PE文件 27 DWORD dwReadLen; 28 ::ReadFile(hFile,&dosHeader,sizeof(dosHeader),&dwReadLen,NULL); 29 if (dwReadLen == sizeof(dosHeader)) 30 { 31 if (dosHeader.e_magic == IMAGE_DOS_SIGNATURE) 32 { 33 if (::SetFilePointer(hFile,dosHeader.e_lfanew,NULL,FILE_BEGIN) != -1) 34 { 35 ::ReadFile(hFile,&ntHeader,sizeof(ntHeader),&dwReadLen,NULL); 36 if (ntHeader.Signature == IMAGE_NT_SIGNATURE) 37 { 38 bValid = TRUE; //一个合法的PE文件 39 } 40 } 41 } 42 } 43 if (bValid ==FALSE) 44 { 45 AfxMessageBox("你拖拽了一个非PE文件"); 46 return; 47 } 48 AfxGetMainWnd()->SetWindowText("[ PE editor ]"+szFilePath); 49 CString szTemp = ""; 50 szTemp.Format("%08x",ntHeader.OptionalHeader.AddressOfEntryPoint); 51 szTemp.MakeUpper(); 52 SetDlgItemText(IDC_EntryPoint,szTemp); 53 54 szTemp.Format("%08x",ntHeader.OptionalHeader.ImageBase); 55 szTemp.MakeUpper(); 56 SetDlgItemText(IDC_ImageBase,szTemp); 57 szTemp.Format("%08x",ntHeader.OptionalHeader.SizeOfImage); 58 szTemp.MakeUpper(); 59 60 SetDlgItemText(IDC_SizeOfImage,szTemp); 61 szTemp.Format("%08x",ntHeader.OptionalHeader.BaseOfCode); 62 szTemp.MakeUpper(); 63 64 SetDlgItemText(IDC_BaseOfCode,szTemp); 65 szTemp.Format("%08x",ntHeader.OptionalHeader.BaseOfData); 66 szTemp.MakeUpper(); 67 68 SetDlgItemText(IDC_BaseOfData,szTemp); 69 szTemp.Format("%08x",ntHeader.OptionalHeader.SectionAlignment); 70 szTemp.MakeUpper(); 71 72 SetDlgItemText(IDC_SectionAlignment,szTemp); 73 szTemp.Format("%08x",ntHeader.OptionalHeader.FileAlignment); 74 szTemp.MakeUpper(); 75 76 SetDlgItemText(IDC_FileAlignment,szTemp); 77 szTemp.Format("%04x",ntHeader.OptionalHeader.Magic); 78 szTemp.MakeUpper(); 79 80 SetDlgItemText(IDC_Magic,szTemp); 81 szTemp.Format("%04x",ntHeader.OptionalHeader.Subsystem); 82 szTemp.MakeUpper(); 83 84 SetDlgItemText(IDC_Subsystem,szTemp); 85 szTemp.Format("%04x",ntHeader.FileHeader.NumberOfSections); 86 szTemp.MakeUpper(); 87 88 SetDlgItemText(IDC_NumberOfSection,szTemp); 89 90 szTemp.Format("%08x",ntHeader.FileHeader.TimeDateStamp); 91 szTemp.MakeUpper(); 92 93 SetDlgItemText(IDC_TimeDataStamp,szTemp); 94 szTemp.Format("%08x",ntHeader.OptionalHeader.SizeOfHeaders); 95 szTemp.MakeUpper(); 96 97 SetDlgItemText(IDC_SizeOfHeader,szTemp); 98 szTemp.Format("%04x",ntHeader.FileHeader.Characteristics); 99 szTemp.MakeUpper(); 100 101 SetDlgItemText(IDC_Characteristics,szTemp); 102 szTemp.Format("%08x",ntHeader.OptionalHeader.CheckSum); 103 szTemp.MakeUpper(); 104 105 SetDlgItemText(IDC_CheckSum,szTemp); 106 szTemp.Format("%04x",ntHeader.FileHeader.SizeOfOptionalHeader); 107 szTemp.MakeUpper(); 108 109 SetDlgItemText(IDC_SizeOfOptionHeader,szTemp); 110 szTemp.Format("%08x",ntHeader.FileHeader.NumberOfSections); 111 szTemp.MakeUpper(); 112 113 SetDlgItemText(IDC_NumberOfSection,szTemp); 114 szTemp.Format("%08x",ntHeader.OptionalHeader.NumberOfRvaAndSizes); 115 szTemp.MakeUpper(); 116 117 SetDlgItemText(IDC_NumberOfRvaAndSize,szTemp); 118 119 CDialog::OnDropFiles(hDropInfo); 120 }
直接读取文件,没有用到文件映射。
下次试试读取输入表和导出表。