【筆記】PE文件格式

0x01 PE加載情況

0x02 DOS頭

typedef struct _IMAE_DOS_HEADER {        //DOS .EXE header                                    位置
    WORD e_magic;                        //Magic number;                                      0x00
    WORD e_cblp;                        //Bytes on last page of file                         0x02
    WORD e_cp;                          //Pages in file                                         0x04
    WORD e_crlc;                        //Relocations                                        0x06
    WORD e_cparhdr;                        //Size of header in paragraphs                       0x08
    WORD e_minalloc;                    //Minimum extra paragraphs needed                    0x0A
    WORD e_maxalloc;                    //Maximum extra paragraphs needed                    0x0C
    WORD e_ss;                          //Initial (relative) SS value                         0x0E
    WORD e_sp;                            //Initial SP value                                     0x10
    WORD e_csum;                        //Checksum                                             0x12
    WORD e_ip;                            //Initial IP value                                     0x14
    WORD e_cs;                            //Initial (relative) CS value                        0x16
    WORD e_lfarlc;                        //File address of relocation table                   0x18
    WORD e_ovno;                        //Overlay number                                     0x1A
    WORD e_res[4];                        //Reserved words                                     0x1C
    WORD e_oemid;                        //OEM identifier (for e_oeminfo)                     0x24
    WORD e_oeminfo;                        //OEM information; e_oemid specific                  0x26 
    WORD e_res2[10];                    //Reserved words                                     0x28
    LONG e_lfanew;                        //File address of new exe header                     0x3C
} IMAGE_DOS-HEADER, *PIMAGE_DOS_HEADER;

0x03 DOS存根

DOS存根(stub)在DOS頭下方,是個可選項,且大小不固定(即使沒有DOS存根,文件也能正常運行).DOS存根由代碼與數(shù)據(jù)混合而成.

0x04 NT頭

