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

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

PE文件格式詳解(5)

2019-11-17 05:04:21
字體:
來源:轉載
供稿:網友
  預定義段  一個Windows NT的應用程序典型地擁有9個預定義段,它們是.text、.bss、.rdata、.data、.rsrc、.edata、.idata、.pdata和.debug。一些應用程序不需要所有的這些段,同樣還有一些應用程序為了自己非凡的需要而定義了更多的段。
這種做法與MS-DOS和Windows 3.1中的代碼段和數據段相似。事實上,應用程序定義一個獨特的段的方法是使用標準編譯器來指示對代碼段和數據段的命名,或者使用名稱段編譯器選項-NT——就和Windows 3.1中應用程序定義獨特的代碼段和數據段一樣。

  以下是一個關于Windows NT PE文件之中一些有趣的公共段的討論。  可執行代碼段,.text  Windows 3.1和Windows NT之間的一個區別就是Windows NT默認的做法是將所有的代碼段(正如它們在Windows 3.1中所提到的那樣)組成了一個單獨的段,名為“.text”。既然Windows NT使用了基于頁面的虛擬內存治理系統,那么將分開的代碼放入不同的段之中的做法就不太明智了。因此,擁有一個大的代碼段對于操作系統和應用程序開發者來說,都是十分方便的。

  .text段也包含了早先提到過的入口點。IAT亦存在于.text段之中的模塊入口點之前。(IAT在.text段之中的存在非常有意義,因為這個表事實上是一系列的跳轉指令,并且它們的跳轉目標位置是已固定的地址。)當Windows NT的可執行映像裝載入進程的地址空間時,IAT就和每一個導入函數的物理地址一同確定了。要在.text段之中查找IAT,裝載器只用將模塊的入口點定位,而IAT恰恰出現于入口點之前。既然每個入口擁有相同的尺寸,那么向后退查找這個表的起始位置就很輕易了。  數據段,.bss、.rdata、.data  .bss段表示應用程序的未初始化數據,包括所有函數或源模塊中聲明為static的變量。

  .rdata段表示只讀的數據,比如字符串文字量、常量和調試目錄信息。

  所有其它變量(除了出現在棧上的自動變量)存儲在.data段之中。基本上,這些是應用程序或模塊的全局變量。  資源段,.rsrc  .rsrc段包含了模塊的資源信息。它起始于一個資源目錄結構,這個結構就像其它大多數結構一樣,但是它的數據被更進一步地組織在了一棵資源樹之中。以下的IMAGE_RESOURCE_DirectorY結構形成了這棵樹的根和各個結點。

  WINNT.H
  typedef strUCt _IMAGE_RESOURCE_DIRECTORY {
  ULONG Characteristics;
  ULONG TimeDateStamp;
  USHORT MajorVersion;
  USHORT MinorVersion;
  USHORT NumberOfNamedEntries;
  USHORT NumberOfIdEntries;
  } IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;

  請看這個目錄結構,你將會發現其中竟然沒有指向下一個結點的指針。但是,在這個結構中有兩個域NumberOfNamedEntries和NumberOfIdEntries代替了指針,它們被用來表示這個目錄附有多少入口。附帶說一句,我的意思是目錄入口就在段數據之中的目錄后邊。有名稱的入口按字母升序出現,再往后是按數值升序排列的ID入口。


  一個目錄入口由兩個域組成,正如下面IMAGE_RESOURCE_DIRECTORY_ENTRY結構所描述的那樣:
  WINNT.H
  typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
  ULONG Name;
  ULONG OffsetToData;
  } IMAGE_RESOURCE_DIRECTORY_ENTRY,    *PIMAGE_RESOURCE_DIRECTORY_ENTRY;

  根據樹的層級不同,這兩個域也就有著不同的用途。Name域被用于標識一個資源種類,或者一種資源名稱,或者一個資源的語言ID。OffsetToData與經常被用來在樹之中指向兄弟結點——即一個目錄結點或一個葉子結點。

  葉子結點是資源樹之中最底層的結點,它們定義了當前資源數據的尺寸和位置。IMAGE_RESOURCE_DATA_ENTRY結構被用于描述每個葉子結點:

  WINNT.H
  typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
  ULONG OffsetToData;
  ULONG Size;
  ULONG CodePage;
  ULONG Reserved;
  } IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;

  OffsetToData和Size這兩個域表示了當前資源數據的位置和尺寸。既然這一信息主要是在應用程序裝載以后由函數使用的,那么將OffsetToData作為一個相對虛擬的地址會更有意義一些?!疑酰『檬沁@樣沒錯。
