亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

PE文件格式詳解(3)

2019-11-17 05:04:19
字體:
來源:轉載
供稿:網友
  PE可選頭部  PE可執行文件中接下來的224個字節組成了PE可選頭部。雖然它的名字是“可選頭部”,但是請確信:這個頭部并非“可選”,而是“必需”的。

  OPTHDROFFSET宏可以獲得指向可選頭部的指針:
  PEFILE.H
  #define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + /
                        ((PIMAGE_DOS_HEADER)a)->e_lfanew + /
                        SIZE_OF_NT_SIGNATURE + /
                        sizeof(IMAGE_FILE_HEADER)))
  可選頭部包含了很多關于可執行映像的重要信息,例如初始的堆棧大小、程序入口點的位置、首選基地址、操作系統版本、段對齊的信息等等。

  IMAGE_OPTIONAL_HEADER結構如下:
  WINNT.H
  typedef strUCt _IMAGE_OPTIONAL_HEADER {
  //
  // 標準域
  //
  USHORT Magic;
  UCHAR MajorLinkerVersion;
  UCHAR MinorLinkerVersion;
  ULONG SizeOfCode;
  ULONG SizeOfInitializedData;
  ULONG SizeOfUninitializedData;
  ULONG AddressOfEntryPoint;
  ULONG BaSEOfCode;
  ULONG BaseOfData;
  //
  // NT附加域
  //
  ULONG ImageBase;
  ULONG SectionAlignment;
  ULONG FileAlignment;
  USHORT MajorOperatingSystemVersion;
  USHORT MinorOperatingSystemVersion;
  USHORT MajorImageVersion;
  USHORT MinorImageVersion;
  USHORT MajorSubsystemVersion;
  USHORT MinorSubsystemVersion;
  ULONG Reserved1;
  ULONG SizeOfImage;
  ULONG SizeOfHeaders;
  ULONG CheckSum;


  USHORT Subsystem;
  USHORT DllCharacteristics;
  ULONG SizeOfStackReserve;
  ULONG SizeOfStackCommit;
  ULONG SizeOfHeaPReserve;
  ULONG SizeOfHeapCommit;
  ULONG LoaderFlags;
  ULONG NumberOfRvaAndSizes;

  IMAGE_DATA_DirectorY DataDirectory   [IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  } IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

  如你所見,這個結構中所列出的域實在是冗長得過分。為了不讓你對所有這些域感到厭煩,我會僅僅討論有用的——就是說,對于探究PE文件格式而言有用的?! ?STRONG>標準域  首先,請注重這個結構被劃分為“標準域”和“NT附加域”。所謂標準域,就是和UNIX可執行文件的COFF格式所公共的部分。雖然標準域保留了COFF中定義的名字,但是Windows NT仍然將它們用作了不同的目的——盡管換個名字更好一些。

  ·Magic。我不知道這個域是干什么的,對于示例程序EXEVIEW.EXE示例程序而言,這個值是0x010B或267(譯注:0x010B為.EXE,0x0107為ROM映像,這個信息我是從eXeScope上得來的)。

  ·MajorLinkerVersion、MinorLinkerVersion。表示鏈接此映像的鏈接器版本。隨Window NT build 438配套的Windows NT SDK包含的鏈接器版本是2.39(十六進制為2.27)。

  ·SizeOfCode??蓤绦写a尺寸。
  ·SizeOfInitializedData。已初始化的數據尺寸。
  ·SizeOfUninitializedData。未初始化的數據尺寸。
  ·AddressOfEntryPoint。在標準域中,AddressOfEntryPoint域是對PE文件格式來說最為有趣的了。這個域表示應用程序入口點的位置。并且,對于系統黑客來說,這個位置就是導入地址表(IAT)的末尾。以下的函數示范了如何從可選頭部獲得Windows NT可執行映像的入口點。

  PEFILE.C
  LPVOID WINAPI GetModuleEntryPoint(LPVOID lpFile)
  {
  PIMAGE_OPTIONAL_HEADER poh;
  poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);
  if (poh != NULL)
    return (LPVOID)poh->AddressOfEntryPoint;
  else
    return NULL;
  }
  ·BaseOfCode。已載入映像的代碼(“.text”段)的相對偏移量。
  ·BaseOfData。已載入映像的未初始化數據(“.bss”段)的相對偏移量。   Windows NT附加域
  添加到Windows NT PE文件格式中的附加域為Windows NT特定的進程行為提供了裝載器的支持,以下為這些域的概述。

  ·ImageBase。進程映像地址空間中的首選基地址。Windows NT的Microsoft Win32 SDK鏈接器將這個值默認設為0x00400000,但是你可以使用-BASE:linker開關改變這個值。

  ·SectionAlignment。從ImageBase開始,每個段都被相繼的裝入進程的地址空間中。SectionAlignment則規定了裝載時段能夠占據的最小空間數量——就是說,段是關于SectionAlignment對齊的。

  Windows NT虛擬內存治理器規定,段對齊不能少于頁尺寸(當前的x86平臺是4096字節),并且必須是成倍的頁尺寸。4096字節是x86鏈接器的默認值,但是它可以通過-ALIGN: linker開關來設置。

  ·FileAlignment。映像文件首先裝載的最小的信息塊間隔。例如,鏈接器將一個段實體(段的原始數據)加零擴展為文件中最接近的FileAlignment邊界。早先提及的2.39版鏈接器將映像文件以0x200字節的邊界對齊,這個值可以被強制改為512到65535這么多。

  ·MajorOperatingSystemVersion。表示Windows NT操作系統的主版本號;通常對Windows NT 1.0而言,這個值被設為1。

  ·MinorOperatingSystemVersion。表示Windows NT操作系統的次版本號;通常對Windows NT 1.0而言,這個值被設為0。

  ·MajorImageVersion。用來表示應用程序的主版本號;對于Microsoft Excel 4.0而言,這個值是4。

  ·MinorImageVersion。用來表示應用程序的次版本號;對于Microsoft Excel 4.0而言,這個值是0。


  ·MajorSubsystemVersion。表示Windows NT Win32子系統的主版本號;通常對于Windows NT 3.10而言,這個值被設為3。

  ·MinorSubsystemVersion。表示Windows NT Win32子系統的次版本號;通常對于Windows NT 3.10而言,這個值被設為10。

  ·Reserved1。未知目的,通常不被系統使用,并被鏈接器設為0。

  ·SizeOfImage。表示載入的可執行映像的地址空間中要保留的地址空間大小,這個數字很大程度上受SectionAlignment的影響。   例如,考慮一個擁有固定頁尺寸4096字節的系統,假如你有一個11個段的可執行文件,它的每個段都少于4096字節,并且關于65536字節邊界對齊,那么SizeOfImage域將會被設為11 * 65536 = 720896(176頁)。

  而假如一個相同的文件關于4096字節對齊的話,那么SizeOfImage域的結果將是11 * 4096 = 45056(11頁)。這只是個簡單的例子,它說明每個段需要少于一個頁面的內存。在現實中,鏈接器通過個別地計算每個段的方法來決定SizeOfImage確切的值。它首先決定每個段需要多少字節,并且最后將頁面總數向上取整至最接近的SectionAlignment邊界,然后總數就是每個段個別需求之和了。

  ·SizeOfHeaders。這個域表示文件中有多少空間用來保存所有的文件頭部,包括MS-DOS頭部、PE文件頭部、PE可選頭部以及PE段頭部。文件中所有的段實體就開始于這個位置。

  ·CheckSum。校驗和是用來在裝載時驗證可執行文件的,它是由鏈接器設置并檢驗的。由于創建這些校驗和的算法是私有信息,所以在此不進行討論。

  ·Subsystem。用于標識該可執行文件目標子系統的域。每個可能的子系統取值列于WINNT.H的IMAGE_OPTIONAL_HEADER結構之后。

  ·DllCharacteristics。用來表示一個DLL映像是否為進程和線程的初始化及終止包含入口點的標記。

  ·SizeOfStackReserve、SizeOfStackCommit、SizeOfHeapReserve、SizeOfHeapCommit。這些域控制要保留的地址空間數量,并且負責棧和默認堆的申請。在默認情況下,棧和堆都擁有1個頁面的申請值以及16個頁面的保留值。這些值可以使用鏈接器開關-STACKSIZE:與-HEAPSIZE:來設置。

  ·LoaderFlags。告知裝載器是否在裝載時中止和調試,或者默認地正常運行。

  ·NumberOfRvaAndSizes。這個域標識了接下來的DataDirectory數組。請注重它被用來標識這個數組,而不是數組中的各個入口數字,這一點非常重要。

  ·DataDirectory。數據目錄表示文件中其它可執行信息重要組成部分的位置。它事實上就是一個IMAGE_DATA_DIRECTORY結構的數組,位于可選頭部結構的末尾。當前的PE文件格式定義了16種可能的數據目錄,這之中的11種現在在使用中。   數據目錄  WINNT.H之中所定義的數據目錄為:

  WINNT.H
  // 目錄入口
  // 導出目錄
  #define IMAGE_DIRECTORY_ENTRY_EXPORT 0
  // 導入目錄
  #define IMAGE_DIRECTORY_ENTRY_IMPORT 1
  // 資源目錄
  #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
  // 異常目錄
  #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
  // 安全目錄
  #define IMAGE_DIRECTORY_ENTRY_SECURITY 4
  // 重定位基本表
  #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
  // 調試目錄
  #define IMAGE_DIRECTORY_ENTRY_DEBUG 6

  // 描述字串
  #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7
  // 機器值(MipS GP)
  #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8
  // TLS目錄
  #define IMAGE_DIRECTORY_ENTRY_TLS 9
  // 載入配置目錄
  #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10

  基本上,每個數據目錄都是一個被定義為IMAGE_DATA_DIRECTORY的結構。雖然數據目錄入口本身是相同的,但是每個特定的目錄種類卻是完全唯一的。每個數據目錄的定義在本文的以后部分被描述為“預定義段”。

  WINNT.H
  typedef struct _IMAGE_DATA_DIRECTORY {
  ULONG VirtualAddress;
  ULONG Size;
  } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

  每個數據目錄入口指定了該目錄的尺寸和相對虛擬地址。假如你要定義一個特定的目錄的話,就需要從可選頭部中的數據目錄數組中決定相對的地址,然后使用虛擬地址來決定該目錄位于哪個段中。一旦你決定了哪個段包含了該目錄,該段的段頭部就會被用于查找數據目錄的精確文件偏移量位置。

  所以要獲得一個數據目錄的話,那么首先你需要了解段的概念。我在下面會對其進行描述,這個討論之后還有一個有關如何定位數據目錄的示例。(未完待續)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情一级二级| 亚洲精品在线91| 一本色道久久88精品综合| 欧美一级大片视频| 91av网站在线播放| 亚洲直播在线一区| 97av在线视频| 久久99亚洲精品| 亚洲女人天堂成人av在线| 国产精品热视频| 亚洲女人初尝黑人巨大| 欧洲永久精品大片ww免费漫画| 亚洲欧美成人在线| 日韩欧美第一页| 91精品美女在线| 日韩小视频在线| 久久97久久97精品免视看| 亚洲综合在线中文字幕| 78m国产成人精品视频| 欧美精品免费播放| 91在线色戒在线| 国产精品永久免费视频| 亚洲电影免费观看高清完整版在线观看| 全球成人中文在线| 中文字幕日韩专区| 亚洲国产精品久久久| 成人精品视频99在线观看免费| 欧美日韩国产中文精品字幕自在自线| 精品亚洲国产视频| 国产精品pans私拍| 国产高清视频一区三区| 日韩精品视频在线观看免费| 97婷婷涩涩精品一区| 亚洲性视频网址| 国产日产亚洲精品| 亚洲女人被黑人巨大进入| 国产91精品不卡视频| 一区二区三区黄色| 亚洲欧洲自拍偷拍| 色偷偷88888欧美精品久久久| 久久国产精品久久久久久久久久| 亚洲综合国产精品| 性色av一区二区三区免费| 国产精品视频免费在线观看| 日韩av一区二区在线观看| 国产精品久久久久久久久久99| 成人免费在线视频网站| 98精品在线视频| 欧美在线观看网址综合| 成人两性免费视频| 日韩亚洲欧美中文高清在线| 欧美另类69精品久久久久9999| 91精品在线观看视频| 日韩欧美精品网址| 欧美成人四级hd版| 日本成人黄色片| 中文.日本.精品| 国产日韩欧美夫妻视频在线观看| 亚洲美女在线观看| www.久久久久| 国产精品成人一区二区三区吃奶| 亚洲欧美一区二区三区四区| 精品国产91久久久| 黄色精品在线看| 欧洲s码亚洲m码精品一区| 97精品在线观看| 中文字幕av一区二区三区谷原希美| 亚洲电影第1页| 国产成人精品免高潮在线观看| 亚洲a在线播放| 欧美日韩在线视频观看| 国产精品视频永久免费播放| 亚洲xxxxx电影| 精品成人国产在线观看男人呻吟| 亚洲一区二区三区777| 国产精品av电影| 精品免费在线观看| 91高清视频免费| 亚洲精品永久免费精品| 中文国产成人精品| 欧美性受xxxx黑人猛交| 国产精品一区=区| 亚洲精品福利在线观看| 亚洲精品成a人在线观看| 亚洲免费影视第一页| 中文字幕在线看视频国产欧美在线看完整| 成人免费视频97| 午夜精品久久久久久久白皮肤| 欧美性猛交xxx| 久久久久www| 亚洲精品国产综合区久久久久久久| 日韩高清电影免费观看完整版| 日韩在线视频一区| 久久国产精品影片| 国产精品成熟老女人| 97视频在线观看视频免费视频| 97国产精品免费视频| 国产精品成av人在线视午夜片| 欧美国产第二页| 亚洲第一页在线| 国内精品久久久久伊人av| 久久精品国产一区| 久久视频国产精品免费视频在线| 成人美女av在线直播| 日韩av免费看网站| 亚洲男人的天堂网站| 亚洲欧美三级伦理| 国产精品一区二区三区毛片淫片| 精品一区电影国产| 国产丝袜一区二区三区免费视频| 日本精品一区二区三区在线| 国产精品美女久久| 2019亚洲日韩新视频| 亚洲日本成人女熟在线观看| 国产午夜精品全部视频在线播放| 欧美极品少妇与黑人| 欧美日韩在线第一页| 国产欧美一区二区白浆黑人| 久久久久久久久久久久av| 精品国产一区二区三区久久| 国产精品高潮呻吟久久av无限| 亚洲欧美日韩一区二区在线| 精品久久久久久亚洲国产300| 国产精品草莓在线免费观看| 久久精品中文字幕免费mv| 国产精品中文字幕久久久| 另类图片亚洲另类| 久久精品男人天堂| 国产一区红桃视频| 欧美理论电影在线播放| 国产欧美日韩亚洲精品| 久久乐国产精品| 色偷偷av一区二区三区| 亚洲人成电影网站色…| 一区二区三区视频在线| 亚洲自拍偷拍一区| 91免费看片网站| 91精品视频在线免费观看| 亚洲人成在线观看| 日韩欧美一区视频| 国内免费久久久久久久久久久| 国产精品久久久av| 国产精品成人品| 日韩久久精品成人| 亚洲一二三在线| 久久久久久久久久久亚洲| 久久久人成影片一区二区三区| 国产香蕉一区二区三区在线视频| 隔壁老王国产在线精品| 欧美日韩在线视频观看| 亚洲一区二区精品| www国产精品视频| 欧美一区在线直播| 国产精品久久久av| 精品无人区太爽高潮在线播放| 亚洲国产精品字幕| 在线亚洲国产精品网| 亚洲男人天堂网站| 国产精品香蕉国产| 欧美福利小视频| 亚洲a在线观看| 国产视频精品一区二区三区| 久久精品2019中文字幕| 欧美性20hd另类|