线程的上下文保存在哪里,是不是可以通过编程方式访问(无需修改内核)?
Posted
技术标签:
【中文标题】线程的上下文保存在哪里,是不是可以通过编程方式访问(无需修改内核)?【英文标题】:Where is a thread's context saved and can it be accessed programmatically (without modifying the kernel)?线程的上下文保存在哪里,是否可以通过编程方式访问(无需修改内核)? 【发布时间】:2021-12-11 17:22:24 【问题描述】:Windows Context Switching
调度器为每个线程维护一个可执行线程队列 优先级。这些被称为就绪线程。当一个处理器 变得可用时,系统执行上下文切换。中的步骤 上下文切换是:
保存刚刚完成执行的线程的上下文。 将刚刚执行完毕的线程放在队列末尾以获得其优先级。 找到包含就绪线程的最高优先级队列。 移除队列头部的线程,加载其上下文并执行它。
我对这个话题还不太了解,所以我不知道如何详细说明我的问题。线程的上下文保存在哪里,是否可以通过编程方式访问(编辑:读取)(无需修改内核)?
【问题讨论】:
出于好奇,如果您的程序能够修改自己挂起线程的上下文,您认为它会做什么? @SolomonSlow 可能不会修改,只是为了扫描目的而阅读。网络安全工具。 嗯...我正在删除我之前的评论。我没有想清楚这个问题。 Windows 可能有一个 debugging API。 (调试器如何在受保护模式的操作系统中工作?)我不知道你会在哪里寻找它,但这可能就是你想要的。 @SolomonSlow 确实如此,但恶意和良性程序都试图阻止调试,很容易检测到调试器已附加。 AFAIK,线程上下文存储在内核数据结构中,如果没有特权,您不能直接访问它,而且很可能不是来自用户空间。我不熟悉 Windows 内核,但是 Linux 内核模块可以很容易地访问调度信息,所以我猜内核模式的 Windows 服务也可以做到这一点。 【参考方案1】:如果您拥有具有所需访问权限的线程的句柄,您可以暂停该线程,然后调用GetThreadContext
。当线程运行时,值在实际的 CPU 寄存器中,当它不运行时,上下文存储在内存中,用户模式无法访问。
上下文存储各种 CPU 寄存器的值,它只对调试器和代码注入和错误日志等高级功能有用。
【讨论】:
以上是关于线程的上下文保存在哪里,是不是可以通过编程方式访问(无需修改内核)?的主要内容,如果未能解决你的问题,请参考以下文章