非常有趣的是,所有其它的偏移量,比如從目錄入口到其它目錄的指針,都是相對于根結點位置的偏移量。

  要更清楚地了解這些內容,請參考圖2。  圖2.一個簡單的資源樹結構

  圖2描述了一個非常簡單的資源樹,它包含了僅僅兩個資源對象:一個菜單和一個字串表。更深一層地來說,它們各自都有一個子項。然而,你仍然可以看到資源樹有多么復雜——即使它像這個一樣只有一點點資源。

  在樹的根部,第一個目錄有一個文件中包含的所有資源種類的入口,而不管資源種類有多少。在圖2中,有兩個由樹根標識的入口,一個是菜單的,另一個是字串表的。假如文件中擁有一個或多個對話框資源,那么根結點會再擁有一個入口,因此,就有了對話框資源的另一個分支。

  WINUSER.H中標識了基本的資源種類,我將它們列到了下面:

  WINUSER.H
  /*
  * 預定義的資源種類
  */
  #define RT_CURSOR MAKEINTRESOURCE(1)
  #define RT_BITMAP MAKEINTRESOURCE(2)
  #define RT_ICON MAKEINTRESOURCE(3)
  #define RT_MENU MAKEINTRESOURCE(4)
  #define RT_DIALOG MAKEINTRESOURCE(5)
  #define RT_STRING MAKEINTRESOURCE(6)
  #define RT_FONTDIR MAKEINTRESOURCE(7)
  #define RT_FONT MAKEINTRESOURCE(8)
  #define RT_ACCELERATOR MAKEINTRESOURCE(9)
  #define RT_RCDATA MAKEINTRESOURCE(10)
  #define RT_MESSAGETABLE MAKEINTRESOURCE(11)

  在樹的第一層級,以上列出的MAKEINTRESOURCE值被放置在每個種類入口的Name處,它標識了不同的資源種類。

  每個根目錄的入口都指向了樹中第二層級的一個兄弟結點,這些結點也是目錄,并且每個都擁有它們自己的入口。在這一層級,目錄被用來以給定的種類標識每一個資源種類。假如你的應用程序中有多個菜單,那么樹中的第二層級會為每個菜單都預備一個入口。

  你可能意識到了,資源可以由名稱或整數標識。在這一層級,它們是通過目錄結構的Name域來分辨的。假如假如Name域最重要的位被設置了,那么其它的31個位就會被用作一個到IMAGE_RESOURCE_DIR_STRING_U結構的偏移量。


  WINNT.H
  typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
  USHORT Length;
  WCHAR NameString[1];
  } IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;

  這個結構僅僅是由一個2字節長的Length域和一個UNICODE字符Length組成的。
  另一方面,假如Name域最重要的位被清空,那么它的低31位就被用于表示資源的整數ID。圖2示范的就是菜單資源作為一個命名的資源,以及字串表作為一個ID資源。

  假如有兩個菜單資源,一個由名稱標識,另一個由資源標識,那么它們二者就會在菜單資源目錄之后擁有兩個入口。有名稱的資源入口在第一位,之后是由整數標識的資源。目錄域NumberOfNamedEntries和NumberOfIdEntries將各自包含值1,表示當前的1個入口。

  在第二層級的下面,資源樹就不再更深一步地擴展分支了。第一層級分支至表示每個資源種類的目錄中,第二層級分支至由標識符表示的每個資源的目錄中,第三層級是被個別標識的資源與它們各自的語言ID之間一對一的映射。要表示一個資源的語言ID,目錄入口結構的Name域就被用來表示資源的主語言ID和子語言ID了。Windows NT的Win32 SDK開發包中列出了默認的值資源,例如對于0x0409這個值來說,0x09表示主語言LANG_ENGLISH,0x04則被定義為子語言的SUBLANG_ENGLISH_CAN。所有的語言ID值都定義于Windows NT Win32 SDK開發包的文件WINNT.H中。

  既然語言ID結點是樹中最后的目錄結點,那么入口結構的OffsetToData域就是到一個葉子結點(即前面提到過的IMAGE_RESOURCE_DATA_ENTRY結構)的偏移量。

  再回過頭來參考圖2,你會發現每個語言目錄入口都對應著一個數據入口。這個結點僅僅表示了資源數據的尺寸以及資源數據的相對虛擬地址。

  在資源數據段(.rsrc)之中擁有這么多結構有一個好處,就是你可以不存取資源本身而直接可以從這個段收集很多信息。例如,你可以獲得有多少種資源、哪些資源(假如有的話)使用了非凡的語言ID、特定的資源是否存在以及單獨種類資源的尺寸。
