操作系统 实验1 GDT表分析+驱动调试

1.GDT表分析:给定段选择子0x23,分析对应的段描述符中相关属性取值:G/P/TYPE三种,并描述TYPE赋值的语义。
段选择子是什么?
引用GDT和LDT中的段描述符所描述的段,是通过一个16-bit的数据结构来实现的,这个数据结构叫做Segment Selector——段选择子。它的高13位作为被引用的段描述符在GDT/LDT中的下标索引,bit 2用来指定被引用段描述符被放在GDT中还是到LDT中,bit 0和bit 1是RPL——请求特权等级,被用来做保护目的。如图所示:
操作系统 实验1 GDT表分析+驱动调试

操作系统 实验1 GDT表分析+驱动调试

段选择子是一个16位的数字,INDEX:在GDT数组或LDT数组的索引号;G:LIMIT的单位,该位 0 表示单位是字节,1表示单位是 4KB;P: 段存在位,该位为 0 表示该段不存在,为 1 表示存在;TYPE: 根据 S 位的结果,再次对段类型进行细分。

操作系统 实验1 GDT表分析+驱动调试

S表示描述符的类型
1 数据段和代码段描述符
0 系统段描述符和门描述符

当 S=1 时TYPE中的4个二进制位情况:
3 2 1 0
执行位 一致位 读写位 访问位
执行位:置1时表示可执行,置0时表示不可执行;
一致位:置1时表示一致码段,置0时表示非一致码段;
读写位:置1时表示可读可写,置0时表示只读;
访问位:置1时表示已访问,置0时表示未访问。
所以一致代码段和非一致代码段的意思就是指这个一致位是否置1,置1就是一致代码段,置0就为非一致代码段。

操作系统 实验1 GDT表分析+驱动调试

在本题中,对选择子:0x23
0000 0000 0010 0011
Index:100=4(第4项) gdt[4]= 00cff300’0000ff
0000 0000 1(G)100 1111 1(P)111(S) 0011(TYPE) 0000 0000
G=1 P=1 TYPE=0011=2 S=1

当S=1时,TYPE=0011,即可读可写向上扩展的数据段

2.驱动调试:使用InstDrv加载驱动1.sys,并通过DbgView观察驱动启动和卸载时的打印输出,截图为证。

操作系统 实验1 GDT表分析+驱动调试

3.windows内核调试器安装:设置windbg符号表路径,启动内核调试模式,运行命令查看当前系统所加载的驱动模块,截图为证。

在用WinDbg进行内核调试之前,得配置好符号变量
windbg访问符号需要两个文件(SYMSRV.DLL 和 SYMSTORE.EXE)所以添加主path环境变量中它们的路径进去,即:windbg安装目录
再配置一个新的符号变量环境变量:_NT_SYMBOL_PATH
SRV*c:\mysymbol*http://msdl.microsoft.com/download/symbol

用lm命令查看当前系统所加载的驱动模块

操作系统 实验1 GDT表分析+驱动调试

4.windows内核数据查看:查看当前运行的进程(process);查看当前系统环境下的SSDT表(KeServiceDescriptorTable);查看当前的系统环境的IDT表(idt)。分别截图为证。

查看当前运行的Process
1.用.process+!process 地址命令查看

操作系统 实验1 GDT表分析+驱动调试

2.用!process命令查看

操作系统 实验1 GDT表分析+驱动调试

SSDT表

操作系统 实验1 GDT表分析+驱动调试

操作系统 实验1 GDT表分析+驱动调试

操作系统 实验1 GDT表分析+驱动调试

查看IDT表

1.用!Prc+dd命令查看IDT表

操作系统 实验1 GDT表分析+驱动调试

2.用!IDT命令查看IDT表

操作系统 实验1 GDT表分析+驱动调试

5.windows内核修改痕迹定位:加载驱动2.sys,结合XueTr以及DbgView输出分析驱动2对内核的中断描述符表的修改,任选一处修改痕迹,在windbg中查看对应的内核地址处修改过程,截图为证。

操作系统 实验1 GDT表分析+驱动调试

先加载并运行驱动2.sys,打开XueTr可以看到中断描述符表许多函数都被修改了

这里选择序号04,Overflow函数 发现当前函数地址从85DF3068被修改到了F79C74C8

在WinDbg中调用u 85DF3068查看,发现里面有个call F79C74C8的命令,发现被修改的痕迹
1
再调用u F79C74C8 l100(显示100行)查看,能看出到底被改了些什么

操作系统 实验1 GDT表分析+驱动调试