zoukankan      html  css  js  c++  java
  • 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)" *.exe;*.dll;*.scr;*.fon;*.drv;"*.All File(*.*) *.*";
     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 }
  • 相关阅读:
    Linux 学习 step by step (1)
    ubuntu server nginx 安装与配置
    ubuntu server samba服务器配置
    iOS app集成支付宝支付流程及后台php订单签名处理
    mac 连接windows 共享内容
    linux 文件查找,which,whereis,locate,find
    ubuntu server vsftpd 虚拟用户及目录
    ubuntu server 安装 mantis bug tracker 中文配置
    ubuntu server vsftpd 匿名用户上传下载及目录设置
    linux 用户管理,用户权限管理,用户组管理
  • 原文地址:https://www.cnblogs.com/shercy/p/6550186.html
Copyright © 2011-2022 走看看