当前位置: 首页 > news >正文

PE分析

  1 #include<windows.h>
  2 #include<RichEdit.h>
  3 #include "resource.h"
  4 
  5 
  6 
  7 BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  8 
  9 //Pe文件处理函数声明
 10 
 11 BOOL IsPeFile(LPVOID ImageBase);
 12 PIMAGE_NT_HEADERS    GetNtHeader(LPVOID    ImageBase);
 13 PIMAGE_FILE_HEADER    WINAPI    GetFileHeader(LPVOID    Imagebase);
 14 PIMAGE_OPTIONAL_HEADER    GetOptionalHeader(LPVOID    ImageBase);
 15 
 16 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowcmd)
 17 {
 18     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DlgProc);
 19 
 20     return 0;
 21 }
 22 
 23 
 24 BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
 25 {
 26 
 27 
 28     OPENFILENAME    FileName  = { 0,0,0 }, *lpFileName  = &FileName;
 29     HANDLE            hFile, hFileMap;
 30     TCHAR            szPe[] = "\"PE File(*.exe)\" \0*.exe;*.dll;*.scr;*.fon;*.drv;\0\"*.All File(*.*) \0*.*\0\0";
 31     TCHAR            szFileName[256] = { "" };
 32 
 33     LPVOID            lpMemory;
 34 
 35     TCHAR            Buff[16];
 36     PIMAGE_FILE_HEADER    pFileHeader  = NULL;
 37     PIMAGE_OPTIONAL_HEADER    pOptionHeader  = NULL;
 38 
 39     switch (message)
 40     {
 41     case    WM_INITDIALOG:
 42         break;
 43     case    WM_CLOSE:
 44 
 45         EndDialog(hDlg, NULL);
 46         break;
 47 
 48     case    WM_COMMAND:
 49         switch (LOWORD(wParam))
 50         {
 51         case    IDM_OPEN:
 52             FileName.hInstance  = (HINSTANCE)hDlg;
 53             FileName.hwndOwner  = hDlg;
 54             FileName.lStructSize  = sizeof(OPENFILENAME);
 55             FileName.lpstrFilter  = szPe;
 56             FileName.lpstrFile  = szFileName;
 57             FileName.Flags  = OFN_FILEMUSTEXIST || OFN_PATHMUSTEXIST;
 58             FileName.nMaxFile  = sizeof(szFileName);
 59 
 60 
 61             if (!GetOpenFileName(lpFileName))
 62             {
 63                 MessageBox(hDlg, "GetOpenFileName 调用失败", "ERROR", NULL);
 64                 break;
 65             }
 66 
 67             SetDlgItemText(hDlg, IDC_FILENAME, szFileName);
 68 
 69             hFile  = CreateFile(FileName.lpstrFile, // open pe file 
 70 
 71                 GENERIC_READ, // open for reading 
 72 
 73                 FILE_SHARE_READ || FILE_SHARE_WRITE, // share for reading 
 74 
 75                 NULL, // no security 
 76 
 77                 OPEN_EXISTING, // existing file only 
 78 
 79                 FILE_ATTRIBUTE_NORMAL, // normal file 
 80 
 81                 NULL); // no attr. template 
 82 
 83 
 84             if (hFile  == INVALID_HANDLE_VALUE)
 85             {
 86                 MessageBox(hDlg, "Could not open file.", "ERROR", MB_ICONERROR);
 87                 break;// process error 
 88 
 89             }
 90 
 91             if (GetFileSize(hFile, NULL) != 0)
 92             {
 93                 hFileMap  = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
 94                 if (hFileMap != 0)
 95                 {
 96                     lpMemory  = MapViewOfFile(hFileMap, FILE_MAP_READ, NULL, NULL, NULL);
 97                 }
 98             }
 99 
100             if (IsPeFile(lpMemory))
101             {
102 
103                 pFileHeader  = GetFileHeader(lpMemory);
104                 pOptionHeader  = GetOptionalHeader(lpMemory);
105                 if (!(pFileHeader&&pOptionHeader))
106                 {
107                     MessageBox(hDlg, "获取文件头指针失败", "PEINFO", MB_ICONERROR);
108                     break;
109                 }
110                 else
111                 {
112                     wsprintf(Buff, "%04lX", pFileHeader->Machine);
113                     SetDlgItemText(hDlg, IDC_MACHINE, Buff);
114 
115                     wsprintf(Buff, "%04lX", pFileHeader->NumberOfSections);
116                     SetDlgItemText(hDlg, IDC_NUMSECTION, Buff);
117 
118                     wsprintf(Buff, "%04lX", pOptionHeader->Magic);
119                     SetDlgItemText(hDlg, IDC_MAGIC, Buff);
120 
121                     wsprintf(Buff, "%08lX", pOptionHeader->AddressOfEntryPoint);
122                     SetDlgItemText(hDlg, IDC_ENTERPOINT, Buff);
123 
124                     wsprintf(Buff, "%08lX", pOptionHeader->DataDirectory[0].VirtualAddress);
125                     SetDlgItemText(hDlg, IDC_EDIT_RVA_EXPORT, Buff);
126 
127                     wsprintf(Buff, "%08lX", pOptionHeader->DataDirectory[0].Size);
128                     SetDlgItemText(hDlg, IDC_EDIT_SIZE_EXPORT, Buff);
129 
130                     wsprintf(Buff, "%08lX", pOptionHeader->DataDirectory[1].VirtualAddress);
131                     SetDlgItemText(hDlg, IDC_EDIT_RVA_IMPORT, Buff);
132 
133                     wsprintf(Buff, "%08lX", pOptionHeader->DataDirectory[1].Size);
134                     SetDlgItemText(hDlg, IDC_EDIT_SIZE_IMPORT, Buff);
135 
136                     wsprintf(Buff, "%08lX", pOptionHeader->DataDirectory[2].VirtualAddress);
137                     SetDlgItemText(hDlg, IDC_EDIT_RVA_RES, Buff);
138 
139                     wsprintf(Buff, "%08lX", pOptionHeader->DataDirectory[2].Size);
140                     SetDlgItemText(hDlg, IDC_EDIT_SIZE_RES, Buff);
141 
142 
143 
144                 }
145 
146 
147             }
148             else
149             {
150                 MessageBox(hDlg, "你选择的不是PE文件", "error", MB_ICONERROR);
151                 UnmapViewOfFile(lpMemory);
152                 CloseHandle(hFileMap);
153                 CloseHandle(hFile);
154             }
155             UnmapViewOfFile(lpMemory);
156             CloseHandle(hFileMap);
157             CloseHandle(hFile);
158 
159             break;
160 
161 
162         }
163 
164 
165     }
166     return FALSE;
167 }
168 
169 BOOL    IsPeFile(LPVOID    ImageBase) //判断是否是PE文件结构
170 
171 {
172     PIMAGE_DOS_HEADER    pDosHeader  = NULL;
173     PIMAGE_NT_HEADERS    pNtHeader  = NULL;
174 
175     if (!ImageBase)
176         return FALSE;
177     pDosHeader  = (PIMAGE_DOS_HEADER)ImageBase;
178     if (pDosHeader->e_magic  != IMAGE_DOS_SIGNATURE)
179         return FALSE;
180     pNtHeader  = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader + pDosHeader->e_lfanew);
181     if (pNtHeader->Signature  != IMAGE_NT_SIGNATURE )
182         return    FALSE;
183     return        TRUE;
184 }
185 
186 //FileHeader 内容的读取
187 
188 
189 PIMAGE_NT_HEADERS    GetNtHeader(LPVOID    ImageBase) //获取NT结构指针
190 
191 {
192     PIMAGE_DOS_HEADER    pDosHeader  = NULL;
193     PIMAGE_NT_HEADERS    pNtHeader  = NULL;
194 
195     if (!IsPeFile(ImageBase))
196         return    NULL;
197     pDosHeader  = (PIMAGE_DOS_HEADER)ImageBase;
198     pNtHeader  = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader + pDosHeader->e_lfanew);
199     return        pNtHeader;
200 }
201 
202 PIMAGE_FILE_HEADER    WINAPI    GetFileHeader(LPVOID    Imagebase)
203 {
204     PIMAGE_FILE_HEADER    pFileHeader;
205     PIMAGE_NT_HEADERS    pNtHeader  = NULL;
206     pNtHeader  = GetNtHeader(Imagebase);
207     if (!pNtHeader)
208         return    NULL;
209     pFileHeader  = &pNtHeader->FileHeader;
210     return    pFileHeader;
211 }
212 
213 PIMAGE_OPTIONAL_HEADER    GetOptionalHeader(LPVOID    ImageBase)
214 {
215     PIMAGE_OPTIONAL_HEADER    pOptionHeader  = NULL;
216     PIMAGE_NT_HEADERS    pNtHeader  = NULL;
217     pNtHeader  = GetNtHeader(ImageBase);
218     if (!pNtHeader)
219         return    NULL;
220     pOptionHeader  = &pNtHeader->OptionalHeader;
221     return    pOptionHeader;
222 }

 

