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头要存储扩展头的大小?
答:扩展头的大小是不确定的,

原文地址:http://blog.51cto.com/13652962/2103944

时间: 2024-10-03 23:17:42

Windows原理常见面试题的相关文章

PHP常见面试题汇总(二)

PHP常见面试题汇总(二) //第51题:统计一维数组中所有值出现的次数?返回一个数组,其元素的键名是原数组的值;键值是该值在原数组中出现的次数 $array=array(4,5,1,2,3,1,2,"a","a"); $ac=array_count_values($array); /** * 输出结果: * Array( *   [4] => 1 *   [5] => 1 *   [1] => 2 *   [2] => 2 *   [3] 

好程序员web前端分享HTML5常见面试题集锦四

好程序员web前端分享HTML5常见面试题集锦四1.为什么要初始化CSS样式?答案:因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异.当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化.2.浮动元素引起的问题?答案:a. 父元素的高度无法被撑开,影响与父元素同级的元素b. 与浮动元素同级的非浮动元素会跟随其后c. 若非第一个元素浮动,则该元素之前的元素也需要浮动,否则会影响页面显示的结构3.l

linux系统运维企业常见面试题集合(三)

linux系统运维企业常见面试题集合(三) 01  写一个sed命令,修改/tmp/input.txt文件的内容,要求:(1) 删除所有空行:(2) 一行中,如果包含"11111",则在"11111"前面插入"AAA",在"11111"后面插入"BBB",比如:将内容为0000111112222的一行改为:0000AAA11111BBB2222 [[email protected]~]# cat -n /t

【转载】JAVA常见面试题及解答(精华)

JAVA常见面试题及解答(精华) 1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class T { transient int a;  //不需要维持 int b;  //需要维持 } 这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存. volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变.在多线程程序中,有时两个或更多的线程共

java常见面试题——java笔试题总结

注:本文转载自http://www.cnblogs.com/huajiezh/p/5790928.html,版权归其所有! Java常见面试题总结 一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. 3.说说你知道的几个Java集合类:list.set.queue.map实现类咯... 4.描述一下ArrayList和LinkedList各自实现和区别 5.Java中的队列都有哪些,有什么区别. 6.反射中,Class.forName和cl

JDBC常见面试题

以下我是归纳的JDBC知识点图: 图上的知识点都可以在我其他的文章内找到相应内容. JDBC常见面试题 JDBC操作数据库的步骤 ? JDBC操作数据库的步骤 ? 注册数据库驱动. 建立数据库连接. 创建一个Statement. 执行SQL语句. 处理结果集. 关闭数据库连接 代码如下: Connection connection = null; Statement statement = null; ResultSet resultSet = null; try { /* * 加载驱动有两种方

redis知识点及常见面试题

redis知识点及常见面试题 参考: https://zm8.sm-tc.cn/?src=l4uLj4zF0NCIiIjRnJGdk5CYjNGckJLQrIqNiZaJnpOWjIvQno2LlpyTmo zQx87OxsfGztGXi5KT&uid=c9712557c9cde8bef666f89d1d708c67&hid=40c90f91312807e0fc0320b8ae fa07f7&pos=2&cid=9&time=1532475858864&fr

Mybatis常见面试题汇总

Mybatis常见面试题汇总 最近在复习整理Mybatis的相关知识,针对面试中的典型问题,结合相关书籍和网上相关帖子,做如下整理. ================================================================= 1.#{}和${}的区别是什么? 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver.#{}是sql的

史上最全Python工程师常见面试题集锦,有这一份就够了

从互联网诞生以来,基本上所有的程序都属于网络程序,也就需要设计到网络编程,在python中,就是在python程序本身这个进程内,链接别的服务器进程的通信端口进行通信.在Python程序员找工作的时候,京城被问到关于网络编程的问题.下面就和大家分享一下那些面试中经常出现的问题吧. 1.Tcp 协议和 udp 协议有什么区别? (1)TCP 面向连接(如打电话要先拨号建立连接);UDP 是无连接的,即发送数据之前不需要建立连接. (2)每一条 TCP 连接只能是点到点的;UDP 支持一对一,一对多