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 }

直接读取文件,没有用到文件映射。

下次试试读取输入表和导出表。

原文地址:https://www.cnblogs.com/tk091/p/2748886.html