【正文】
ap函數(shù) 2) 創(chuàng)建新堆 HeapCreate(flOption,dWINitalSize,cbMaximumSize) 3) 分配堆內(nèi)存 HeapAlloc(hHeap,dwFlags,dwBytes) 4) 重分配堆內(nèi)存 HeapReAlloc(hHeap,dwFlags,LpMem,dwBytes) 5) 釋放堆內(nèi)存 HeapFree( hHeap,dwFlags,lpMem) 57 EXEMZ 偏移 大小 ( 字節(jié) ) 描述 00 2 EXE 文件類型標記: 4d5ah/MZ 02 2 文件的最后一個扇區(qū)的字節(jié)數(shù) 04 2 文件的總扇區(qū)數(shù) 文件大小 =( 總扇區(qū)數(shù) 1) *512+最后一個扇區(qū)的字節(jié)數(shù) 06 2 重定位項的個數(shù) 08 2 EXE文件頭的大小 ( 16 bytes*this value) 0a 2 最小分配數(shù) ( 16 bytes*this value) 0c 2 最大分配數(shù) ( 16 bytes*this value) 0e 2 堆棧初始段址 ( SS) 10 2 堆棧初始指針 ( SP) 12 2 補碼校驗和 14 2 初始代碼段指針 ( IP) 16 2 初始代碼段段址 ( CS) 18 2 定位表的偏移地址 1a 2 覆蓋號 The overlay number make by link 58 59 MZ文件加載 首先,它計算程序映像文件的大小加上 PSP的大小再加上 EXEHEADER結(jié)構(gòu)中的 exMinAlloc域說明的內(nèi)存大小之和,如果總和超過最大可用內(nèi)存塊的大小,則 MSDOS停止加載程序并返回一個出錯碼。 60 61 NE文件格式 NE 是 New Excutable的縮寫,它是 16位Windows可執(zhí)行文件的標準格式,這種格式基本上已經(jīng)沒有用了,這里僅供參考。 63 This program cannot be run in DOS mode. Section headers sections 64 PE的名詞 入口點( entry point) ,程序執(zhí)行的第一行代碼 文件偏移地址( File offset) Pe文件存儲在磁盤上,各數(shù)據(jù)段的地址稱為文件偏移地址或物理地址( raw offset)。默認,EXE: 0x00400000, DLL:0x1000000。區(qū)塊是按頁對齊的,區(qū)塊總是至少以一個頁邊界為開始。如果兩種對齊值相同,加快加載。從注釋中理解, e_lfanew是 File pointer,非 RVA. 69 typedef struct _IMAGE_DOS_HEADER { // DOS的 .EXE頭部 USHORT e_magic。 // 重定義元素個數(shù) USHORT e_cparhdr。 // 初始的 SS值(相對偏移量) USHORT e_sp。 // 初始的 CS值(相對偏移量) USHORT e_lfarlc。 // OEM標識符(相對 e_oeminfo) USHORT e_oeminfo。 70 71 NT映像頭 NT映像頭的結(jié)構(gòu)定義如下 : IMAGE_NT_HEADERS STRUCT Signature dd ? //PE FileHeader IMAGE_FILE_HEADER OptionalHeader IMAGE_OPTIONAL_HEADER32 IMAGE_NT_HEADERS ENDS 72 IMAGE FILE HEADER typedef struct _IMAGE_FILE_HEADER { USHORT Machine。 ULONG NumberOfSymbols。 define IMAGE_SIZEOF_FILE_HEADER 20 73 74 文件屬性: Bit 0 (IMAGE_FILE_RELOCS_STRIPPED):置 1表示文件中沒有重定向信息 。在這種情況下 , OS必須把文件拷貝到交換文件中執(zhí)行 。 Bit 14 (IMAGE_FILE_UP_SYSTEM_ONLY):表示文件被設(shè)計成不能運行于多處理器系統(tǒng)中 。 union { ULONG PhysicalAddress。 //本節(jié)的相對虛擬地址 ULONG SizeOfRawData。 USHORT NumberOfRelocations。 81 Characteristics節(jié)屬性 0x00000020? 這個塊包含代碼。 0x00000800? 這個塊的內(nèi)容不應放進最終的 EXE文件中。和 DLL一起使用時,這個塊的數(shù)據(jù)可以在使用這個 DLL的進程之間共享。這個標志通常在 包含代碼 標志( 0x00000020)被置位時置位。如果在一個 EXE塊中這個塊未被置位,載入器會把這塊的內(nèi)存映射頁面標為只讀或 只執(zhí)行 。 .text 位于所有節(jié)的首部。 83 節(jié) 資源段, .rsrc .rsrc段包含了模塊的資源信息。 84 85 86 87 88 Import Table 輸入函數(shù)就是被程序調(diào)用但其執(zhí)行代碼又不在程序中的函數(shù),這些函數(shù)代碼位于相關(guān)的 DLL文件中,在調(diào)用者程序中必須保留相關(guān)函數(shù)信息,如函數(shù)名、 DLL文件名。 89 Import Directory Table Of f set Si ze Fiel d Descr iption 4 Import Lookup Table RVA ( Char acter istics ) Relative virtual addr ess of t he I mpor t Lookup Table。 使用名字數(shù)組 /地址數(shù)組 /索引數(shù)組。 。 3. 查看 MSDN, 對本章所描述的幾個內(nèi)存 API函數(shù)做詳細了解 , 并寫出相應的測試例子程序 。 t hen t his field is set t o t he t ime/dat a stamp of the DLL. 8 4 Fow ar der Chain Index of f ir st f or war der referenc e. 12 4 Nam e RVA Addres s of ASCII string containing t he DLL name. This addres s is relativ e t o t he image base. 16 4 Import A ddr ess Table RVA ( Thunk Table) Relative virtual addr ess of t he I mpor t Addres s Table: this t able is ident ical in contents t o t he I mpor t Lookup Table until the image is bound. 90 91 Import Address Table 92 Import Name Table 93 Import Hints/Names DLL/names 94 加載前 I MA G E_I MP O R T_D ES CRI P T O R I MA G E_I MP O R T_BY _N A ME O rigina l First T hu nk T im eD atestam p F orw ardC hain N am e F irstTh un k I MA G E_TH U N K _D A T A I MA G E_TH U N K _D A T A …… 01 函數(shù) 1 23 函數(shù) 2 …… I MA G E_TH U N K _D A T A I MA G E_TH U N K _D A T A …… K ERN EL3 LL 95 加載后 I MA G E_I MP O R T_D ES CRI P T O R I MA G E_I MP O R T_BY _N A ME O rigina l First T hu nk T im eD atestam p F orw ardC hain N am e F irstTh un k I MA G E_TH U N K _D A T A I MA G E_TH U N K _D A T A …… 01 函數(shù) 1 23 函數(shù) 2 …… I MA G E_TH U N K _D A T A I MA G E_TH U N K _D A T A …… K ERN EL32 .D LL 函數(shù) 1 地址 函數(shù) 2 地址 …… 96 引出函數(shù)節(jié) 引出函數(shù)節(jié)一般名為 .edata,這是本文件向其它程序提供調(diào)用的函數(shù)列表。只有當 Pe文件被裝入內(nèi)存時, windows PE裝載器才將相關(guān)的 DLL裝入,并將輸入函數(shù)的指令和函數(shù)實際所處的地址聯(lián)系,即動態(tài)鏈接。以下的 IMAGE_RESOURCE_DIRECTORY結(jié)構(gòu)形成了這棵樹的根和各個結(jié)點。 .rdata段表示只讀的數(shù)據(jù),比如字符串量、常量和調(diào)試目錄信息。 82 節(jié) 典型地擁有 9個預定義節(jié),它們是 .text、 .bss、 .rdata、 .data、 .rsrc、 .edata、.idata、 .pdata和 .debug 可執(zhí)行代碼段, .text , .text段也包含了早先提到過的入口點。在 EXE文件中,這個域總被置位。如: LINK /SECTION:MYDATA,RWS ... 告訴連接器叫做 MYDATA的塊是可讀的,可寫的,共享的。最通常的可丟棄塊是基本重定位塊( .reloc )。 0x00000080? 這個塊包含未初始化的數(shù)據(jù)(如 .bss 塊) 0x00000200? 這個塊包含注釋或其它的信息。 ULONG Characteristics。 ULONG PointerToRelocations。 } Misc。如 GUI子系統(tǒng) 24 (46H) DllCharacteristics 2 何時 DllMain被調(diào)用,一般為 0 25 (48H) SizeOfStackReserve 4 初始化線程時保留的堆棧大小 26 (4CH) SizeOfStackCommit 4 初始化線程時提交的堆棧大小 27 (50H) SizeOfHeapReserve 4 進程初始化時保留的堆大小 28 (