一、项目概述
1.1 从 Process Hacker 到 System Informer 的演进
System Informer (前身为 Process Hacker )是 Windows 平台上最强大的开源系统监控、进程管理和调试工具之一。由 Winsider Seminars & Solutions, Inc. 开发和维护,现已发展成为替代 Windows 任务管理器的最佳选择。
"A free, powerful, multi-purpose tool that helps you monitor system resources , debug software and detect malware."
| 项目属性 | 详情 |
|---|---|
| 现用名 | System Informer |
| 前身 | Process Hacker(2.0 ~ 3.0) |
| GitHub 仓库 | winsiderss/systeminformer |
| 官网 | systeminformer.com |
| 许可证 | MIT |
| Stars | ⭐ 14.5k+ |
| Forks | 🍴 1.7k+ |
| 提交数 | 15,790+ 次 |
| 最新版本 | v3.2.25011.2103(2025年5月14日) |
1.2 项目定位与核心价值
System Informer 的核心定位是:超越任务管理器的全能系统工具。
| 对比维度 | Windows 任务管理器 | System Informer |
|---|---|---|
| 进程信息深度 | 基础 | 极深(句柄、内存、线程、模块) |
| 服务管理 | 简单 | 完整(创建、编辑、控制) |
| 网络监控 | 基础 | 详细(连接、进程关联、可关闭) |
| 调试功能 | 无 | 强大(堆栈跟踪、内核模式支持) |
| 便携性 | 需安装 | 免安装、U 盘可用 |
| 开源 | 否 | 是(MIT) |
二、核心功能详解
2.1 系统资源监控
实时图表与统计
System Informer 提供详细的系统活动概览,带有高亮显示:
系统监控面板
├── CPU 使用率(按进程、核心、NUMA 节点)
├── 内存使用(物理、虚拟、分页文件)
├── I/O 读写速率
├── GPU 使用率(引擎、显存)
├── 磁盘活动(读写、响应时间)
└── 网络流量(按适配器、进程)
资源消耗定位
"Graphs and statistics allow you quickly to track down resource hogs and runaway processes."
- 实时高亮:资源消耗大的进程会自动高亮显示
- 快速排序:点击列标题即可按任意指标排序
- 历史图表:可查看 CPU、内存、I/O 的历史趋势
2.2 进程管理
深度进程信息
| 信息类别 | 详细内容 |
|---|---|
| 基本信息 | PID、PPID、用户名、会话、优先级、亲和性 |
| 内存 | 工作集、私有字节、可共享字节、堆信息 |
| 线程 | TID、CPU 时间、等待原因、启动地址 |
| 模块 | DLL 路径、版本、数字签名、加载时间 |
| 句柄 | 文件、注册表键、事件、互斥量等所有句柄 |
| Token | 权限、组、完整性级别、UAC 虚拟化 |
| DEP/ASLR | 数据执行保护、地址空间布局随机化 |
| .NET | 托管堆、GC 代数、JIT 编译统计 |
高级操作
markdown
✅ 强制结束进程(包括顽固进程)
✅ 挂起/恢复进程
✅ 编辑环境变量
✅ 设置优先级和 I/O 优先级
✅ 设置处理器亲和性(支持最多 64 个处理器)
✅ 创建转储文件(Full/Mini/Dump)
✅ 重启进程
✅ 检测进程字符串
2.3 文件占用检测
"Can't edit or delete a file? Discover which processes are using that file."
这是 System Informer 最受欢迎的功能之一:
使用场景:
尝试删除文件 → 提示"文件被占用" → 无法删除
解决方案:
1. 在 System Informer 中搜索文件名
2. 查看哪些进程持有该文件的句柄
3. 关闭这些进程或强制释放句柄
4. 成功删除文件
2.4 网络监控
"See what programs have active network connections, and close them if necessary."
功能特性
| 功能 | 说明 |
|---|---|
| 连接列表 | 显示所有 TCP/UDP 连接和监听端口 |
| 进程关联 | 每个连接都关联到具体进程 |
| 远程地址 | 显示远程 IP 和端口 |
| 强制关闭 | 可强制关闭指定连接 |
| 流量统计 | 按进程统计网络发送/接收量 |
| 防火墙状态 | 显示连接的防火墙规则状态 |
2.5 服务管理
"Go beyond services.msc: create, edit and control services."
超越 services.msc
| 功能 | services.msc | System Informer |
|---|---|---|
| 启动/停止服务 | ✅ | ✅ |
| 创建新服务 | ❌ | ✅ |
| 编辑服务配置 | 基础 | ✅ 完整 |
| 查看服务进程 | ❌ | ✅ |
| 服务依赖关系 | 简单 | ✅ 图形化展示 |
| 驱动服务管理 | 基础 | ✅ 完整 |
2.6 堆栈跟踪与调试
"View detailed stack traces with kernel-mode, WOW64 and .NET support."
调试功能
堆栈跟踪
├── 用户模式堆栈
├── 内核模式堆栈(需内核驱动)
├── WOW64 转换(32 位进程在 64 位系统上)
├── .NET 托管调用栈
└── 符号解析(需要 PDB 符号文件)
2.7 恶意软件检测
System Informer 集成了多种恶意软件检测机制:
| 检测方式 | 说明 |
|---|---|
| 数字签名验证 | 检查进程/模块是否有有效数字签名 |
| 行为分析 | 监控可疑行为(如注入、隐藏) |
| 文件锁定检测 | 发现恶意软件锁定的文件 |
| 网络异常检测 | 发现可疑的外连行为 |
| 服务隐藏检测 | 识别隐藏的或可疑的系统服务 |
| 内核级监控 | 通过驱动获取底层系统活动 |
三、技术架构分析
3.1 项目结构
SystemInformer/
├── SystemInformer/ # 主应用程序(用户模式)
│ ├── resources/ # 图标、对话框资源
│ ├── SystemInformer.rc # 资源定义
│ └── ... # 主程序源代码
│
├── KSystemInformer/ # 内核模式驱动
│ ├── drvmain.c # 驱动入口
│ ├── process.c # 进程通知回调
│ ├── thread.c # 线程通知回调
│ └── ... # 其他内核功能
│
├── kphlib/ # 内核模式辅助库(Kernel PH Library)
│ ├── kph.c # 内核函数封装
│ └── ...
│
├── phlib/ # 用户模式核心库(Process Hacker Library)
│ ├── process.c # 进程相关函数
│ ├── memory.c # 内存操作函数
│ ├── thread.c # 线程操作函数
│ └── ...
│
├── phnt/ # Windows NT 内部 API 头文件
│ ├── ntdll.h # NTDLL 导出函数声明
│ ├── ntos.h # 内核函数声明
│ └── ... # 大量未公开 API 声明
│
├── plugins/ # 插件系统
│ ├── DotNetTools/ # .NET 程序分析插件
│ ├── ExtendedTools/ # 扩展工具(磁盘、网络图表)
│ ├── HardwareDevices/ # 硬件设备监控(原 NetAdapters)
│ ├── ToolStatus/ # 工具栏和状态栏
│ ├── UserNotes/ # 用户备注
│ └── Updater/ # 自动更新插件
│
├── tools/ # 辅助开发工具
│ └── ...
│
├── build/ # 构建脚本
│ ├── build_init.cmd # 初始化构建环境
│ ├── build_release.cmd # 编译发布版本
│ └── README.md # 构建文档
│
├── cmake/ # CMake 配置
│ └── ...
│
├── SystemInformer.sln # Visual Studio 解决方案
├── Plugins.sln # 插件解决方案
├── CMakeLists.txt # CMake 主配置
└── ...
3.2 编程语言构成
| 语言 | 占比 | 用途 |
|---|---|---|
| C | 88.6% | 核心功能、内核驱动、系统调用 |
| C++ | 7.5% | 部分组件、插件 |
| C# | 3.3% | 工具、辅助脚本、插件 |
| Batchfile | 0.3% | 构建脚本 |
| CMake | 0.3% | 构建系统配置 |
| PowerShell | 0.0% | 辅助脚本 |
3.3 核心技术组件
3.3.1 phnt ------ Windows NT 内部 API 封装
phnt/ 是 System Informer 最具价值的技术资产之一,包含了大量 未公开的 Windows NT 内部 API 的声明和封装。
c
// 示例:ntdll.h 中的声明
NTSYSCALAPI
NTSTATUS
NTAPI
NtQuerySystemInformation(
_In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,
_Inout_ PVOID SystemInformation,
_In_ ULONG SystemInformationLength,
_Out_opt_ PULONG ReturnLength
);
// 使用示例:枚举所有进程
PSYSTEM_PROCESS_INFORMATION processInfo;
ULONG bufferSize = 0x10000;
PVOID buffer = PhAllocate(bufferSize);
NtQuerySystemInformation(
SystemProcessInformation,
buffer,
bufferSize,
NULL
);
// 遍历进程链表
PSYSTEM_PROCESS_INFORMATION p = buffer;
while (TRUE) {
// 处理进程信息
if (p->NextEntryOffset == 0) break;
p = (PSYSTEM_PROCESS_INFORMATION)((PUCHAR)p + p->NextEntryOffset);
}
3.3.2 phlib ------ 用户模式核心库
phlib/ 提供了丰富的用户模式辅助函数:
| 模块 | 功能 |
|---|---|
process.c/h |
进程枚举、信息获取、操作 |
memory.c/h |
内存读取/写入、内存区域枚举 |
thread.c/h |
线程枚举、线程操作 |
module.c/h |
模块枚举、模块信息获取 |
handle.c/h |
句柄枚举、句柄操作 |
service.c/h |
服务管理 |
network.c/h |
网络连接枚举 |
provider.c/h |
进程提供者(实时更新进程信息) |
3.3.3 KSystemInformer ------ 内核模式驱动
KSystemInformer/ 是内核模式驱动,提供超越用户模式的能力:
c
// 驱动主要功能
├── 进程创建/退出通知
├── 线程创建/退出通知
├── 镜像加载通知
├── 注册表操作监控
├── 文件操作监控
├── 对象回调(ObRegisterCallbacks)
├── 进程/线程/句柄操作
└── 内核模式堆栈回溯
关键代码流程:
用户模式请求
↓
DeviceIoControl (自定义 IOCTL)
↓
内核驱动分发函数(DispatchDeviceControl)
↓
执行内核操作(如枚举进程、读取内存)
↓
返回结果到用户模式
3.3.4 插件系统
System Informer 支持插件扩展,插件使用明确的 API 接口:
c
// 插件导出函数
BOOLEAN NTAPI PhPluginInitialization(
_In_ PPH_PLUGIN Plugin
);
BOOLEAN NTAPI PhPluginCleanup(
_In_ PPH_PLUGIN Plugin
);
// 插件可以:
// 1. 添加新的菜单项
// 2. 添加新的标签页
// 3. 处理事件通知
// 4. 扩展现有功能
四、编译与安装指南
4.1 系统要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10 或更高版本 |
| 架构 | 32 位(x86)或 64 位(x64) |
| 构建工具 | Visual Studio 2022 或更高版本 |
| 可选 | CMake 3.10+ |
4.2 从源码编译
步骤 1:克隆仓库
bash
git clone https://github.com/winsiderss/systeminformer.git
cd systeminformer
步骤 2:初始化构建环境(仅首次需要)
bash
cd build
build_init.cmd
此脚本会:
- 下载必要的构建工具
- 更新第三方库(如果有)
- 配置构建环境
步骤 3:编译项目
方式一:使用构建脚本
bash
build_release.cmd
方式二:使用 Visual Studio
- 打开
SystemInformer.sln(主程序) - 打开
Plugins.sln(插件) - 选择配置(Debug/Release)
- 构建解决方案
步骤 4:获取编译输出
bin/
├── Debug-x64/
│ ├── SystemInformer.exe
│ ├── KSystemInformer.sys
│ └── plugins/
├── Release-x64/
├── Debug-x86/
└── Release-x86/
4.3 便携式运行
System Informer 支持完全便携式运行:
U 盘/
└── SystemInformer/
├── SystemInformer.exe
├── SystemInformer.exe.settings.xml # 配置文件(可选)
├── KSystemInformer.sys
└── plugins/
启用便携式配置
- 在文件夹选项中取消勾选"隐藏已知文件类型的扩展名"
- 在 SystemInformer.exe 同目录下创建一个空白文件
- 将文件重命名为
SystemInformer.exe.settings.xml
五、使用指南
5.1 界面布局
System Informer 主界面
┌─────────────────────────────────────────────┐
│ 菜单栏 │
├─────────────────────────────────────────────┤
│ 工具栏(可选,ToolStatus 插件) │
├──────────────────┬──────────────────────────┤
│ │ │
│ 进程树列表 │ 进程属性 / 详细信息 │
│ (可排序、 │ (标签页切换) │
│ 可筛选、 │ │
│ 高亮显示) │ ┌─────────────────────┐ │
│ │ │ 进程 │ 性能 │ 线程 │ │ │
│ │ ├─────────────────────┤ │
│ │ │ 模块 │ 句柄 │ 内存 │ │ │
│ │ ├─────────────────────┤ │
│ │ │ Token │ ... │ │ │ │
│ │ └─────────────────────┘ │
├──────────────────┴──────────────────────────┤
│ 状态栏(可选) │
└─────────────────────────────────────────────┘
5.2 常用操作
查找文件占用进程
场景:无法删除文件 "example.txt"
步骤:
1. 按 Ctrl+F(查找句柄)
2. 输入文件名 "example.txt"
3. 查看搜索结果,显示持有该文件句柄的进程
4. 右键该进程 → 关闭句柄(或结束进程)
5. 现在可以删除文件了
查看进程详细信息
右键进程 → 属性(或双击进程)
↓
弹出进程属性对话框
↓
标签页:
- 进程:基本信息、内存、CPU、I/O
- 线程:线程列表、CPU 使用率、等待原因
- 模块:加载的 DLL 列表
- 句柄:打开的句柄(文件、注册表、事件等)
- 内存:内存区域、堆信息
- Token:权限、组、完整性级别
- .NET:托管堆、JIT 信息(.NET 进程)
- 服务等
强制结束顽固进程
右键进程 → 终止(或按 Delete 键)
↓
如果无法结束:
1. 勾选"强制终止"
2. 如果仍然无法结束,可能需要内核驱动支持
3. 安装 KSystemInformer 驱动后重试
5.3 系统信息窗口
按 Ctrl+I 或 菜单 → View → System Information:
系统信息窗口
├── 计算机(CPU、内存、系统信息)
├── CPU(每个核心的使用率图表)
├── 内存(物理内存、虚拟内存图表)
├── I/O(磁盘读写速率)
├── GPU(GPU 引擎使用率、显存)
└── 网络(每个适配器的流量图表)
技巧 :按 F11 可以全屏显示系统信息窗口。
5.4 网络连接管理
菜单 → View → Network
↓
网络连接列表
├── 协议(TCP/UDP)
├── 本地地址:端口
├── 远程地址:端口
├── 状态(Established、Listen 等)
├── PID
└── 进程名
↓
右键连接 → Close(强制关闭连接)
六、插件系统详解
6.1 官方插件
| 插件名 | 功能 |
|---|---|
| DotNetTools | .NET 程序分析(托管堆、GC、JIT) |
| ExtendedTools | 扩展工具(磁盘活动、网络图表、GPU 信息) |
| HardwareDevices | 硬件设备监控(原 NetAdapters,网络适配器图表) |
| ToolStatus | 工具栏和状态栏增强 |
| UserNotes | 为用户/进程添加备注 |
| Updater | 自动检查更新并安装 |
6.2 插件开发入门
插件基本结构
c
#include <ph.h>
#include <phplugin.h>
BOOLEAN NTAPI PhPluginInitialization(
_In_ PPH_PLUGIN Plugin
)
{
// 注册插件信息
PhRegisterPlugin(Plugin);
// 添加菜单项
PhPluginAddMenuItem(Plugin, ...);
// 注册回调函数
PhRegisterCallback(...);
return TRUE;
}
BOOLEAN NTAPI PhPluginCleanup(
_In_ PPH_PLUGIN Plugin
)
{
// 清理资源
return TRUE;
}
// 导出函数
PH_PLUGIN_EXPORT BOOLEAN NTAPI PhPluginInitialization(...);
PH_PLUGIN_EXPORT BOOLEAN NTAPI PhPluginCleanup(...);
6.3 安装插件
将插件 DLL 放入 plugins/ 目录
↓
重启 System Informer
↓
菜单 → Options → Plugin Settings
↓
勾选要启用的插件
七、技术深度剖析
7.1 Windows 内部 API 的运用
System Informer 的强大之处在于深度运用 Windows 未公开的内部 API:
NtQuerySystemInformation
c
// 获取系统进程信息
NtQuerySystemInformation(
SystemProcessInformation,
buffer,
bufferSize,
&returnLength
);
// 获取系统内存信息
NtQuerySystemInformation(
SystemBasicPerformanceInformation,
&perfInfo,
sizeof(SYSTEM_BASIC_PERFORMANCE_INFORMATION),
NULL
);
NtQueryInformationProcess
c
// 获取进程 PEB 地址
NtQueryInformationProcess(
ProcessHandle,
ProcessBasicInformation,
&basicInfo,
sizeof(PROCESS_BASIC_INFORMATION),
NULL
);
// 读取进程内存
NtReadVirtualMemory(
ProcessHandle,
BaseAddress,
Buffer,
BufferSize,
&NumberOfBytesRead
);
7.2 内核驱动通信
用户模式 内核模式
│ │
│ DeviceIoControl(hDevice, IOCTL_XXX, input, ...) │
│────────────────────────────────────────────────────────────>│
│ │
│ │ DispatchDeviceControl(...)
│ │
│ │ switch (IoControlCode) {
│ │ case IOCTL_ENUM_PROCESSES:
│ │ // 枚举进程
│ │ break;
│ │ case IOCTL_READ_MEMORY:
│ │ // 读取内存
│ │ break;
│ │ }
│ │
│<────────────────────────────────────────────────────────────│
│ GetLastError() / Parse output buffer │
7.3 进程提供者(Process Provider)
System Informer 使用"提供者"模式实时更新进程信息:
c
// 创建进程提供者
PPH_PROVIDER ProcessProvider = PhCreateProvider(
PROCESS_PROVIDER_TYPE,
ProcessProviderCallback,
NULL
);
// 提供者回调函数(定时执行)
VOID NTAPI ProcessProviderCallback(
_In_ PVOID Context
)
{
// 枚举所有进程
// 更新进程列表
// 触发更新通知
}
八、与 Windows 任务管理器的全面对比
| 功能维度 | Windows 任务管理器 | System Informer |
|---|---|---|
| 开源 | ❌ 闭源 | ✅ MIT 开源 |
| 便携性 | ❌ 系统内置 | ✅ 免安装 |
| 进程列表 | 基础信息 | 极详细信息(句柄、模块、线程、内存、Token) |
| 服务管理 | 简单查看/启停 | 创建、编辑、完整控制 |
| 网络监控 | 基础 | 详细(进程关联、可关闭连接) |
| 磁盘监控 | 仅 I/O 速率 | 详细磁盘活动、文件操作 |
| GPU 监控 | 基础 | 详细(引擎使用率、显存、温度) |
| 调试功能 | 无 | 堆栈跟踪、内核模式支持、.NET 分析 |
| 文件占用检测 | ❌ | ✅ 强大 |
| 句柄查看 | ❌ | ✅ 完整 |
| 内存分析 | 基础 | 详细(工作集、私有字节、堆、虚拟内存) |
| 插件系统 | ❌ | ✅ 丰富 |
| 更新频率 | 随系统更新 | ✅ 活跃维护(15,790+ commits) |
| 高 DPI 支持 | ✅ | ✅ |
| 命令行版本 | ❌ | ✅(phcli) |
九、典型应用场景
9.1 系统管理员
场景:公司电脑运行缓慢
↓
使用 System Informer:
1. 查看 CPU/内存/I/O 图表,定位资源消耗大户
2. 查看进程列表,按 CPU 使用率排序
3. 发现某个进程异常(如 malware.exe)
4. 查看该进程的网络连接,发现可疑外连
5. 强制结束进程,删除文件
6. 检查服务列表,移除恶意服务
9.2 软件开发者
场景:调试程序内存泄漏
↓
使用 System Informer:
1. 找到自己的进程
2. 打开进程属性 → 内存标签页
3. 查看内存区域分配
4. 查看堆信息
5. 创建内存转储文件(.dmp)
6. 使用 Visual Studio 或 WinDbg 分析转储
9.3 恶意软件分析
场景:分析可疑程序
↓
使用 System Informer:
1. 启动可疑程序
2. 监控其文件操作(句柄标签页)
3. 监控网络连接(网络标签页)
4. 查看其加载的模块(模块标签页)
5. 检查数字签名(属性 → 数字签名)
6. 使用 .NET Tools 插件分析 .NET 程序
十、总结与展望
10.1 项目优势
| 优势 | 说明 |
|---|---|
| ✅ 功能强大 | 超越任务管理器的所有功能 |
| ✅ 开源免费 | MIT 许可证,完全免费 |
| ✅ 活跃维护 | 15,790+ 次提交,持续更新 |
| ✅ 社区支持 | 14.5k+ Stars,1.7k+ Forks |
| ✅ 插件丰富 | 可扩展性强 |
| ✅ 便携运行 | 免安装,支持 U 盘 |
| ✅ 深度监控 | 内核模式支持,信息极详 |
10.2 未来展望
| 方向 | 说明 |
|---|---|
| ARM64 支持 | 随着 Windows on ARM 的普及,可能需要 ARM64 构建 |
| WSL 监控 | 监控 WSL 子系统内的进程 |
| 容器监控 | 支持 Docker/容器进程查看 |
| 更多插件 | 社区贡献更多功能插件 |
十一、参考资料
- 官网 :systeminformer.com
- GitHub :winsiderss/systeminformer
- 下载 :systeminformer.com/downloads
- Discord 社区 :discord.gg/k2MQd2DzC2
- Twitter/X :@systeminformer
本文首发于 CSDN,转载需注明出处。