freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

windows下的可執(zhí)行文件格式詳解-文庫吧

2025-08-02 20:33 本頁面


【正文】 我們知道了 PE 文件頭的位置,那么就可以檢查頭部的數(shù)據(jù)了。我們只需要把這個位置賦值給一個結構,如下: PIMAGE_FILE_HEADER pfh。 pfh = (PIMAGE_FILE_HEADER)PEFHDROFFSET(lpFile)。 在這個例子中, lpFile 表示一個指向可執(zhí)行文件內(nèi)存映像基地址的指針,這就顯出了內(nèi)存映射文件的好處:不需要執(zhí)行文件的 I/O,只需使用指針 pfh 就能存取文件中的信息。 PE 文件頭結構被定義為: // typedef struct _IMAGE_FILE_HEADER { USHORT Machine。 USHORT NumberOfSections。 ULONG TimeDateStamp。 ULONG PointerToSymbolTable。 ULONG NumberOfSymbols。 USHORT SizeOfOptionalHeader。 USHORT Characteristics。 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER。 define IMAGE_SIZEOF_FILE_HEADER 20 請注意這個文件頭部的大小已經(jīng)定義在這個包含文件之中了,這樣一來,想要得到這個結構的大小就很方便了。但是我覺得對結構本身使用 sizeof 運算符(譯注:原文為 “function”)更簡單一些,因為這樣的話我就不必記住這個常量的名字 IMAGE_SIZEOF_FILE_HEADER,而只需要記住結構IMAGE_FILE_HEADER 的名字就可以了。另一方面,記住所有結構的名字已經(jīng)夠有挑戰(zhàn)性的了,尤其在是這些結構只有 中才有的情況下。 PE 文件中的信息基本上是一些高級信息,這些信息是被操作系統(tǒng)或者 應用程序用來決定如何處理這個文件的。第一個域是用來表示這個可執(zhí)行文件被構建的目標機器種類,例如 DEC(R) Alpha、 MIPS R4000、 Intel(R) x86 或一些其它處理器。系統(tǒng)使用這一信息來在讀取這個文件的其它數(shù)據(jù)之前決定如何處理它。 Characteristics 域表示了文件的一些特征。比如對于一個可執(zhí)行文件而言,分離調(diào)試文件是如何操作的。調(diào)試器通常使用的方法是將調(diào)試信息從 PE 文件中分離,并保存到一個調(diào)試文件( .DBG)中。要這么做的話,調(diào)試器需要了解是否要在一個單獨的文件中尋找調(diào)試信 息,以及這個文件是否已經(jīng)將調(diào)試信息分離了。我們可以通過深入可執(zhí)行文件并尋找調(diào)試信息的方法來完成這一工作。要使調(diào)試器不在文件中查找的話,就需要用到 IMAGE_FILE_DEBUG_STRIPPED 這個特征,它表示文件的調(diào)試信息是否已經(jīng)被分離了。這樣一來,調(diào)試器可以通過快速查看 PE 文件的頭部的方法來決定文件中是否存在著調(diào)試信息。 定義了若干其它表示文件頭信息的標記,就和以上的例子差不多。我把研究這些標記的事情留給讀者作為練習,由你們來看看它們是不是很有趣,這些標記位于 中的IMAGE_FILE_HEADER 結構之后。 PE 文件頭結構中另一個有用的入口是 NumberOfSections 域,它表示如果你要方便地提取文件信息的話,就需要了解多少個段 ——更明確一點來說,有多少個段頭部和多少個段實體。每一個段頭部和段實體都在文件中連續(xù)地排列著,所以要決定段頭部和段實體在哪里結束的話,段的數(shù)目是必需的。以下的函數(shù)從 PE 文件頭中提取了段的數(shù)目: int WINAPI NumOfSections(LPVOID lpFile) { /* 文件頭部中所表示出的段數(shù)目 */ return (int)((PIMAGE_FILE_HEADER) PEFHDROFFSET (lpFile))NumberOfSections)。 } 如你所見, PEFHDROFFSET 以及其它宏用起來非常方便。 PE 可選頭部 PE 可執(zhí)行文件中接下來的 224 個字節(jié)組成了 PE 可選頭部。雖然它的名字是 “可選頭部 ”,但是請確信:這個頭部并非 “可選 ”,而是 “必需 ”的。 OPTHDROFFSET 宏可以獲得指向可選頭部的指針: // define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \ ((PIMAGE_DOS_HEADER)a)e_lfanew + \ SIZE_OF_NT_SIGNATURE + \ sizeof(IMAGE_FILE_HEADER))) 可選頭部包含了很多關于可執(zhí)行映像的重要信息,例如初始的堆棧大小、程序入口點的位置、首選基地址、操作系統(tǒng)版本、段對齊的信 息等等。 IMAGE_OPTIONAL_HEADER 結構如下: // 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。 如你所見,這個結構中所列出的域?qū)嵲谑侨唛L得過分。為了不讓你對所有這些域感到厭煩,我會僅僅討論有用的 ——就是說,對于探究 PE 文件格式而言有用的。 標準域 首先,請注意這個結構被劃分為 “標準域 ”和 “NT 附加域 ”。所謂標準域,就是和 UNIX 可執(zhí)行文件的 COFF 格式所公共的部分。雖然標準域保留了 COFF 中定義的名字,但是 Windows NT 仍然將它們用作了不同的目的 ——盡管換個名字更好一些。 Magic。我不知道這個域是干什么的,對于示例程序 示例程序而言,這個值是 0x010B或 267(譯注: 0x010B 為 .EXE, 0x0107 為 ROM 映像,這個信息我是從 eXeScope 上得來的)。 MajorLinkerVersion、 MinorLinkerVersion。表示鏈接此映像的鏈接器版本。隨 Window NT build 438配套的 Windows NT SDK 包含的鏈接器版本是 (十六進制為 )。 SizeOfCode??蓤?zhí)行代碼尺寸。 SizeOfInitializedData。已初始化的數(shù)據(jù)尺寸。 SizeOfUninitializedData。未初始化的數(shù)據(jù)尺寸。 AddressOfEntryPoint。在標準域中, AddressOfEntryPoint 域是對 PE 文件格式來說最為有趣的了。這個域表示應用程序入口點的位置。并且,對于系統(tǒng)黑客來說,這個位置就是導入地址表( IAT)的末尾。以下的函數(shù)示范了如何從可選頭部獲得 Windows NT 可執(zhí)行映像的入口點。 // LPVOID WINAPI GetModuleEntryPoint(LPVOID lpFile) { PIMAGE_OPTIONAL_HEADER poh。 poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile)。 if (poh != NULL) return (LPVOID)pohAddressOfEntryPoint。 else return NULL。 } BaseOfCode。已載入映像的代碼( “.text”段)的相對偏移量。 BaseOfData。已載入映像的未初始化數(shù)據(jù)( “.bss”段)的相對偏移量。 Windows NT 附加域 添加到 Windows NT PE 文件格式中的附加域為 Windows NT 特定的進程行為提供了裝載器的支持,以下為這些域的概述。 ImageBase。進程映像地址空間中的首選基地址。 Windows NT 的 Microsoft Win32 SDK 鏈接器將這個值默認設為 0x00400000,但是你可以使用 BASE:linker 開關改變這個值。 SectionAlignment。從 ImageBase 開始,每個段都被相繼的裝入進程的地址空間中。SectionAlignment 則規(guī) 定了裝載時段能夠占據(jù)的最小空間數(shù)量 ——就是說,段是關于 SectionAlignment對齊的。 Windows NT 虛擬內(nèi)存管理器規(guī)定,段對齊不能少于頁尺寸(當前的 x86 平臺是 4096 字節(jié)),并且必須是成倍的頁尺寸。 4096 字節(jié)是 x86 鏈接器的默認值,但是它可以通過 ALIGN: linker 開關來設置。 FileAlignment。映像文件首先裝載的最小的信息塊間隔。例如,鏈接器將一個段實體(段的原始數(shù)據(jù))加零擴展為文件中最接近的 FileAlignment 邊界。早先提及的 版鏈接器 將映像文件以 0x200字節(jié)的邊界對齊,這個值可以被強制改為 512 到 65535 這么多。 MajorOperatingSystemVersion。表示 Windows NT 操作系統(tǒng)的主版本號;通常對 Windows NT 而言,這個值被設為 1。 MinorOperatingSystemVersion。表示 Windows NT 操作系統(tǒng)的次版本號;通常對 Windows NT 而言,這個值被設為 0。 MajorImageVersion。用來表示應用程序的主版本號;對于 Microsoft Excel 而言,這個值是 4。 MinorImageVersion。用來表示應用程序的次版本號;對于 Microsoft Excel 而言,這個值是 0。 MajorSubsystemVersion。表示 Windows NT Win32 子系統(tǒng)的主版本號;通常對于 Windows NT 而言,這個值被設為 3。 MinorSubsystemVersion。表示 Windows NT Win32 子系統(tǒng)的次版本號;通常對于 Windows NT 而言,這個值被 設為 10。 Reserved1。未知目的,通常不被系統(tǒng)使用,并被鏈接器設為 0。 SizeOfImage。表示載入的可執(zhí)行映像的地址空間中要保留的地址空間大小,這個數(shù)字很大程度上受 SectionAlignment 的影響。例如,考慮一個擁有固定頁尺寸 4096 字節(jié)的系統(tǒng),如果你有一個 11個段的可執(zhí)行文件,它的每個段都少于 4096 字節(jié),并且關于 65536 字節(jié)邊界對齊,那么 SizeOfImage域?qū)辉O為 11 * 65536 = 720896( 176 頁)。而如果一個相同的文件關于 4096 字節(jié)對齊 的話,那么 SizeOfImage 域的結果將是 11 * 4096 = 45056( 11 頁)。這只是個簡單的例子,它說明每個段需要少于一個頁面的內(nèi)存。在現(xiàn)實中,鏈接器通過個別地計算每個段的方法來決定 SizeOfImage 確切
點擊復制文檔內(nèi)容
公司管理相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1