进程和线程数据结构
- 进程和线程在内核中的结构分别叫做KPROCESS和KTHREAD
- 进程和线程在执行体层中的结构分别叫做EPROCESS* 和 ETHREAD
内核重载方法 有什么注意事项
- 将内核文件加载到内存
- 进行基址重定位
- 重定位ssdt结构
- Hook KiFastCallEntry,让RING3进程调用走新内核
简述DPL,CPL,RPL的含义 谈一谈你的理解
- DPL是目标代码段的访问权限
- CPL当前执行权限
- RPL代码段权限
- 当段选择子切换的时候会对特权级别做检测
什么是段选择子 请详细描述段选择子的结构
是一个16位的数值 高13位为全局描述符表的索引 第三位为索引GDT LDT 低两位为RPL
在windbg中如何查看IDT 如何查看GDT
- IDT:r idtr
- GDT:r gdtr
设备通讯有三种方式 是哪三种 有什么区别
1. 缓冲区设备读写方式 将用户态缓冲区拷贝到内核态 在内核态使用完毕再拷贝回用户态
2. 直接读取方式 对用户态内存地址进程重新映射 映射到内核空间
3. 其他方式 具体方式取决于创建完设备对象后 设置其flags的值DO_BUFFERED_IO,DO_DIRECT_IO,0
请简述驱动对象 设备对象 IRP之间的关系
类似于程序 窗口 消息
每个驱动程序只有一个驱动对象(程序实例句柄) 每个对象可以对应一个或多个设备对象(窗口) 每个设备对象可以处理
不同的IRP(消息)
什么是IRQL?
中断请求级别 用于不同的中断执行代码时 不会被低级别的中断代码所打断 一般情况下 非中断代码均运行在较低的级别
学习内核编程中你了解了哪些数据结构
- EPROCESS:执行体进程块 位于内核层 侧重于提供各种管理策略 同时为上层应用程序提供基本的功能接口
- PEB:进程环境块 位于进程地址空间(3环)的内存块 其中包含了有关进程地址空间的堆和模块等信息
- KPROCESS:内核进程块 EPROCESS结构体的第一个成员
- ETHREAD:执行体线程块 位于内核层上 包含了某个进程中的其中一个线程信息 可以通过EPROCESS的ThreadListHead域遍历该进程所有线程的ETHREAD信息
- TEB:线程环境块 位于3环的内存块 用于描述线程的相关信息
- KPCR:由于windows需要支持多个CPU 因为windows内核为此定义了一套以处理器控制区即KPCR为枢纽的数据结构 使每个CPU都有个KPCR,其中KPCR这个结构中有一个域KPRCB结构 这个结构扩展了KPCR这两个结构用来保存与线程切换相关的全局信息 通常FS段寄存器在内核模式下指向KPCR用户模式下指向TEB
3环函数进入0环我们有两种方式 请叙述是哪两种方式
1. 指令SYSENTERY 通过快速系统调用进入内核层
2. int 2E 通过中断门进入内核层
windows中,API调用通过syenter系统进入内核层后 eax中存放着什么 edx中存放着什么
eax为ssdt或shadowssdt的调用号 edx存放着当前的esp栈帧
请简述分页机制
分页机制在CPU看来是可选的 但是主流操作系统均使用了分页机制
在32位系统下 有两种分页机制
- 未开启PAE 在未开启PAE的情况下 32位线性地址被分为三个部分:10-10-12 分别被称为页目录索引 页表索引页内偏移 通过当前环境的CR3寄存器 能够访问到页目录表 按照三级索引能够一级一级的找到物理内存
- 开启PAE:在开启了PAE的情况下 32位线性地址被分为四个部分 2-9-9-12 分别被称为页目录指针表索引 页目录索引 页表索引 按照四级索引能够一级一级的找到物理内存
在64位系统下 也有与之类似的模式
在各自向上索引的过程中 每个项的后12位为页的属性 包括:可读 可写 是否访问过 是否被修改过 是否只能是超级用户访问等属性 从而实现对页内存的保护
将CR0寄存器的第17位置0 可以关闭页保护