• 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 }
  • 相关阅读:
    java环境变量配置(Windows & Linux)
    转行自学编程的前提条件和能力
    IntelliJ IDEA 视频教程
    小孩都懂得用“头衔”来包装自己了,那么你呢?
    自创“乒乓球自嗨玩法”
    什么是npm以及npm基本命令
    hexo本地搭建以及在github远程部署
    如何下载Java-配置环境全教程
    图的存储结构以及遍历
    二叉树的存储结构以及遍历
  • 原文地址:https://www.cnblogs.com/shercy/p/6550186.html
Copyright © 2020-2023  润新知