进程和线程数据结构

    • 进程和线程在内核中的结构分别叫做KPROCESS和KTHREAD
    • 进程和线程在执行体层中的结构分别叫做EPROCESS* 和 ETHREAD

    内核重载方法 有什么注意事项

    1. 将内核文件加载到内存
    2. 进行基址重定位
    3. 重定位ssdt结构
    4. 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位系统下 有两种分页机制

      1. 未开启PAE 在未开启PAE的情况下 32位线性地址被分为三个部分:10-10-12 分别被称为页目录索引 页表索引页内偏移 通过当前环境的CR3寄存器 能够访问到页目录表 按照三级索引能够一级一级的找到物理内存
      1. 开启PAE:在开启了PAE的情况下 32位线性地址被分为四个部分 2-9-9-12 分别被称为页目录指针表索引 页目录索引 页表索引 按照四级索引能够一级一级的找到物理内存

    在64位系统下 也有与之类似的模式

    在各自向上索引的过程中 每个项的后12位为页的属性 包括:可读 可写 是否访问过 是否被修改过 是否只能是超级用户访问等属性 从而实现对页内存的保护

    将CR0寄存器的第17位置0 可以关闭页保护