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编辑  收藏  举报

导航