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

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

PE文件格式詳解(4)

2019-11-17 05:04:19
字體:
來源:轉載
供稿:網友
  PE文件段
  PE文件規范由目前為止定義的那些頭部以及一個名為“段”的一般對象組成。段包含了文件的內容,包括代碼、數據、資源以及其它可執行信息,每個段都有一個頭部和一個實體(原始數據)。我將在下面描述段頭部的有關信息,但是段實體則缺少一個嚴格的文件結構。因此,它們幾乎可以被鏈接器按任何的方法組織,只要它的頭部填充了足夠能夠解釋數據的信息。   段頭部   PE文件格式中,所有的段頭部位于可選頭部之后。每個段頭部為40個字節長,并且沒有任何的填充信息。段頭部被定義為以下的結構:

  WINNT.H
  #define IMAGE_SIZEOF_SHORT_NAME 8
  typedef strUCt _IMAGE_SECTION_HEADER {
  UCHAR Name[IMAGE_SIZEOF_SHORT_NAME];
  union {
    ULONG PhysicalAddress;
    ULONG VirtualSize;
  } Misc;
  ULONG VirtualAddress;
  ULONG SizeOfRawData;
  ULONG PointerToRawData;
  ULONG PointerToRelocations;
  ULONG PointerToLinenumbers;
  USHORT NumberOfRelocations;
  USHORT NumberOfLinenumbers;
  ULONG Characteristics;
  } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

  你如何才能獲得一個特定段的段頭部信息?既然段頭部是被連續的組織起來的,而且沒有一個特定的順序,那么段頭部必須由名稱來定位。以下的函數示范了如何從一個給定了段名稱的PE映像文件中獲得一個段頭部:

  PEFILE.C
  BOOL WINAPI GetSectionHdrByName(LPVOID lpFile,
    IMAGE_SECTION_HEADER *sh, char *szSection)
  {
  PIMAGE_SECTION_HEADER psh;
  int nSections = NumOfSections (lpFile);
  int i;
  if ((psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET(lpFile))
      != NULL)
    {
    /* 由名稱查找段 */
    for (i = 0; i < nSections; i++)
    {
      if (!strcmp(psh->Name, szSection))
      {
        /* 向頭部復制數據 */
        CopyMemory((LPVOID)sh, (LPVOID)psh,
            sizeof(IMAGE_SECTION_HEADER));
        return TRUE;
      }
      else
        psh++;

    }
  }
  return FALSE;
  }

  這個函數通過SECHDROFFSET宏將第一個段頭部定位,然后它開始在所有段中循環,并將要尋找的段名稱和每個段的名稱相比較,直到找到了正確的那一個為止。當找到了段的時候,函數將內存映像文件的數據復制到傳入函數的結構中,然后IMAGE_SECTION_HEADER結構的各域就能夠被直接存取了。     段頭部的域   ·Name。每個段都有一個8字符長的名稱域,并且第一個字符必須是一個句點。
  ·PhysicalAddress或VirtualSize。第二個域是一個union域,現在已不使用了。

  ·VirtualAddress。這個域標識了進程地址空間中要裝載這個段的虛擬地址。實際的地址由將這個域的值加上可選頭部結構中的ImageBase虛擬地址得到。切記,假如這個映像文件是一個DLL,那么這個DLL就不一定會裝載到ImageBase要求的位置。所以一旦這個文件被裝載進入了一個進程,實際的ImageBase值應該通過使用GetModuleHandle來檢驗。

  ·SizeOfRawData。這個域表示了相對FileAlignment的段實體尺寸。文件中實際的段實體尺寸將少于或等于FileAlignment的整倍數。一旦映像被裝載進入了一個進程的地址空間,段實體的尺寸將會變得少于或等于FileAlignment的整倍數。
  ·PointerToRawData。這是一個文件中段實體位置的偏移量。

  ·PointerToRelocations、PointerToLinenumbers、NumberOfRelocations、NumberOfLinenumbers。這些域在PE格式中不使用。

  ·Characteristics。定義了段的特征。這些值可以在WINNT.H及本光盤(譯注:MSDN的光盤)的PE格式規范中找到。

