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
-
SwapContext 有几个参数,分别是什么?
2个参数 第一个参数:WaitIrql 第二个是要切换的线程_KTHREAD
-
SwapContext 在哪里实现了线程切换
-
线程切换的时候,会切换CR3吗?切换CR3的条件是什么?
会切换。
-
中断门提权时,CPU会从TSS得到ESP0和SS0,TSS中存储的一定是当前线程的ESP0和SS0吗?如何做到的?
是的。
-
FS:[0]在3环指向TEB,但是线程有很多,FS:[0]指向的是哪个线程的TEB,如何做到的?
修改了3环的gs。
-
0环的 ExceptionList 在哪里备份的?
没有找到
-
IdleThread是什么?什么时候执行?找到这个函数.
-
如何找到下一个就绪线程?
-
模拟线程切换与Windows线程切换有哪些区别?
模拟切换不是真正的切换
SwapContext流程浅析:
先比较目标线程是不是处于运行状态,不是就就置为1(运行)否在跳走处理
清除中断 读取时间戳 修改_KPRCB中的时间戳 判断是否有要处理的中断没有就跳走 有的话调用HalRequestSoftwareInterrupt 处理中断请求 一般会跳走
这个函数没逆 估计是统计线程开始周期
之后_KPRCB.KeContextSwitches次数+1
比较目标线程是不是空闲线程 _KPRCB.IdleThread这个里面存放的是_KTHREAD结构体对象
之后一段 比较系统标志 没研究过先跳过, 到了关键代码 , 把当前的Rsp保存到_KTHREAD.KernelStack,然后把目标线程取出来_KTHREAD.KernelStack赋值给Rsp
比较目标父进程是不是当前进程的父进程 不是就跳走
比较目标线程所在进程是不是和当前线程所在进程相等,如果不相等就取得目标线程的Cr3 修改当前Cr3寄存器 (但是我用windbg逆的时候发现Ida里面显示Cr3 但是windbg显示是tmm寄存器(估计是windbg不识别字节码) 还有搞不懂为什么要执行完下一条的指令windbg cr3才会更改)
修改Tss中的Rsp0 和_KPRCB.RspBase为目标进程的栈
把旧的线程运行状态置为0
中途判断了一下KeFeatureBits全局标志进行了几次跳转,来到了设置fs寄存器(因为64位系统下32位进程3环Teb依旧是fs但是0环就是gs)和设置 gs寄存器 三环TEB的地方(SWAPGS 指令缓存的地方 由于目前是0环 所有缓存的地方就是3环gs 也就是64位进程的Teb)
目标进程结构体_KTHREAD.ContextSwitches次数+1 没有中断请求 直接退出了