一、回顾

上一篇博客,我带着以下的问题逆向分析了 KiSwapContext 和 SwapContext 这两个函数:

  1. SwapContext 有几个参数,分别是什么?
  2. SwapContext 在哪里实现了线程切换
  3. 线程切换的时候,会切换CR3吗?切换CR3的条件是什么?
  4. 中断门提权时,CPU会从TSS得到ESP0和SS0,TSS中存储的一定是当前线程的ESP0和SS0吗?如何做到的?
  5. FS:[0]在3环指向TEB,但是线程有很多,FS:[0]指向的是哪个线程的TEB,如何做到的?
  6. 0环的 ExceptionList 在哪里备份的?
  7. IdleThread是什么?什么时候执行?找到这个函数.
  8. 如何找到下一个就绪线程?
  9. 模拟线程切换与Windows线程切换有哪些区别?

通过分析这俩函数,我们已经对Windows线程切换的过程有了一定了解,其中,7,8问题还没有解决,这篇博客就是来解决这些问题的。

二、分析 KiSwapThread

我们还是带着问题来分析这个函数。


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

空闲线程,当 KiSwapThread 找不到新的就绪线程,就会切换到这个 IdleThread,观察下面的代码:

.text:00429CB5                 call    @KiFindReadyThread@8 ; KiFindReadyThread(x,x)
.text:00429CBA                 test    eax, eax        ; 如果调用 KiFindReadyThread 找到就绪线程,就跳转
.text:00429CBA                                         ;
.text:00429CBA                                         ; 如果找不到就绪线程,那么就找空闲线程
.text:00429CBC                 jnz     short loc_429CCE
.text:00429CBE                 mov     eax, [esi+_KPRCB.IdleThread] ; 从 _KPRCB 里取空闲线程的 _ETHREAD
.text:00429CC1                 xor     edx, edx
.text:00429CC3                 inc     edx
.text:00429CC4                 mov     ecx, ebx
.text:00429CC6                 shl     edx, cl
.text:00429CC8                 or      _KiIdleSummary, edx ; _KiIdleSummary 第n位置1,就表明优先级n的调度链表里有值

当 KiFindReadyThread 函数找不到就绪线程,就从 KPCR 里取空闲线程,取完之后要修改 _KiIdleSummary 全局变量。

IdleThread 执行的函数叫 KiIdleLoop:

没看到它调用切换线程的代码,猜测是靠时钟中断切换线程的。


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

下面的代码判断 _KPRCB.NextThread 里是否有值,如果有就直接切换到这个线程;

mov     edi, edi
push    esi
push    edi
db      3Eh
mov     eax, ds:0FFDFF020h
mov     esi, eax        ; esi, eax 指向 _KPRCB
mov     eax, [esi+_KPRCB.NextThread]
test    eax, eax
mov     edi, [esi+_KPRCB.CurrentThread] ; edi = _KPRCB.CurrentThread
jz      short loc_429CAC ; 如果 _KPCR 里存了 NextThread (非0); 就直接切换线程;; 如果没有,就调用 KiFindReadyThread 找一个就绪线程

如果 _KPRCB.NextThread 是空值,就调用 KiFindReadyThread 找一个就绪线程;

loc_429CAC:
push    ebx
movsx   ebx, [esi+_KPRCB.Number]
xor     edx, edx
mov     ecx, ebx
call    @KiFindReadyThread@8 ; KiFindReadyThread(x,x)
test    eax, eax        ; 如果调用 KiFindReadyThread 找到就绪线程,就跳转;; 如果找不到就绪线程,那么就找空闲线程
jnz     short loc_429CCE

如果调用 KiFindReadyThread 返回的仍是空值,就执行下面的代码找空闲线程:

mov     eax, [esi+_KPRCB.IdleThread] ; 从 _KPRCB 里取空闲线程的 _ETHREAD
xor     edx, edx
inc     edx
mov     ecx, ebx
shl     edx, cl
or      _KiIdleSummary, edx