定義0x00000020代碼段0x00000040已初始化數據段0x00000080未初始化數據段0x04000000該段數據不能被緩存0x08000000該段不能被分頁0x10000000共享段0x20000000可執行段0x40000000可讀段0x80000000可寫段  定位數據目錄  數據目錄存在于它們相應的數據段中。典型地來說,數據目錄是段實體中的第一個結構,但不是必需的。由于這個緣故,假如你需要定位一個指定的數據目錄的話,就需要從段頭部和可選頭部中獲得信息。

  為了讓這個過程簡單一點,我編寫了以下的函數來定位任何一個在WINNT.H之中定義的數據目錄。

  PEFILE.C
  LPVOID WINAPI ImageDirectoryOffset(LPVOID lpFile,
    DWord dwIMAGE_DIRECTORY)
  {
  PIMAGE_OPTIONAL_HEADER poh;
  PIMAGE_SECTION_HEADER psh;
  int nSections = NumOfSections(lpFile);
  int i = 0;
  LPVOID VAImageDir;
  /* 必須為0到(NumberOfRvaAndSizes-1)之間 */
  if (dwIMAGE_DIRECTORY >= poh->NumberOfRvaAndSizes)
    return NULL;
  /* 獲得可選頭部和段頭部的偏移量 */
  poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);
  psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET(lpFile);
  /* 定位映像目錄的相對虛擬地址 */
  VAImageDir = (LPVOID)poh->DataDirectory
      [dwIMAGE_DIRECTORY].VirtualAddress;
  /* 定位包含映像目錄的段 */
  while (i++ < nSections)
  {
    if (psh->VirtualAddress <= (DWORD)VAImageDir &&
        psh->VirtualAddress +

        psh->SizeOfRawData > (DWORD)VAImageDir)
      break;
    psh++;
  }
  if (i > nSections)
    return NULL;
  /* 返回映像導入目錄的偏移量 */
  return (LPVOID)(((int)lpFile +
      (int)VAImageDir. psh->VirtualAddress) +
      (int)psh->PointerToRawData);
  }

  該函數首先確認被請求的數據目錄入口數字,然后它分別獲取指向可選頭部和第一個段頭部的兩個指針。它從可選頭部決定數據目錄的虛擬地址,然后它使用這個值來決定數據目錄定位在哪個段實體之中。假如適當的段實體已經被標識了,那么數據目錄特定的位置就可以通過將它的相對虛擬地址轉換為文件中地址的方法來找到。(未完待續)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情 国产| 亚洲一区国产精品| 欧美日韩精品在线观看| 精品人伦一区二区三区蜜桃免费| 狠狠躁天天躁日日躁欧美| 国产香蕉97碰碰久久人人| 久久亚洲国产精品| 2019中文字幕在线免费观看| 91亚洲国产成人久久精品网站| 欧美日韩一二三四五区| 一区二区三区日韩在线| 亚洲最大福利视频网| 欧美极品美女视频网站在线观看免费| 亚洲视频在线观看网站| 国产日韩欧美在线播放| 亚洲男女性事视频| 日韩电影免费观看在线| 亚洲精品电影在线观看| 法国裸体一区二区| 欧美视频一二三| 91精品久久久久久久久久久久久| 欧美日本亚洲视频| 日韩成人小视频| 欧美成人免费全部观看天天性色| 中文字幕日韩精品在线观看| 91免费看片网站| 日韩精品中文字幕在线| 91国偷自产一区二区三区的观看方式| 色噜噜亚洲精品中文字幕| 亚洲最大中文字幕| 日韩中文娱乐网| 精品国产电影一区| 91精品视频免费| 国产精品免费看久久久香蕉| 欧美精品免费看| 国产精品免费一区二区三区都可以| 久久久久国产视频| 精品av在线播放| 精品高清一区二区三区| 精品国内自产拍在线观看| 亚洲第一二三四五区| 亚洲精品影视在线观看| 黑人巨大精品欧美一区二区三区| 欧美日韩免费一区| 欧美一区二区大胆人体摄影专业网站| 日韩电影大片中文字幕| 亚洲精品www久久久久久广东| 中文字幕久久精品| 亚洲一区二区三区sesese| 亚洲成人激情视频| 日韩成人激情视频| 国产精品99久久久久久久久久久久| 91精品中文在线| 国产亚洲xxx| 亚洲国产福利在线| 2019亚洲男人天堂| 日韩精品在线私人| 国产亚洲人成网站在线观看| 欧美日韩另类字幕中文| 日韩欧美综合在线视频| 精品国产乱码久久久久久天美| 国产一区二区三区免费视频| 高清日韩电视剧大全免费播放在线观看| 色妞色视频一区二区三区四区| 国产欧美精品久久久| 色妞在线综合亚洲欧美| 国产精品自产拍高潮在线观看| 一区二区av在线| 欧美裸体xxxx极品少妇| 亚洲v日韩v综合v精品v| 国产免费一区二区三区香蕉精| 国产脚交av在线一区二区| 国产精品久久不能| 亚洲性猛交xxxxwww| 成人福利视频在线观看| 中文欧美日本在线资源| 中文字幕欧美视频在线| 成人h猎奇视频网站| 亚洲韩国青草视频| 国产精品视频yy9099| 日韩精品亚洲视频| 欧美午夜女人视频在线| 欧美xxxx做受欧美| 日韩欧美在线视频| 国产精品欧美久久久| 亚洲国产精品久久久| 欧美一级视频免费在线观看| 亚洲精品中文字幕av| 日韩最新中文字幕电影免费看| 亚洲欧洲在线看| 日韩在线播放一区| 亚洲人成毛片在线播放| 久久精品男人天堂| 亚洲视频欧美视频| 欧美专区第一页| 久久久精品在线观看| 亚洲欧美国产一本综合首页| 91在线观看免费高清| 热久久这里只有精品| 国产美女高潮久久白浆| 欧美日韩国产中文精品字幕自在自线| 日本精品一区二区三区在线播放视频| 亚洲精品永久免费| 午夜精品久久久久久久99热| 国产剧情久久久久久| 欧美日韩性生活视频| 国产不卡一区二区在线播放| 亚洲成人久久久久| 亚洲毛茸茸少妇高潮呻吟| 国产日韩欧美在线看| 亚洲女人被黑人巨大进入| 国模私拍一区二区三区| 一本色道久久综合亚洲精品小说| 欧美电影免费在线观看| 亚洲综合第一页| 亚洲福利视频久久| 欧美激情a在线| 欧美一级视频在线观看| 亚洲精品欧美日韩专区| 国产一区二区三区精品久久久| 国产热re99久久6国产精品| 久久成人综合视频| 中文字幕亚洲激情| 日韩色av导航| 精品丝袜一区二区三区| 国产精品久久久av| www.欧美精品一二三区| 日韩在线观看免费全| 色老头一区二区三区在线观看| 欧美成在线观看| 精品中文字幕在线| 日韩在线观看精品| 日韩精品黄色网| 伊人久久五月天| 91亚洲精品视频| 午夜精品久久久久久久男人的天堂| 国产一区二区日韩| 日本韩国欧美精品大片卡二| 久久久久久午夜| 国产精品久久色| 欧美国产日韩一区二区| 久热精品视频在线观看| 7777精品久久久久久| 国产成人高潮免费观看精品| 91日本在线观看| 一区二区三区视频免费在线观看| 亚洲精品日韩激情在线电影| 精品视频一区在线视频| 亚洲一区二区三区四区视频| 欲色天天网综合久久| 亚洲国产精品小视频| 91久久久久久久久久久| 日韩高清欧美高清| 亚洲黄色av女优在线观看| 久久av中文字幕| 久久免费少妇高潮久久精品99| 国产不卡视频在线| 欧美一区二粉嫩精品国产一线天| 成人在线小视频| 久久久久久国产精品久久| 欧美在线激情网| 91久久久国产精品| 国产精品美女无圣光视频| 在线视频欧美日韩精品|