转载于:https://www.cnblogs.com/shercy/p/6550186.html

相关文章:

  • 判断用户名是否正确
  • loadrunner中Windows Resource没有数据或不可用
  • vue-todolist-example学习
  • javaScript事件(八)事件类型之变动事件
  • 白话机器学习
  • JavaScript的异步运行机制
  • 嵌入式软件设计第7次实验报告
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • httpclient 优化
  • PHPCMSV9上线方法及文件权限设置
  • 推理题:猜扑克牌
  • JS获取首字母
  • zabbix-----5-----自动发现的概念
  • NTP时钟同步学习记录
  • java基础知识 构造方法
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 30秒的PHP代码片段(1)数组 - Array
  • canvas绘制圆角头像
  • CAP理论的例子讲解
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript实现分页效果
  • Java超时控制的实现
  • Java读取Properties文件的六种方法
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • TypeScript实现数据结构(一)栈,队列,链表
  • 阿里研究院入选中国企业智库系统影响力榜
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 成为一名优秀的Developer的书单
  • 讲清楚之javascript作用域
  • 使用 @font-face
  • 微信小程序--------语音识别(前端自己也能玩)
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • #include<初见C语言之指针(5)>
  • (done) 两个矩阵 “相似” 是什么意思?
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (三)mysql_MYSQL(三)
  • (一)SpringBoot3---尚硅谷总结
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)EOS中账户、钱包和密钥的关系
  • 、写入Shellcode到注册表上线
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • @Service注解让spring找到你的Service bean
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [16/N]论得趣
  • [AAuto]给百宝箱增加娱乐功能
  • [BZOJ] 3262: 陌上花开
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [C++]指针与结构体
  • [CSS]CSS 的背景
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战