1. 程式人生 > >PE檔案結構(0x02)

PE檔案結構(0x02)

 最

    最近包括暑假一直在學習PE檔案的格式結構,對一些病毒感染檔案的方式想要做一些瞭解,學的東西可能很淺顯,在這裡記錄一下想。

PE檔案的第一個位元組起始於 MS-DOS 頭部,被稱作 IMAGE_DOS_HEADER,定義在WINNT.H,其結構如下:

typedef struct _IMAGE_DOS_HEADER { // DOS的.EXE頭部
  WORD     e_magic;                // 魔術數字
  WORD     e_cblp;                 // 檔案最後頁的位元組數
  WORD     e_cp;                   // 檔案頁數
  WORD     e_crlc;                 // 重定義元素個數
  WORD     e_cparhdr;              // 頭部尺寸,以段落為單位
  WORD     e_minalloc;             // 所需的最小附加段
  WORD     e_maxalloc;             // 所需的最大附加段
  WORD     e_ss;                   // 初始的SS值(相對偏移量)
  WORD     e_sp;                   // 初始的SP值
  WORD     e_csum;                 // 校驗和
  WORD     e_ip;                   // 初始的IP值
  WORD     e_cs;                   // 初始的CS值(相對偏移量)
  WORD     e_lfarlc;               // 重分配表文件地址
  WORD     e_ovno;                 // 覆蓋號
  WORD     e_res[4];               // 保留字
  WORD     e_oemid;                // OEM識別符號(相對e_oeminfo)
  WROD     e_oeminfo;              // OEM資訊
  WORD     e_res2[10];             // 保留字
  DWORD    e_lfanew;               // 新exe頭部的檔案地址
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

大小為64位。

第一個域e_magic,被稱為魔術數字,它被用於表示一個MS-DOS相容的檔案型別。所有MS-DOS相容的可執行檔案都將這個值設為0x5A4D,表示ASCII字元MZ。在這裡其他的域我們不做深入。重點我們需要關注的是最後一個大小為雙字,位於60位,也就是0x3C處也就是4個位元組的域 e_lfanew. 通過它我們才能找到PE檔案相關的NT映像頭。

PE_HEADER

PE_HEADER是PE相關的NT映像頭(IMAGE_NT_HEADER)的簡稱,裡面包含PE裝載器的重要欄位。執行體在執行PE檔案操作時,PE裝載器將從IMAGE_DOS_HEADER中的 e_lfanew 

欄位中得到PE檔案頭指標。 需要注意的是,這裡得到的只是地址的偏移量,所以要確定PE頭部的實際記憶體對映地址,我們還需要知道檔案的記憶體對映基址。

     也就是說   PNTHeader = IMAGERBase + DOSHeader --->e_lfanew

 隨便拉一個EXE一下:

拉微信開刀,這裡就是他的e_lfanew的地址值,由於是小端位元組序,我們應該從右往左讀,就是00 00 01 08處,EXE並沒有載入到記憶體中,在這裡基址是0,所以PE開始應該在0x0108 h處。

 

可以看到PE標誌出現。