(60)逆向分析 KiSwapThread —— 找就绪线程和空闲线程相关推荐

  1. 微信逆向分析(二)——逆向分析的方法

    上一篇,聊到逆向分析是找偏移,有依据地找,效率会快.这一篇聊下找偏移方法.只说概念,具体的细节,后续会配合实战再展开细说. 找偏移的方法 1.内存 逆向的目的,是找功能或者数据在内存的地址.最直接的方 ...

  2. RT-thread内核之空闲线程

    空闲线程是系统线程中一个比较特殊的线程,它具有最低的优先级,当系统中无其他线程可运行时,调度器将调度到空闲线程.空闲线程通常是一个死循环,永远不被挂起.RT-Thread实时操作系统为空闲线程提供了钩 ...

  3. 从0到1写RT-Thread内核——空闲线程与阻塞延时的实现

    在之前写的另外一篇文章--<从0到1写RT-Thread内核--线程定义及切换的实现>中线程体内的延时使用的是软件延时,即还是让CPU空等来达到延时的效果.RTOS中的延时叫阻塞延时,即线 ...

  4. mysql 关闭线程池_线程池安全的关闭方式

    对于一些定时任务或者网络请求服务将会使用线程池,当应用停机时需要正确安全的关闭线程池,如果处理不当,可能造成数据丢失,业务请求结果不正确等问题. 关闭线程池我们可以选择什么都不做,JVM 关闭时自然的 ...

  5. RT_thread空闲线程及两个常用的钩子函数

    一.空闲线程 空闲线程是一个比较特殊的系统线程,它具备最低的优先级.当系统中无其他就绪线程可运行,调度器将调度到空闲线程. 空闲线程还负责一些系统资源回收以及将一些处于关闭台的线程从线程调度列表中移除 ...

  6. 线程池(线程池介绍与使用)

    #博学谷IT学习技术支持# 文章目录 线程池 1. 线程状态介绍 2. 线程池-基本原理 3. 线程池-Executors默认线程池 4. 线程池-Executors创建指定上限的线程池 5. 线程池 ...

  7. (59)逆向分析 KiSwapContext 和 SwapContext —— 线程切换核心代码

    一.前言 在前面的课程中,我们研究了模拟线程切换的代码,学习了 _KPCR,ETHREAD,EPROCESS 等内核结构体,这些都是为了学习Windows线程切换做的准备. 线程切换是操作系统的核心内 ...

  8. Android 逆向分析大全

    转载:Android 逆向分析大全:https://www.jianshu.com/p/a12d04fc748f 1. 概述 1.1 分析步骤 通用逆向分析步骤 1. 了解该模块正向编程相关方法 2. ...

  9. 视频教程-x86/x64软件逆向分析入门-C/C++

    x86/x64软件逆向分析入门 成都理工大学优秀讲师,教授,二十年开发经验,和十六年一线教学工作经验,发表学术论文十余篇.参与包括863项目等多个国家级科研项目,参与包括微信机器人(WeChaty)等 ...

最新文章

  1. pyhton 面向对象(下)
  2. 解释型语言和编译型语言的区别_从泛型的使用情况看出你对语言的理解程度(2)...
  3. python-函数的使用 0222
  4. 传闻或成真!这款新iPhone真就要停产了...
  5. oracle undoautotune,Oracle 隐藏参数:_undo_autotune、一个吃力不讨好的活
  6. linux 共享内存为分配,Linux在x86_64上共享内存分配
  7. GIFLIB 5.0.1 发布,C语言的GIF处理库
  8. 使用计算机音箱进行音乐播放的过程,插卡音箱音乐播放顺序调整及歌单式1
  9. mPaas集成项目、新建mPaaS项目
  10. 2022虎年背景全新UI头像框制作微信小程序源码下载支持多种流量主
  11. Fedora 9.0 官方下载
  12. sudo spctl --master-disable
  13. 第1年的放射学侵蚀进展是早期RA进一步侵蚀性进展的新预测指标
  14. 毕业参加工作了,记住一句话,攒钱绝对靠谱
  15. MATLAB判断是不是质数,MATLAB脚本质数的判断
  16. 微信小程序—map地图实现标记多个位置
  17. ERP销售人员快速上手
  18. 《Android源码设计模式解析与实战》读书笔记(十)
  19. 祁隆爱徒任妙音评论区被网暴,会影响和合国际收购《借我星光》吗
  20. 彻底解决机械硬盘经常卡顿2秒问题

热门文章

  1. Php在线字体woff转svg,在线字体格式转换ttf/otf/eot/woff/woff2格式工具
  2. Xshell:Xshell的简介、安装、使用方法之详细攻略
  3. 已解决:Ubuntu16.4和Windows10创建共享文件夹
  4. webpack 3.1 升级webpack 4.0
  5. CentOS7安装xfce桌面环境
  6. 设计模式(八): 从“小弟”中来类比外观模式(Facade Pattern)
  7. Sphinx-安装和配置
  8. JS模块化写法(转)
  9. JQuery DOM基本操作
  10. 开启Apache mod_rewrite模块(解决404 Not Found)