標籤:Windows原理
IMAGE_OPTIONAL_HEADER結構如下:
typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // WORD Magic; // 標誌字, ROM 映像(0107h),普通可執行檔(010Bh) BYTE MajorLinkerVersion; // 連結程式的主要版本號 BYTE MinorLinkerVersion; // 連結程式的次版本號碼 DWORD SizeOfCode; // 所有含代碼的節的總大小 DWORD SizeOfInitializedData; // 所有含已初始化資料的節的總大小 DWORD SizeOfUninitializedData; // 所有含未初始化資料的節的大小 DWORD AddressOfEntryPoint; // 程式執行入口RVA DWORD BaseOfCode; // 代碼的區塊的起始RVA DWORD BaseOfData; // 資料的區塊的起始RVA // // NT additional fields. 以下是屬於NT結構增加的領域。 // DWORD ImageBase; // 程式的首選裝載地址 DWORD SectionAlignment; // 記憶體中的區塊的對齊大小 DWORD FileAlignment; // 檔案中的區塊的對齊大小 WORD MajorOperatingSystemVersion; // 要求作業系統最低版本號碼的主要版本號 WORD MinorOperatingSystemVersion; // 要求作業系統最低版本號碼的副版本號碼 WORD MajorImageVersion; // 可運行於作業系統的主要版本號 WORD MinorImageVersion; // 可運行於作業系統的次版本號碼 WORD MajorSubsystemVersion; // 要求最低子系統版本的主要版本號 WORD MinorSubsystemVersion; // 要求最低子系統版本的次版本號碼 DWORD Win32VersionValue; // 莫須有欄位,不被病毒利用的話一般為0 DWORD SizeOfImage; // 映像裝入記憶體後的總尺寸 DWORD SizeOfHeaders; // 所有頭+ 區塊表的尺寸大小 DWORD CheckSum; // 映像的校檢和 WORD Subsystem; // 可執行檔期望的子系統 WORD DllCharacteristics; // DllMain()函數何時被調用,預設為0 DWORD SizeOfStackReserve; // 初始化時的棧大小 DWORD SizeOfStackCommit; // 初始化時實際提交的棧大小 DWORD SizeOfHeapReserve; // 初始化時保留的堆大小 DWORD SizeOfHeapCommit; // 初始化時實際提交的堆大小 DWORD LoaderFlags; // 與調試有關,預設為0 DWORD NumberOfRvaAndSizes; // 下邊資料目錄的項數,這個欄位自Windows NT 發布以來 // 一直是16 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; // 資料目錄表 } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
1.擴充頭中的ImageBase是做什麼用的?
答:預設載入基址(如果沒有載入到這個地址,會發生重定位)
2.擴充頭中的AddressOfEntryPoint是做什麼用的?
答:程式開始執行的相對虛擬位址(RVA),也叫OEP,Orginal Entry Point,源進入點
3.擴充頭的大小是固定的嗎?為何NT頭要儲存擴充頭的大小?
答:擴充頭的大小是不確定的,
Windows原理常見面試題