zoukankan      html  css  js  c++  java
  • 获取pe文件的文件类型

    工程文件petype.cpp通过调用pefile类中的函数获取文件类型。

    文件类型的判断通过5个监测点完成。

    监测点1:dos头的e_magic

    监测点2:nt头的Signature

    监测点3:文件头的Characteristics

    监测点4:可选头的Magic

    监测点5:可选头的Subsystem

    通过监测点1和2判断是否是pe文件;

    通过监测点3判断文件是否是动态库文件

    通过监测点4判断文件是pe32还是pe32+还是rom映像

    通过监测点5判断文件是否是0环可执行文件[驱动文件],还是3环可执行文件[exe文件]

    具体代码参见下面:

    pefile.h

      1 #ifndef PE_FILE_H
      2 #define PE_FILE_H
      3 #include "windows.h"
      4 
      5 #define ISMZHEADER            (*(WORD*)File_memory == 0x5a4d)
      6 #define ISPEHEADER            (*(WORD*)((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c)) == 0x4550)
      7 #define ISPE32MAGIC            (*(WORD*)((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c) + sizeof(MX_IMAGE_FILE_HEADER) + 4) == 0x10b)
      8 #define ISPE64MAGIC            (*(WORD*)((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c) + sizeof(MX_IMAGE_FILE_HEADER) + 4) == 0x20b)
      9 #define ISPEROMMAGIC        (*(WORD*)((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c) + sizeof(MX_IMAGE_FILE_HEADER) + 4) == 0x107)
     10 
     11 
     12 #define X_PE_32                32
     13 #define X_PE_64                64
     14 
     15 #define    READ_ERRO            0x0
     16 #define    NOT_PE_FILE            0x200
     17 #define    PE_FILE                0x100
     18 #define    PE64_FILE            0x40
     19 #define    PE32_FILE            0x20
     20 #define    ROM_IMAGE            0x10
     21 #define    EXE_FILE            0x8
     22 #define    DLL_FILE            0x4
     23 #define    SYS_FILE            0x2
     24 #define    OTHER_FILE            0x1
     25 
     26 
     27 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16
     28 #define X_EXPORT            0
     29 #define X_IMPORT            1
     30 #define X_RESOURSE            2
     31 #define X_EXCEPTION            3
     32 #define X_CERTIFICATE        4
     33 #define X_BASE_RELOCATION    5
     34 #define X_DEBUG                6
     35 #define X_ARCHITECTURE        7
     36 #define X_GLOBAL_PTR        8
     37 #define X_TLS                9
     38 #define X_LOAD_CONFIG        10
     39 #define X_BAND_IMPORT        11
     40 #define X_IAT                12
     41 #define X_DELAY_IMPORT        13
     42 #define X_COM_HEADER        14
     43 #define X_RESERVED            15
     44 
     45 typedef struct X_IMAGE_DOS_HEADER {      // DOS .EXE header
     46     WORD   e_magic;                     // Magic number
     47     WORD   e_cblp;                      // Bytes on last page of file
     48     WORD   e_cp;                        // Pages in file
     49     WORD   e_crlc;                      // Relocations
     50     WORD   e_cparhdr;                   // Size of header in paragraphs
     51     WORD   e_minalloc;                  // Minimum extra paragraphs needed
     52     WORD   e_maxalloc;                  // Maximum extra paragraphs needed
     53     WORD   e_ss;                        // Initial (relative) SS value
     54     WORD   e_sp;                        // Initial SP value
     55     WORD   e_csum;                      // Checksum
     56     WORD   e_ip;                        // Initial IP value
     57     WORD   e_cs;                        // Initial (relative) CS value
     58     WORD   e_lfarlc;                    // File address of relocation table
     59     WORD   e_ovno;                      // Overlay number
     60     WORD   e_res[4];                    // Reserved words
     61     WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
     62     WORD   e_oeminfo;                   // OEM information; e_oemid specific
     63     WORD   e_res2[10];                  // Reserved words
     64     LONG   e_lfanew;                    // File address of new exe header
     65   } MX_IMAGE_DOS_HEADER;
     66 
     67 typedef struct X_IMAGE_FILE_HEADER {
     68     WORD    Machine;
     69     WORD    NumberOfSections;
     70     DWORD   TimeDateStamp;
     71     DWORD   PointerToSymbolTable;
     72     DWORD   NumberOfSymbols;
     73     WORD    SizeOfOptionalHeader;
     74     WORD    Characteristics;
     75 } MX_IMAGE_FILE_HEADER;
     76 
     77 typedef struct X_IMAGE_DATA_DIRECTORY {
     78     DWORD   VirtualAddress;
     79     DWORD   Size;
     80 } MX_IMAGE_DATA_DIRECTORY;
     81 
     82 typedef struct X_IMAGE_OPTIONAL_HEADER32 {
     83     WORD    Magic;
     84     BYTE    MajorLinkerVersion;
     85     BYTE    MinorLinkerVersion;
     86     DWORD   SizeOfCode;
     87     DWORD   SizeOfInitializedData;
     88     DWORD   SizeOfUninitializedData;
     89     DWORD   AddressOfEntryPoint;
     90     DWORD   BaseOfCode;
     91     DWORD   BaseOfData;
     92     DWORD   ImageBase;
     93     DWORD   SectionAlignment;
     94     DWORD   FileAlignment;
     95     WORD    MajorOperatingSystemVersion;
     96     WORD    MinorOperatingSystemVersion;
     97     WORD    MajorImageVersion;
     98     WORD    MinorImageVersion;
     99     WORD    MajorSubsystemVersion;
    100     WORD    MinorSubsystemVersion;
    101     DWORD   Win32VersionValue;
    102     DWORD   SizeOfImage;
    103     DWORD   SizeOfHeaders;
    104     DWORD   CheckSum;
    105     WORD    Subsystem;
    106     WORD    DllCharacteristics;
    107     DWORD   SizeOfStackReserve;
    108     DWORD   SizeOfStackCommit;
    109     DWORD   SizeOfHeapReserve;
    110     DWORD   SizeOfHeapCommit;
    111     DWORD   LoaderFlags;
    112     DWORD   NumberOfRvaAndSizes;
    113     MX_IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    114 } MX_IMAGE_OPTIONAL_HEADER32;
    115 
    116 
    117 typedef struct X_IMAGE_OPTIONAL_HEADER64 {
    118     WORD        Magic;
    119     BYTE        MajorLinkerVersion;
    120     BYTE        MinorLinkerVersion;
    121     DWORD       SizeOfCode;
    122     DWORD       SizeOfInitializedData;
    123     DWORD       SizeOfUninitializedData;
    124     DWORD       AddressOfEntryPoint;
    125     DWORD       BaseOfCode;
    126     ULONGLONG   ImageBase;
    127     DWORD       SectionAlignment;
    128     DWORD       FileAlignment;
    129     WORD        MajorOperatingSystemVersion;
    130     WORD        MinorOperatingSystemVersion;
    131     WORD        MajorImageVersion;
    132     WORD        MinorImageVersion;
    133     WORD        MajorSubsystemVersion;
    134     WORD        MinorSubsystemVersion;
    135     DWORD       Win32VersionValue;
    136     DWORD       SizeOfImage;
    137     DWORD       SizeOfHeaders;
    138     DWORD       CheckSum;
    139     WORD        Subsystem;
    140     WORD        DllCharacteristics;
    141     ULONGLONG   SizeOfStackReserve;
    142     ULONGLONG   SizeOfStackCommit;
    143     ULONGLONG   SizeOfHeapReserve;
    144     ULONGLONG   SizeOfHeapCommit;
    145     DWORD       LoaderFlags;
    146     DWORD       NumberOfRvaAndSizes;
    147     IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    148 } MX_IMAGE_OPTIONAL_HEADER64;
    149 
    150 typedef struct X_IMAGE_NT_HEADERS32 {
    151     DWORD Signature;
    152     MX_IMAGE_FILE_HEADER FileHeader;
    153     MX_IMAGE_OPTIONAL_HEADER32 OptionalHeader;
    154 } MX_IMAGE_NT_HEADERS32;
    155 
    156 typedef struct X_IMAGE_NT_HEADERS64 {
    157     DWORD Signature;
    158     MX_IMAGE_FILE_HEADER FileHeader;
    159     MX_IMAGE_OPTIONAL_HEADER64 OptionalHeader;
    160 } MX_IMAGE_NT_HEADERS64;
    161 
    162 class XPEFILE
    163 {
    164 public:
    165     XPEFILE(char* lpFileName);
    166     virtual ~XPEFILE();
    167     int GetType();
    168     int GetSize();
    169 private:
    170     void* File_memory;
    171     int File_size;
    172     int File_type;
    173 };
    174 
    175 #endif
    pefile.h

    pefile.cpp

      1 #include "stdafx.h"
      2 #include "windows.h"
      3 #include "pefile.h"
      4 #include <iostream>
      5 
      6 XPEFILE::XPEFILE(char* strFileName)
      7 {
      8     HANDLE hfile;
      9     unsigned long sizehigh;
     10     void* lpmemory;
     11 
     12     File_memory = NULL;
     13     File_type = READ_ERRO;
     14 
     15     hfile = CreateFile(strFileName, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
     16     if (hfile != INVALID_HANDLE_VALUE)
     17     {
     18         File_size = GetFileSize(hfile, NULL);
     19         lpmemory = LocalAlloc(LPTR,File_size);
     20         if(ReadFile(hfile,lpmemory,File_size,&sizehigh,0) != NULL)
     21         {
     22             File_memory = lpmemory;
     23         }
     24         CloseHandle(hfile);
     25     }
     26 }
     27 
     28 
     29 
     30 
     31 XPEFILE::~XPEFILE()
     32 {
     33     if (File_memory == NULL)
     34     {
     35         LocalFree(File_memory);
     36     }
     37 }
     38 
     39 int XPEFILE::GetSize()
     40 {
     41     return File_size;
     42 }
     43 
     44 int XPEFILE::GetType()
     45 {
     46     MX_IMAGE_NT_HEADERS32* ntheader32;
     47     MX_IMAGE_NT_HEADERS64* ntheader64;
     48 
     49     File_type = READ_ERRO;
     50 
     51     if (File_memory == NULL)
     52     {
     53         return File_type;
     54     }
     55     File_type = NOT_PE_FILE;
     56 //    if ((*(WORD*)File_memory == 0x5a4d)    && (*(WORD*)((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c)) == 0x4550))
     57     if(ISMZHEADER && ISPEHEADER)
     58     {
     59         File_type = PE_FILE;
     60     }
     61     if (File_type == PE_FILE)
     62     {
     63 //        if (*(WORD*)((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c) + sizeof(MX_IMAGE_FILE_HEADER) + 4) == 0x10b)
     64         if (ISPE32MAGIC)
     65         {
     66             File_type = File_type | PE32_FILE;
     67             ntheader32 = (MX_IMAGE_NT_HEADERS32*) ((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c));
     68             if (ntheader32->FileHeader.Characteristics & 0x2000)
     69             {
     70                 File_type = File_type | DLL_FILE;
     71             }
     72             else if ((ntheader32->OptionalHeader.Subsystem & 2)|(ntheader32->OptionalHeader.Subsystem & 3))
     73             {
     74                 File_type = File_type | EXE_FILE;
     75             }
     76             else if (ntheader32->OptionalHeader.Subsystem & 1)
     77             {
     78                 File_type = File_type | SYS_FILE;
     79             }
     80         }
     81 //        if (*(WORD*)((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c) + sizeof(MX_IMAGE_FILE_HEADER) + 4) == 0x20b)
     82         if (ISPE64MAGIC)
     83         {
     84             File_type = File_type | PE64_FILE;
     85             ntheader64 = (MX_IMAGE_NT_HEADERS64*) ((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c));
     86             if (ntheader64->FileHeader.Characteristics & 0x2000)
     87             {
     88                 File_type = File_type | DLL_FILE;
     89             }
     90             else if ((ntheader64->OptionalHeader.Subsystem & 2)|(ntheader64->OptionalHeader.Subsystem & 3))
     91             {
     92                 File_type = File_type | EXE_FILE;
     93             }
     94             else if (ntheader64->OptionalHeader.Subsystem & 1)
     95             {
     96                 File_type = File_type | SYS_FILE;
     97             }
     98         }
     99 //        if (*(WORD*)((BYTE*)File_memory + *(DWORD*)((BYTE*)File_memory + 0x3c) + sizeof(MX_IMAGE_FILE_HEADER) + 4) == 0x107)
    100         if (ISPEROMMAGIC)
    101         {
    102             File_type = File_type | ROM_IMAGE;
    103         }
    104     }
    105     return  File_type;
    106 }
    pefile.cpp

    petype.cpp

     1 #include "stdafx.h"
     2 #include "pefile.h"
     3 #include <iostream>
     4  
     5 int main(int argc, char* argv[])
     6 {
     7     int filetype;
     8 
     9     char* file = "c:\1.exe";
    10     XPEFILE pefile1(file);
    11     
    12     filetype = pefile1.GetType();
    13 
    14     system("pause");
    15     return 0;
    16 }
    petype.cpp
  • 相关阅读:
    使用selenium操作ant design前端的页面,感觉页面没加载完
    centos7上PhantomJS 过期之后改用Chrome时填的坑
    《追风行动》有点儿意思
    《听读书怪才解读24部名人传记》笔记
    mysql 8.0 密码加密方式的坑
    huginn website agent对提取结果排序
    Server酱微信推送中的问题
    Huginn定时时间不准确或延后问题
    一本通1219 马走日
    矩阵快速幂
  • 原文地址:https://www.cnblogs.com/Mikhail/p/4448877.html
Copyright © 2011-2022 走看看