PE文件数据结构汇总
生活随笔
收集整理的這篇文章主要介紹了
PE文件数据结构汇总
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1?IMAGE_DOS_HEADER STRUCT 【M_DOS頭部 共64字節】
{ +00 h WORD e_magic // DOS可執行文件標記 MZ(4Dh 5Ah) +02 h WORD e_cblp ; Bytes on last page of file +04 h WORD e_cp ; Pages in file +06 h WORD e_crlc ; Relocations +08 h WORD e_cparhdr ; Size of header in paragraphs +0A h WORD e_minalloc ; Minimun extra paragraphs needs +0C h WORD e_maxalloc ; Maximun extra paragraphs needs +0E h WORD e_ss // DOS代碼的初始化堆棧SS +10 h WORD e_sp // DOS代碼的初始化堆棧指針SP +12 h WORD e_csum ; Checksum +14 h WORD e_ip // DOS代碼的初始化指令入口[指針IP] +16 h WORD e_cs // DOS代碼的初始堆棧入口 +18 h WORD e_lfarlc ; File Address of relocation table +1A h WORD e_ovno ; Overlay number +1C h WORD e_res[4] ; Reserved words +24 h WORD e_oemid ; OEM identifier(for e_oeminfo) +26 h WORD e_oeminfo ; OEM information;e_oemid specific +29 h WORD e_res2[10] ; Reserved words +3C h LONG e_lfanew // 指向PE文件頭 } IMAGE_DOS_HEADER ENDS2?DOS Stub【大約100個字節左右<此處字節數可選>】
3?typedef struct _IMAGE_NT_HEADERS 【PE文件頭 共248字節】
{ +00 h DWORD Signature // PE標識頭PE(50h 45h),共4字節 +04 h IMAGE_FILE_HEADER FileHeader // 結構體一,PE頭共20個字節 +18 h IMAGE_OPTIONAL_HEADER32 OptionalHeader // 結構體二,PE文件共224字節 } IMAGE_NT_HEADERS ENDS, *PIMAGE_NT_HEADERS32;結構體一:typedef struct _IMAGE_FILE_HEADER 【PE頭共20個字節】 { +04 h WORD Machine; // 運行平臺 +06 h WORD NumberOfSections; // 文件的區塊數目 +08 h DWORD TimeDateStamp; // 文件創建日期和時間 +0C h DWORD PointerToSymbolTable; // 指向COFF符號表(主要用于調試) +10 h DWORD NumberOfSymbols; // COFF符號表中符號個數(同上) +14 h WORD SizeOfOptionalHeader; // IMAGE_OPTIONAL_HEADER3 2 結構大小 +16 h WORD Characteristics; // 文件屬性 } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
結構體二:typedef struct _IMAGE_OPTIONAL_HEADER【PE文件共224字節,其中數據目錄表占128字節】 { +18 h WORD Magic; // 標志字, ROM 映像(0107h),普通可執行文件(010Bh) +1A h BYTE MajorLinkerVersion; // 鏈接程序的主版本號 +1B h BYTE MinorLinkerVersion; // 鏈接程序的次版本號 +1C h DWORD SizeOfCode; // 所有含代碼的節的總大小 +20 h DWORD SizeOfInitializedData; // 所有含已初始化數據的節的總大小 +24 h DWORD SizeOfUninitializedData; // 所有含未初始化數據的節的大小 +28 h DWORD AddressOfEntryPoint; // 程序執行入口RVA +2C h DWORD BaseOfCode; // 代碼的區塊的起始RVA +30 h DWORD BaseOfData; // 數據的區塊的起始RVA +34 h DWORD ImageBase; // 程序的首選裝載地址 +38 h DWORD SectionAlignment; // 內存中的區塊的對齊大小 +3C h DWORD FileAlignment; // 文件中的區塊的對齊大小 +40 h WORD MajorOperatingSystemVersion; // 要求操作系統最低版本號的主版本號 +42 h WORD MinorOperatingSystemVersion; // 要求操作系統最低版本號的副版本號 +44 h WORD MajorImageVersion; // 可運行于操作系統的主版本號 +46 h WORD MinorImageVersion; // 可運行于操作系統的次版本號 +48 h WORD MajorSubsystemVersion; // 要求最低子系統版本的主版本號 +4A h WORD MinorSubsystemVersion; // 要求最低子系統版本的次版本號 +4C h DWORD Win32VersionValue; // 莫須有字段,不被病毒利用的話一般為0 +50 h DWORD SizeOfImage; // 映像裝入內存后的總尺寸 +54 h DWORD SizeOfHeaders; // 所有頭 + 區塊表的尺寸大小 +58 h DWORD CheckSum; // 映像的校檢和 +5C h WORD Subsystem; // 可執行文件期望的子系統 +5E h WORD DllCharacteristics; // DllMain()函數何時被調用,默認為 0 +60 h DWORD SizeOfStackReserve; // 初始化時的棧大小 +64 h DWORD SizeOfStackCommit; // 初始化時實際提交的棧大小 +68 h DWORD SizeOfHeapReserve; // 初始化時保留的堆大小 +6C h DWORD SizeOfHeapCommit; // 初始化時實際提交的堆大小 +70 h DWORD LoaderFlags; // 與調試有關,默認為 0 +74 h DWORD NumberOfRvaAndSizes; // 下邊數據目錄的項數,Windows NT 發布是16 +78 h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; // 數據目錄表【共占 128字節16個子參數】;結構體一 } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
結構體一:typedef struct _IMAGE_DATA_DIRECTORY 【共占8字節】 { +00 h DWORD VirtualAddress; //數據的RVA +04 h DWORD Size; //數據的大小 }IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
4 typedef struct _IMAGE_SECTION_HEADER 【區塊表,共占40字節】 { +00 h BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 節表名稱,如“.text”【共占8字節】 +08 h union { DWORD PhysicalAddress; // 物理地址 DWORD VirtualSize; // 真實長度,這兩個值是一個聯合結構,可以使 用其中的任何一個,一般是取后一個 } Misc; +0C h DWORD VirtualAddress; // 節區的虛擬內存中RVA地址 +10 h DWORD SizeOfRawData; // 節表在文件中對齊后的尺寸 +14 h DWORD PointerToRawData; // 節表在文件中的偏移量 +18 h DWORD PointerToRelocations; // 在OBJ文件中使用,重定位的偏移 +1C h DWORD PointerToLinenumbers; // 行號表的偏移(供調試使用地) +20 h WORD NumberOfRelocations; // 在OBJ文件中使用,重定位項數目 +22 h WORD NumberOfLinenumbers; // 行號表中行號的數目 +24 h DWORD Characteristics; // 節屬性如可讀,可寫,可執行等 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
5?IMAGE_IMPORT_DESCRIPTOR STRUCT 【輸入表結構,共20字節】 { +00 h union {DWORD Characteristics ; 不知到是神馬浮云,不重要 DWORD OriginalFirstThunk //指向IMAGE_THUNK_DATA數組的指針 }ends +04 h DWORD TimeDateStamp //可執行文件是否與DLL綁定,不綁定為0 +08 h DWORD ForwarderChain //第一個轉向的API索引 +0C h DWORD Name //指向DLL的虛擬RVA +10 h DWORD FirstThunk //實際指向IMAGE_THUNK_DATA數組的指針,結構體一 };IMAGE_IMPORT_DESCRIPTOR ENDS
結構體一:IMAGE_THUNK_DATA STRUC 【共占4字節】{ union u1 {DWORD ForwarderString ; 指向一個轉向者字符串的RVA DWORD Function ; 被輸入的函數的內存地址 DWORD Ordinal ; 被輸入的API的序數值 DWORD AddressOfData ; 高位為0則指向IMAGE_IMPORT_BY_NAME 結構體二 }ends }IMAGE_THUNK_DATA ENDS
結構體二:IMAGE_IMPORT_BY_NAME STRUCT 【共占大小動態分配】 { +00 h WORD Hint //可選指向函數字段,神馬的浮云 +04 h BYTE Name ? //此處內存大小動態分配,定義了導入函數的以0結尾的字符串 };IMAGE_IMPORT_BY_NAME ENDS
6 資源 IMAGE_RESOURCE_DIRECTORY STRUCT 【資源表位于數據目錄表的第三項,共動態分配字節,其中結構體中的成員指出的RVA偏移量都是對于此結構體的地址作為基地址】 { +00 h DWORD Characteristics ; 理論上為資源的屬性,不過事實上總是0 +04 h DWORD TimeDateStamp ; 資源的產生時刻 +08 h WORD MajorVersion ; 理論上為資源的版本,不過事實上總是0 +0A h WORD MinorVersion +0C h WORD NumberOfNamedEntries ; 以名稱(字符串)命名的入口數量 +0E h WORD NumberOfIdEntries ; 以ID(整型數字)命名的入口數量 };IMAGE_RESOURCE_DIRECTORY ENDS
IMAGE_RESOURCE_DIRECTORY_ENTRY STRUCT { +10 h DWORD Name ; 目錄項的名稱字符串指針或ID,高位為1時指向子結構體一 +14 h DWORD OffsetToData ; 目錄項指針,高位為1時指向子結構體二 };IMAGE_RESOURCE_DIRECTORY_ENTRY ENDS
IMAGE_RESOURCE_DIR_STRING_U STRUCT { +00 h DWORD Length ; 字符串的長度 +04 h DWORD NameString ; UNICODE字符串,由于字符串是不定長的。由Length 制定長度 };IMAGE_RESOURCE_DIR_STRING_U ENDS
IMAGE_RESOURCE_DATA_ENTRY STRUCT { +00 h DWORD OffsetToData ; 資源數據的RVA +04 h DWORD Size ; 資源數據的長度 +08 h DWORD CodePage ; 代碼頁, 一般為0 +0C h DWORD Reserved ; 保留字段 };IMAGE_RESOURCE_DATA_ENTRY ENDS
7?IMAGE_EXPORT_DIRECTORY STRUCT導出表
數據目錄表的第一個成員指向導出表,是一個IMAGE_EXPORT_DIRECTORY(以后簡稱IED)結構,IED 結構的定義如下:
8?【基址重定位位于數據目錄表的第六項,共8+N字節】 IMAGE_BASE_RELOCATION STRUC { +00 h DWORD VirtualAddress ;重定位數據開始的RVA 地址 +04 h DWORD SizeOfBlock ;重定位塊得長度,標識重定向字段個數 +08 h WORD TypeOffset ;重定項位數組相對虛擬RVA,個數動態分配 }; IMAGE_BASE_RELOCATION ENDS
總結
以上是生活随笔為你收集整理的PE文件数据结构汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件漏洞分析技术
- 下一篇: IOS常用代码总结 - 第三方库部分