windows学习(2)_PE文件的简单结构
以下是主要程序的代码
1 #include <Windows.h> 2 #include <Richedit.h> 3 #include "resource.h" 4 5 TCHAR szDllEdit[]="RichEd20.dll";//要使用 富文本编辑器 必须要加载RichEd20.dll动态链接库 6 //TCHAR szExtPe[]="PE Files"; 7 HINSTANCE hRichEdit;//ichEd20.dll动态链接库的句柄 8 HWND hWinEdit;//富文本编辑器的句柄 9 TCHAR szFileName[MAX_PATH];//被加载的文件的名字 10 11 LPVOID lpMemory;//指向文件被加载金内存的首地址 12 PIMAGE_DOS_HEADER pImageDOSHeader;//指向文件的DOS头 13 PIMAGE_NT_HEADERS pImageNTHeader;//指向文件的PE头 14 PIMAGE_SECTION_HEADER pImageSecitonHeader;//指向文件的节表 15 16 PIMAGE_IMPORT_DESCRIPTOR pImageImportDescriptor; 17 PIMAGE_IMPORT_BY_NAME pImageImportByName; 18 PIMAGE_EXPORT_DIRECTORY pImageExportDirectory; 19 20 int dwFileSize;//文件的大小 21 22 TCHAR szMsg[]="文件名: %s \r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n运行平台: 0x%04X\r\n节区数量: %d \r\n文件标记: 0x%04X \r\n建议装入地址: 0x%08X\r\n"; 23 TCHAR szMsgSection[]="- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n节区名称 节区大小 虚拟地址 Raw_尺寸 Raw_偏移 节区属性\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n"; 24 TCHAR szFmtSeciton[]="%s %08X %08X %08X %08X %08X \r\n"; 25 26 void AppendInfo(TCHAR sz[]){ 27 CHARRANGE cr; 28 int length=GetWindowTextLength(hWinEdit); 29 cr.cpMin=length; 30 cr.cpMax=length; 31 SendMessage(hWinEdit,EM_EXSETSEL,0,(LPARAM)&cr); 32 SendMessage(hWinEdit,EM_REPLACESEL,false,LPARAM(sz)); 33 } 34 35 36 //对话框初始化 37 void Init(){ 38 CHARFORMAT stCf; 39 stCf.cbSize=sizeof(stCf); 40 stCf.yHeight=9*20; 41 stCf.dwMask=CFM_FACE | CFM_SIZE | CFM_BOLD; 42 SendMessage(hWinEdit,EM_SETTEXTMODE,TM_PLAINTEXT,0); 43 SendMessage(hWinEdit,EM_SETCHARFORMAT,0,(LPARAM)&stCf);//设置富文本编辑器的字体样式 44 } 45 46 47 //把内容写入富文本编辑器 48 void ProcessPEFile(){ 49 TCHAR szBuffer[1024]; 50 TCHAR szSectionName[16]; 51 wsprintf(szBuffer,szMsg,szFileName,pImageNTHeader->FileHeader.Machine,pImageNTHeader->FileHeader.NumberOfSections,pImageNTHeader->FileHeader.Characteristics,pImageNTHeader->OptionalHeader.ImageBase); 52 SetWindowText(hWinEdit,szBuffer); 53 AppendInfo(szMsgSection); 54 55 int numOfSections=pImageNTHeader->FileHeader.NumberOfSections; 56 //循环吧节表的信息写在富文本编辑器 57 for(int i=0;i<numOfSections;i++){ 58 wsprintf(szBuffer,szFmtSeciton,pImageSecitonHeader->Name,pImageSecitonHeader->Misc.VirtualSize,pImageSecitonHeader->VirtualAddress,pImageSecitonHeader->SizeOfRawData,pImageSecitonHeader->PointerToRawData,pImageSecitonHeader->Characteristics); 59 AppendInfo(szBuffer); 60 pImageSecitonHeader=(PIMAGE_SECTION_HEADER)((PUCHAR)pImageSecitonHeader+sizeof(IMAGE_SECTION_HEADER)); 61 } 62 } 63 64 65 void Openfile(HWND hwnd){ 66 OPENFILENAME stOF;//存放文件信息的结构体 67 HANDLE hFile;//文件的句柄 68 HANDLE hMapFile;//文件内存映射的句柄 69 70 RtlZeroMemory(&stOF,sizeof(OPENFILENAME)); 71 stOF.lStructSize=sizeof(stOF); 72 stOF.hwndOwner=hwnd; 73 //stOF.lpstrFilter= 74 stOF.lpstrFile=szFileName; 75 stOF.nMaxFile=MAX_PATH; 76 stOF.Flags=OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 77 78 GetOpenFileName(&stOF);//打开文件选择的对话框 79 80 hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL);//打开文件 81 if(hFile!=INVALID_HANDLE_VALUE){//如果文件不是无效的句柄 82 dwFileSize=GetFileSize(hFile,NULL);//文件的大小 83 hMapFile=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);//创建文件的映射 84 lpMemory=MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);//把文件映射对象映射到当前应用程序的地址空间 85 86 pImageDOSHeader=(PIMAGE_DOS_HEADER)lpMemory;//得到文件映射在内存的首地址 87 pImageNTHeader=(PIMAGE_NT_HEADERS)( (PUCHAR)lpMemory+pImageDOSHeader->e_lfanew );//指向文件的PE头 88 pImageSecitonHeader=(PIMAGE_SECTION_HEADER)( (PUCHAR)pImageNTHeader+sizeof(IMAGE_NT_HEADERS) );//指向节表 89 ProcessPEFile();//显示数据 90 } 91 } 92 93 //这个是对话框的回调函数 94 BOOL CALLBACK DlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam){ 95 switch(message){ 96 case WM_CLOSE: 97 EndDialog(hDlg,NULL); 98 break; 99 100 case WM_INITDIALOG: 101 hWinEdit=GetDlgItem(hDlg,IDC_RICHEDIT);//获得富文本编辑器的句柄 102 Init(); 103 break; 104 105 case WM_COMMAND: 106 switch(wParam){ 107 case ID_OPEN: 108 Openfile(hDlg);//打开文件并且读取PE文件信息 109 break; 110 } 111 break; 112 } 113 114 return false; 115 } 116 117 118 //主函数 119 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){ 120 //加载动态链接库 121 hRichEdit=LoadLibrary(szDllEdit); 122 //加载对话框 123 DialogBoxParam(hInstance,MAKEINTRESOURCE (IDD_DIALOG),NULL,DlgProc,NULL); 124 //释放动态链接库 125 FreeLibrary(hRichEdit); 126 //结束进程 127 ExitProcess(0); 128 return 0; 129 }
以下是resource.h的代码
1 //{{NO_DEPENDENCIES}} 2 // Microsoft Developer Studio generated include file. 3 // Used by resource.rc 4 // 5 #define IDD_DIALOG 101 6 #define IDR_MENU 102 7 #define IDC_RICHEDIT 1000 8 #define ID_OPEN 40001 9 10 // Next default values for new objects 11 // 12 #ifdef APSTUDIO_INVOKED 13 #ifndef APSTUDIO_READONLY_SYMBOLS 14 #define _APS_NEXT_RESOURCE_VALUE 103 15 #define _APS_NEXT_COMMAND_VALUE 40002 16 #define _APS_NEXT_CONTROL_VALUE 1001 17 #define _APS_NEXT_SYMED_VALUE 101 18 #endif 19 #endif
以下是resource.rc的代码
1 //Microsoft Developer Studio generated resource script. 2 // 3 #include "resource.h" 4 5 #define APSTUDIO_READONLY_SYMBOLS 6 ///////////////////////////////////////////////////////////////////////////// 7 // 8 // Generated from the TEXTINCLUDE 2 resource. 9 // 10 #include "afxres.h" 11 12 ///////////////////////////////////////////////////////////////////////////// 13 #undef APSTUDIO_READONLY_SYMBOLS 14 15 ///////////////////////////////////////////////////////////////////////////// 16 // Chinese (P.R.C.) resources 17 18 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) 19 #ifdef _WIN32 20 LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED 21 #pragma code_page(936) 22 #endif //_WIN32 23 24 #ifdef APSTUDIO_INVOKED 25 ///////////////////////////////////////////////////////////////////////////// 26 // 27 // TEXTINCLUDE 28 // 29 30 1 TEXTINCLUDE DISCARDABLE 31 BEGIN 32 "resource.h\0" 33 END 34 35 2 TEXTINCLUDE DISCARDABLE 36 BEGIN 37 "#include ""afxres.h""\r\n" 38 "\0" 39 END 40 41 3 TEXTINCLUDE DISCARDABLE 42 BEGIN 43 "\r\n" 44 "\0" 45 END 46 47 #endif // APSTUDIO_INVOKED 48 49 50 ///////////////////////////////////////////////////////////////////////////// 51 // 52 // Dialog 53 // 54 55 IDD_DIALOG DIALOG DISCARDABLE 0, 0, 451, 187 56 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 57 CAPTION "Dialog" 58 MENU IDR_MENU 59 FONT 10, "System" 60 BEGIN 61 CONTROL "",IDC_RICHEDIT,"RichEdit20A",WS_BORDER | WS_TABSTOP |ES_WANTRETURN|ES_MULTILINE 62 0x1004,7,7,437,173 63 END 64 65 66 ///////////////////////////////////////////////////////////////////////////// 67 // 68 // DESIGNINFO 69 // 70 71 #ifdef APSTUDIO_INVOKED 72 GUIDELINES DESIGNINFO DISCARDABLE 73 BEGIN 74 IDD_DIALOG, DIALOG 75 BEGIN 76 LEFTMARGIN, 7 77 RIGHTMARGIN, 444 78 TOPMARGIN, 7 79 BOTTOMMARGIN, 180 80 END 81 END 82 #endif // APSTUDIO_INVOKED 83 84 85 ///////////////////////////////////////////////////////////////////////////// 86 // 87 // Menu 88 // 89 90 IDR_MENU MENU DISCARDABLE 91 BEGIN 92 POPUP "文件" 93 BEGIN 94 MENUITEM "打开", ID_OPEN 95 END 96 END 97 98 #endif // Chinese (P.R.C.) resources 99 ///////////////////////////////////////////////////////////////////////////// 100 101 102 103 #ifndef APSTUDIO_INVOKED 104 ///////////////////////////////////////////////////////////////////////////// 105 // 106 // Generated from the TEXTINCLUDE 3 resource. 107 // 108 109 110 ///////////////////////////////////////////////////////////////////////////// 111 #endif // not APSTUDIO_INVOKED
以下是程序运行的效果
posted on 2018-02-24 18:45 孙悟空son_ku_kong 阅读(411) 评论(0) 编辑 收藏 举报