typedef struct _IMAGE_DOS_HEADER
{
    DWORD  Signature;                    //PE Signature : 50450000("PE"00)
    IMAGE_FILE_HEADER  FileHeader;                //文件頭結(jié)構(gòu)體
    IMAGE_ OPTIONAL_HEADER32  OptionalHeader;                //可選頭結(jié)構(gòu)體
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER32;

0x05 NT頭:文件頭

typedef struct _IMAGE_DOS_HEADER
{
    WORD  Machine;                //每個CPU都擁有唯一的machine碼
    WORD  NumberOfSections;                //節(jié)區(qū)數(shù)量,當(dāng)定義節(jié)區(qū)數(shù)與實際不同時會發(fā)生錯誤
    DWORD  TimeDateStamp;
    DWORD  PointerToSymbolTable;
    DWORD  NumberOfSymbols;
    WORD  SizeOfOptionalHeader;                //IMAGE_OPTIONAL_HEADER32結(jié)構(gòu)體的大小,固定的
    WORD  Characteristics;                //文件屬性,0x0002h為可執(zhí)行文件,0x2000h為DLL文件
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER32;

0x06 NT頭:可選頭

typedef struct _IMAGE_OPTIONAL_HEADER {
WORD    Magic;            //標(biāo)志字(32位時0x10Bh)
BYTE    MajorLinkerVersion;        //連接器版本號
BYTE    MinorLinkerVersion;        //
DWORD   SizeOfCode;            //代碼段大小
DWORD   SizeOfInitializedData;    //已初始化數(shù)據(jù)塊大小
DWORD   SizeOfUninitializedData;    //未初始化數(shù)據(jù)塊大小
DWORD   AddressOfEntryPoint;     //EP的RVA值,程序最先執(zhí)行代碼的地址
DWORD   BaseOfCode;            //代碼段起始RVA
DWORD   BaseOfData;            //數(shù)據(jù)段起始RVA
DWORD   ImageBase;            //PE文件的裝載地址
DWORD   SectionAlignment;        //塊對齊,節(jié)區(qū)在內(nèi)存中最小單位
DWORD   FileAlignment;        //文件塊對齊,節(jié)區(qū)在文件中的最小單位
WORD    MajorOperatingSystemVersion;//所需操作系統(tǒng)版本號
WORD    MinorOperatingSystemVersion;//
WORD    MajorImageVersion;        //用戶自定義版本號
WORD    MinorImageVersion;        //
WORD    MajorSubsystemVersion;    //win32子系統(tǒng)版本。若PE文件是專門為Win32設(shè)計的
WORD    MinorSubsystemVersion;    //該子系統(tǒng)版本必定是4.0否則對話框不會有3維立體感
DWORD   Win32VersionValue;        //保留
DWORD   SizeOfImage;            //內(nèi)存中整個PE映像體的尺寸
DWORD   SizeOfHeaders;        //所有頭+節(jié)表的大小,即整個PE頭的大小
DWORD   CheckSum;            //校驗和
WORD    Subsystem;            //NT用來識別PE文件屬于哪個子系統(tǒng)(系統(tǒng)驅(qū)動、GUI、CUI)
WORD    DllCharacteristics;        //
DWORD   SizeOfStackReserve;        //
DWORD   SizeOfStackCommit;        //
DWORD   SizeOfHeapReserve;        //
DWORD   SizeOfHeapCommit;        //
DWORD   LoaderFlags;            //
DWORD   NumberOfRvaAndSizes;    //指定DataDirectory數(shù)組的個數(shù)
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
//IMAGE_DATA_DIRECTORY 結(jié)構(gòu)數(shù)組。每個結(jié)構(gòu)給出一個重要數(shù)據(jù)結(jié)構(gòu)的RVA,比如引入地址表等
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

0x07 節(jié)區(qū)頭

#define IMAGE_SIZEOF_SHORT_NAME 8
typedef struct _IMAGE_SECTION_HEADER{ 
    BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 8個字節(jié)的節(jié)區(qū)名稱  
    union {  
        DWORD PhysicalAddress;         
        DWORD VirtualSize;            //內(nèi)存中節(jié)區(qū)的尺寸  
    } Misc; 
    DWORD VirtualAddress;         // 內(nèi)存中節(jié)區(qū)的起始地址(RVA)  
    DWORD SizeOfRawData;            // 磁盤中文件中節(jié)區(qū)所占大小
    DWORD PointerToRawData;        // 磁盤中文件的起始位置  
    DWORD PointerToRelocations;     // 在OBJ文件中使用,重定位的偏移  
    DWORD PointerToLinenumbers;   // 行號表的偏移(供調(diào)試使用地)  
    WORD NumberOfRelocations;      // 在OBJ文件中使用,重定位項數(shù)目  
    WORD NumberOfLinenumbers;    // 行號表中行號的數(shù)目  
    DWORD Characteristics;       // 節(jié)屬性如可讀,可寫,可執(zhí)行等  
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 12.網(wǎng)絡(luò)傳輸層過濾 #define IRP_MN_BUS_RESET 0x87 1394.h fltKernel...
    f675b1a02698閱讀 1,752評論 0 0
  • title: vegadate: 2016-07-31 11:16tags: Kali滲透測試 Web滲透測試 0...
    曼路x_x閱讀 4,082評論 0 2
  • 前言: 本文主要描述Android BLE的一些基礎(chǔ)知識及相關(guān)操作流程,不牽扯具體的業(yè)務(wù)實現(xiàn),其中提供了針對廣播包...
    幻影宇寰閱讀 5,598評論 6 19
  • 隱寫篇 0x01. 通過進(jìn)制轉(zhuǎn)換隱藏信息 0x02. 在圖片中隱藏壓縮包(圖種) 加密篇 0x03. 偽加密 0x...
    查無此人asdasd閱讀 6,000評論 0 4
  • 我在小姑子的建龍保健品分公司,認(rèn)識從天津來重慶墊江授課的劉教授。他是天津人民第二附屬醫(yī)院的退休老人,被天津建龍保健...
    吉英子閱讀 985評論 0 2

友情鏈接更多精彩內(nèi)容