為了示范如何利用這一信息,以下的函數說明了如何決定一個文件中包含的不同種類的資源:

  PEFILE.C
  int WINAPI GetListOfResourceTypes(LPVOID lpFile, HANDLE hHeap,
    char **pszResTypes)
  {
  PIMAGE_RESOURCE_DIRECTORY PRdRoot;
  PIMAGE_RESOURCE_DIRECTORY_ENTRY prde;
  char *pMem;
  int nCnt, i;
  /* 獲得資源樹的根目錄 */
  if ((prdRoot = (PIMAGE_RESOURCE_DIRECTORY)   ImageDirectoryOffset
      lpFile, IMAGE_DIRECTORY_ENTRY_RESOURCE)) == NULL)
    return 0;
  /* 在堆上分配足夠的空間來包括所有類型 */
  nCnt = prdRoot->NumberOfIdEntries * (MAXRESOURCENAME + 1);
  *pszResTypes = (char *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY,
      nCnt);
  if ((pMem = *pszResTypes) == NULL)
    return 0;
  /* 將指針指向第一個資源種類的入口 */
  prde = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWord)prdRoot +
      sizeof (IMAGE_RESOURCE_DIRECTORY));
  /* 在所有的資源目錄入口類型中循環 */
  for (i = 0; i < prdRoot->NumberOfIdEntries; i++)
  {
    if (LoadString(hDll, prde->Name, pMem, MAXRESOURCENAME))
      pMem += strlen(pMem) + 1;
    prde++;
  }
  return nCnt;
  }

  這個函數將一個資源種類名稱的列表寫入了由pszResTypes標識的變量中。
