title: Window10 SwapContext分析
id: beadf742-3cab-445d-b27d-6d53b232813c
date: 2024-08-16 09:45:32
auther: 1256455767
cover: null
excerpt: SwapContext 有几个参数,分别是什么? 2个参数 第一个参数WaitIrql 第二个是要切换的线程_KTHREAD SwapContext 在哪里实现了线程切换 线程切换的时候,会切换CR3吗?切换CR3的条件是什么? 会切换。 中断门提权时,CPU会从TSS得到ESP0和SS0,TSS
permalink: /archives/04b9ba22-43ca-434a-9a21-9d272026e4d4
categories:

  • windowsnei-he
    tags:
  • wincao-zuo-xi-tong

  1. SwapContext 有几个参数,分别是什么?

    2个参数 第一个参数:WaitIrql 第二个是要切换的线程_KTHREAD

  2. SwapContext 在哪里实现了线程切换

    SwapStack

  3. 线程切换的时候,会切换CR3吗?切换CR3的条件是什么?

    会切换。
    CmpProcess

  4. 中断门提权时,CPU会从TSS得到ESP0和SS0,TSS中存储的一定是当前线程的ESP0和SS0吗?如何做到的?

    是的。
    SaveRsp0

  5. FS:[0]在3环指向TEB,但是线程有很多,FS:[0]指向的是哪个线程的TEB,如何做到的?

    修改了3环的gs。
    WRGS

  6. 0环的 ExceptionList 在哪里备份的?

    没有找到

  7. IdleThread是什么?什么时候执行?找到这个函数.

  8. 如何找到下一个就绪线程?

  9. 模拟线程切换与Windows线程切换有哪些区别?

    模拟切换不是真正的切换

SwapContext流程浅析:

先比较目标线程是不是处于运行状态,不是就就置为1(运行)否在跳走处理
isrun

清除中断 读取时间戳 修改_KPRCB中的时间戳 判断是否有要处理的中断没有就跳走 有的话调用HalRequestSoftwareInterrupt 处理中断请求 一般会跳走

isInt

这个函数没逆 估计是统计线程开始周期
Period

之后_KPRCB.KeContextSwitches次数+1

addcount

比较目标线程是不是空闲线程 _KPRCB.IdleThread这个里面存放的是_KTHREAD结构体对象

CmpIdeaThread

之后一段 比较系统标志 没研究过先跳过, 到了关键代码 , 把当前的Rsp保存到_KTHREAD.KernelStack,然后把目标线程取出来_KTHREAD.KernelStack赋值给Rsp
SwapStack

比较目标父进程是不是当前进程的父进程 不是就跳走
CmpParent

比较目标线程所在进程是不是和当前线程所在进程相等,如果不相等就取得目标线程的Cr3 修改当前Cr3寄存器 (但是我用windbg逆的时候发现Ida里面显示Cr3 但是windbg显示是tmm寄存器(估计是windbg不识别字节码) 还有搞不懂为什么要执行完下一条的指令windbg cr3才会更改)
CmpProcess

tmmchangeCr3

修改Tss中的Rsp0 和_KPRCB.RspBase为目标进程的栈
Rsp0

把旧的线程运行状态置为0
set0

中途判断了一下KeFeatureBits全局标志进行了几次跳转,来到了设置fs寄存器(因为64位系统下32位进程3环Teb依旧是fs但是0环就是gs)和设置 gs寄存器 三环TEB的地方(SWAPGS 指令缓存的地方 由于目前是0环 所有缓存的地方就是3环gs 也就是64位进程的Teb)
SetTeb

SetGs

WRGS

目标进程结构体_KTHREAD.ContextSwitches次数+1 没有中断请求 直接退出了