标签: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道理常见面试题
标签:Windows道理