如何在Windows 10中识别运行于保护环0的内核进程?以及内核进程与用户/应用进程的区分依据是什么?
嘿,这个问题问到点子上了!我来给你把Windows 10里内核进程(也就是运行在保护环0的执行单元)的识别和区分逻辑讲明白。
首先得明确:Windows里严格来说没有“内核进程”这个标准术语,内核层面主要是线程和驱动程序运行在环0,但日常我们说的“内核进程”一般指那些由内核直接启动、服务于系统核心功能、线程频繁进入环0执行的系统进程。识别它们可以用这些方法:
借助专业工具(最直观)
- Process Explorer(微软Sysinternals套件里的免费工具):打开后点击菜单栏
View > Select Columns,勾选Session ID和Integrity Level。环0相关的系统进程通常属于Session 0,且完整性级别为System;另外看Image Path,它们大多位于C:\Windows\System32或C:\Windows\System32\drivers目录下,比如ntoskrnl.exe(Windows内核本身)、smss.exe(会话管理器)、wininit.exe(系统初始化进程)都是典型代表。 - 任务管理器:切换到「详细信息」标签,右键表头选择「选择列」,添加
会话ID列。Session 0的进程里,那些和系统核心绑定的(比如上述几个)就是我们常说的“内核进程”,但要注意:Session 0里也有用户态的服务进程,得结合路径和完整性级别一起判断。
- Process Explorer(微软Sysinternals套件里的免费工具):打开后点击菜单栏
手动识别特征
- 进程名称都是Windows核心组件,没有第三方应用的名字;
- 无法通过普通用户权限结束它们(强行结束会导致系统崩溃);
- 运行路径都是系统目录,不会出现在用户个人文件夹或第三方软件安装目录。
系统主要靠以下几个核心依据来区分,从底层到上层都有对应逻辑:
内核对象的模式标记
Windows用EPROCESS(进程内核对象)和ETHREAD(线程内核对象)结构体来管理进程和线程,其中ETHREAD里的PreviousMode字段直接标记了线程当前的执行模式:KernelMode(环0)或UserMode(环3)。一个用户进程的线程平时在环3跑,调用系统API时会切换到环0执行内核代码,执行完再切回环3。地址空间隔离
Windows的虚拟地址空间分为用户空间和内核空间(32位系统:用户空间0x00000000-0x7FFFFFFF,内核空间0x80000000-0xFFFFFFFF;64位系统范围更大)。用户模式下的代码只能访问用户空间,一旦试图访问内核空间会直接触发页错误;而内核模式代码可以访问整个地址空间。系统通过内存页的权限标记来强制执行这一点。PE镜像的元数据标记
程序的PE头(Portable Executable)里有明确的特征字段:- 内核驱动(.sys文件)的PE头中,
Characteristics字段会标记为IMAGE_FILE_SYSTEM或IMAGE_FILE_DRIVER,系统加载时会把它放到内核地址空间; - 用户态程序(.exe/.dll)的PE头标记为
IMAGE_FILE_EXECUTABLE_IMAGE,加载到用户地址空间。
- 内核驱动(.sys文件)的PE头中,
权限与完整性级别
环0相关的执行单元拥有最高的System完整性级别,对应的进程令牌(Token)包含系统级别的所有权限;而用户进程的完整性级别通常是Medium或High,权限被严格限制,无法直接修改内核数据或执行环0指令。
内容的提问来源于stack exchange,提问作者PUNIT LADDHA

