admin 发表于 2025-5-9 16:35:31

Windows内核驱动-进程线程 1-12课程

课程介绍​
本系列教程将深入讲解 Windows 内核中的进程和线程相关知识,带领大家了解其运行原理,包括线程切换、强杀进程、进程挂靠的本质等内容。通过理论讲解与小练习相结合的方式,帮助读者更好地掌握 Windows 内核驱动中进程线程的关键技术。​
第 1 课 进程结构体​
在 Windows 内核中,进程是系统进行资源分配和调度的基本单位。而进程结构体(EPROCESS)则是描述进程的核心数据结构,它包含了进程的各种关键信息,如进程 ID、父进程 ID、进程状态、内存信息、句柄表等。通过对进程结构体的研究,我们可以深入了解进程在系统中的运行机制。例如,进程 ID(UniqueProcessId)用于唯一标识一个进程,父进程 ID(InheritedFromUniqueProcessId)则表明了该进程的父进程,这对于理解进程的创建和层次关系至关重要。​
第 2 课 线程结构体​
线程是进程中的执行单元,每个进程至少包含一个线程。线程结构体(ETHREAD)描述了线程的详细信息,包括线程 ID、线程状态、上下文信息、调度信息等。线程的上下文信息保存了线程在执行过程中的各种寄存器值,当线程被切换时,这些信息会被保存和恢复,以确保线程能够正确地继续执行。调度信息则与线程的优先级、时间片等相关,决定了线程在 CPU 上的执行顺序。​
第 3 课 KPCR 与等待链表、调度链表​
KPCR(Kernel Processor Control Region)是内核中与处理器相关的控制区域,每个处理器都有一个对应的 KPCR。KPCR 中包含了处理器的状态信息、当前运行的线程、等待链表头、调度链表头等重要内容。等待链表用于管理那些正在等待某种资源的线程,当资源可用时,系统会从等待链表中唤醒相应的线程。调度链表则根据线程的优先级和状态,决定下一个应该运行的线程,实现 CPU 资源的合理分配。​
第 4 课 线程切换(主动切换)​
线程切换是操作系统实现多任务处理的关键机制之一。主动切换是指线程主动放弃 CPU 使用权的情况,例如当线程需要等待某个事件(如 I/O 操作完成)时,会主动进入等待状态,从而触发线程切换。在主动切换过程中,系统会保存当前线程的上下文信息,将其状态设置为等待状态,并将其放入等待链表中,然后从调度链表中选择一个合适的线程来运行,恢复该线程的上下文信息,使其开始执行。​
第 5 课 线程切换(被动切换)​
被动切换则是线程在运行过程中被迫放弃 CPU 使用权的情况,通常是由于时间片用完或者有更高优先级的线程进入就绪状态。当线程的时间片耗尽时,系统会触发时钟中断,此时会进行线程切换,将当前线程的上下文保存下来,放入就绪队列中,然后选择下一个线程运行。如果有更高优先级的线程就绪,系统会立即进行线程切换,以确保高优先级线程能够及时得到执行,这体现了操作系统的优先级调度策略。​
第 6 课 SwapContext 函数分析​
SwapContext 函数是线程切换过程中的关键函数,它负责保存当前线程的上下文和恢复新线程的上下文。在 x86 架构下,该函数会处理寄存器的保存和恢复,如通用寄存器、段寄存器、标志寄存器等。通过深入分析 SwapContext 函数的实现,可以更好地理解线程切换的底层机制。该函数的调用时机通常是在确定需要进行线程切换时,由调度器调用,从而完成两个线程之间的上下文交换,保证程序的正确执行。​
第 7 课 线程切换的优先级​
线程的优先级在调度过程中起着重要作用。Windows 内核支持多种优先级级别,从低到高分为不同的等级。高优先级的线程在调度时会优先获得 CPU 资源,从而能够更快地执行。线程的优先级可以分为动态优先级和基本优先级,动态优先级会根据线程的运行情况进行调整,例如,经常等待 I/O 操作的线程可能会获得更高的动态优先级,以提高系统的整体性能。了解线程切换的优先级机制,有助于我们更好地理解操作系统如何调度线程,以及如何优化程序的性能。​
第 8 课 进程挂靠​
进程挂靠的本质是将一个进程的执行环境依附到另一个进程中,使得挂靠进程可以共享被挂靠进程的资源和上下文。在实现进程挂靠时,需要修改相关的进程和线程结构体,使得挂靠进程的线程能够在被挂靠进程的地址空间中运行。这在一些特殊的应用场景中非常有用,例如,游戏**可能会通过进程挂靠来读取游戏进程的内存数据。但需要注意的是,进程挂靠也可能带来一些安全问题,需要合理使用。​
第 9 课 小练习:进程隐藏​
进程隐藏是通过修改进程结构体在系统中的链表链接,使得进程在任务管理器等工具中不可见。具体来说,Windows 内核中维护了一个进程链表,每个进程的 EPROCESS 结构体通过双向链表链接在一起。要隐藏一个进程,我们需要将该进程从链表中移除,同时修改其他相关的引用,以避免被系统检测到。在实现过程中,需要注意操作的安全性,避免导致系统崩溃。​
第 10 课 小练习:保护进程​
保护进程的目的是防止进程被非法终止、修改等操作。可以通过监控进程的相关操作,如进程终止请求、内存修改请求等,并根据预设的规则进行过滤和拦截。例如,我们可以在驱动程序中注册相关的回调函数,当系统试图终止或修改被保护进程时,回调函数会被触发,我们可以在回调函数中判断操作是否合法,从而决定是否允许该操作。​
第 11 课 小练习:强杀进程​
强杀进程是指即使进程处于某种保护状态或无法正常终止的情况下,强制终止该进程。这通常需要直接操作进程的内核对象,如关闭进程的所有句柄,终止进程的所有线程等。在实现强杀进程时,需要获取进程的 EPROCESS 结构体,然后调用相关的内核函数来终止进程。需要注意的是,强杀进程可能会导致数据丢失或系统不稳定,应谨慎使用。​
第 12 课 小练习:进程挂靠读游戏内存(DXF)​
以 DXF 游戏为例,进程挂靠读游戏内存的步骤如下:首先找到游戏进程的 PID,然后通过进程挂靠将我们的驱动程序的线程挂靠到游戏进程中,使得我们的线程可以在游戏进程的地址空间中运行。接着,通过读取游戏进程中的内存数据,获取我们需要的信息,如玩家的坐标、血量等。在实现过程中,需要正确处理内存地址的转换,确保能够准确读取到游戏进程的内存数据。**** Hidden Message *****



页: [1]
查看完整版本: Windows内核驱动-进程线程 1-12课程