Windows原理常見面試題
阿新 • • 發佈:2018-04-16
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原理常見面試題