請注重,在這個函數的核心部分,LoadString是使用各自資源種類目錄入口的Name域來作為字符串ID的。假如你查看PEFILE.RC,你會發現我定義了一系列的資源種類的字符串,并且它們的ID與它們在目錄入口中的定義完全相同。PEFILE.DLL還有有一個函數,它返回了.rsrc段中的資源對象總數。這樣一來,從這個段中提取其它的信息,借助這些函數或另外編寫函數就方便多了。(未完待續)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品福利网站| 国产精品视频大全| 欧美日韩国内自拍| 国产视频久久久| 欧美人在线观看| 正在播放国产一区| 色综合91久久精品中文字幕| 国产香蕉一区二区三区在线视频| 国产精品中文字幕久久久| 亚洲综合中文字幕在线| 午夜美女久久久久爽久久| 成人网在线观看| 91精品国产成人www| 成人av在线亚洲| 91精品国产自产在线观看永久| 国产一区av在线| 精品美女永久免费视频| 日韩精品一区二区三区第95| 亚洲精选在线观看| 欧美电影免费在线观看| 91免费精品视频| 国产亚洲欧美日韩美女| 成人欧美一区二区三区在线湿哒哒| 国产精品久久久久久久久久久久久| 国产91网红主播在线观看| 成人免费高清完整版在线观看| 欧美成人国产va精品日本一级| 久久久久久久久久婷婷| 日韩国产精品亚洲а∨天堂免| 久久久免费av| 粗暴蹂躏中文一区二区三区| 久久久在线视频| 欧美性猛交xxxx乱大交3| 亚洲福利视频专区| 最好看的2019的中文字幕视频| 中文字幕亚洲色图| 日韩精品视频三区| 国产精品亚洲美女av网站| 亚洲电影免费观看高清完整版在线观看| 国产一区二区香蕉| 欧洲午夜精品久久久| 日韩av中文在线| 成人黄色在线免费| 欧美成人网在线| 中文字幕久久久av一区| 日韩成人xxxx| 日韩av片电影专区| 成人欧美一区二区三区在线湿哒哒| 97久久超碰福利国产精品…| 国产在线观看精品一区二区三区| 日av在线播放中文不卡| 中文字幕亚洲欧美在线| 美女久久久久久久久久久| 国产精品欧美激情在线播放| 日韩av在线天堂网| 国产精品成人在线| 亚洲成人激情在线观看| 成人激情视频网| 日本在线精品视频| 色悠悠久久久久| 影音先锋欧美在线资源| 久久天天躁狠狠躁老女人| 日韩精品欧美国产精品忘忧草| 久久精品一偷一偷国产| 国产成人精品优优av| 成人免费淫片视频软件| 97视频在线观看播放| 久久夜色撩人精品| 久久免费视频这里只有精品| 成人黄色短视频在线观看| 欧美丰满老妇厨房牲生活| 国产精品精品视频| 国产精品一区二区久久国产| 欧洲精品毛片网站| 亚洲午夜av电影| 欧美在线观看www| 亚洲男人天堂视频| 国产欧美韩国高清| 九九热精品视频| 成人欧美在线观看| 亚洲香蕉成视频在线观看| 亚洲娇小xxxx欧美娇小| 久久综合免费视频影院| 成人网在线免费看| 欧美亚洲在线视频| 久久99亚洲精品| 亚洲高清一二三区| 精品一区二区三区电影| 欧美一级视频一区二区| 亚洲成人网av| 国产午夜精品美女视频明星a级| 国内精品久久久久久中文字幕| 国产成人鲁鲁免费视频a| 国产成人精品久久二区二区91| 在线视频欧美日韩精品| 亚洲精品999| 91嫩草在线视频| 欧美在线不卡区| 久久欧美在线电影| 色av吧综合网| 97在线视频免费播放| 精品电影在线观看| 日韩精品视频在线播放| 欧美性色视频在线| 精品二区三区线观看| 国产精品第一第二| 日韩成人在线网站| 91久久精品国产91久久| 亚洲国产成人爱av在线播放| 国产精品www色诱视频| 日韩男女性生活视频| 一区二区三区视频在线| 日韩电视剧免费观看网站| 精品久久久久久久久国产字幕| 亚洲男人第一av网站| 欧美成人午夜免费视在线看片| 亚洲免费电影一区| 色综合久久久久久中文网| 国产精品成熟老女人| 性色av一区二区三区红粉影视| 日av在线播放中文不卡| 亚洲石原莉奈一区二区在线观看| 亚洲人成毛片在线播放| 国内免费久久久久久久久久久| 亚洲天堂网站在线观看视频| 在线观看91久久久久久| 亚洲尤物视频网| 日韩久久免费视频| 国产91在线视频| 亚洲欧美另类中文字幕| 国产精品色午夜在线观看| 日韩**中文字幕毛片| 亚洲一区中文字幕| www国产精品com| 久久久国产影院| 久久五月情影视| 91高清视频在线免费观看| 亚洲欧美成人精品| 亚洲精品久久在线| 国产啪精品视频网站| 中文字幕欧美精品在线| 国产精品视频一区国模私拍| xvideos亚洲| 在线亚洲国产精品网| 国产精品美女呻吟| 日韩高清电影好看的电视剧电影| 欧美情侣性视频| 欧美日韩中文字幕在线| 欧美肥老妇视频| 精品亚洲va在线va天堂资源站| 国产亚洲激情在线| 午夜欧美大片免费观看| 久久天堂电影网| 国产精品18久久久久久麻辣| 国产有码一区二区| 最新91在线视频| 久久天天躁夜夜躁狠狠躁2022| 青青草精品毛片| 最近2019中文字幕第三页视频| 亚洲第一中文字幕在线观看| 亚洲男人的天堂在线| 成人国产精品日本在线| 亚洲欧美日韩精品| 日韩性生活视频|