如何找到SystemInformer的DLL注入入口:一份源码功能定位指南
【免费下载链接】systeminformerA free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars & Solutions, Inc. @ https://windows-internals.com项目地址: https://gitcode.com/GitHub_Trending/sy/systeminformer
在 SystemInformer 的源码中做 DLL 注入相关功能的源码定位时,最常被卡住的是:早期代码被注释、内核接口换了名字、插件目录里也找不到注入文件。本文带你按"界面入口→用户态接口→内核通信→驱动导出"的链路,用 20 分钟定位到内核模式下每一层的职责与文件路径,并给出误判排查清单。
你会得到什么:
- 一条可复现的定位链路:从 UI 操作一路追到
KSystemInformer/ksidll.def的驱动导出表 - 三层架构的职责拆解:谁负责界面、谁封装调用、谁执行内核操作
- 一份常见误判排查清单,避免把通信库、消息结构体当成注入本体的实现
一、为什么你找不到旧的注入入口
老版本 Process Hacker / SystemInformer 的部分功能直接用 Win32 API 在目标进程里开线程。这一痕迹现在只剩注释:SystemInformer/heapinfo.c约 1225 行处保留了一段被注释掉的CreateRemoteThread调用,它对应的是早期"在目标进程远程执行 ntdll 函数"的技术路线,如今仅作考古参考。
你找不到功能入口,通常是因为两件事同时发生了:其一,旧的远程线程逻辑被整体注释停用;其二,同类能力被搬进了内核模式组件。也就是说,当前版本的"入口"不再是一段可搜索的注入函数名,而是一条分层链路:
图中每个节点都对应一个真实文件:phlib/kph.c封装与内核的通信,kphlib/include/kphmsg.h定义消息结构,ksidll.def声明驱动对外导出的符号,SystemInformer/phsvc/目录下的svcmain.c负责服务与驱动的连接管理。
二、三层架构:谁负责、在哪里、为什么
第一层:界面与插件(做什么的壳)。主程序的进程树、右键菜单等交互集中在SystemInformer/mainwnd.c和proctree.c。需要说明一个边界:原文常说的plugins/ExtendedTools/inject.c在当前仓库中并不存在,以当前仓库实现为准,注入类操作并不以独立"注入器"文件形态出现,而是通过下面的通用内核接口组合实现。
第二层:用户态接口库(把复杂调用变简单)。phlib/kph.c是一组面向内核功能的门面函数,每个都只干一件事:
KphOpenProcess:以指定权限打开目标进程句柄KphReadVirtualMemory:读取目标进程虚拟内存KphOpenThreadProcess:定位进程内的线程KphOpenThread:打开线程对象
这层存在的意义是:上层代码不必关心 ALPC 端口、消息序列化、状态回读这些细节。
第三层:内核通信与驱动(真正执行的地方)。消息协议在kphlib/include/kphmsg.h(核心结构KPH_MESSAGE)和kphlib/kphmsg.c中定义,驱动侧的导出清单在KSystemInformer/ksidll.def中。这里有一个值得注意的事实:该导出表包含的是KsiInitialize、KsiQueueWorkItem、KsiInsertQueueApc一类符号,而不是某些资料里写的KsiLoadDriver、KsiSendMessage——核对导出表时应以仓库文件为准。
三、常见误判与排查清单
定位过程中,以下模块最容易被误认成"最终实现":
| 你看到的东西 | 容易的误判 | 实际职责 |
|---|---|---|
kphlib/kphmsg.c | 以为是注入算法所在 | 只是消息序列化与协议定义 |
phlib/kph.c | 以为是全部逻辑 | 它只是调用门面,执行方在内核 |
ksidll.def里的符号名 | 以为符号名=功能名 | 它只决定哪些函数对外可见 |
heapinfo.c的注释代码 | 以为功能还在用 | 该段已被停用,仅作历史参考 |
排查时的检查清单:
- 搜
Kph前缀函数名,确认用户态调用了哪些门面 - 打开
ksidll.def对照导出表,确认驱动实际暴露的能力 - 确认
SystemInformer/phsvc/服务是否在跑——没有服务连接,所有内核调用都不会到达驱动 - 涉及插件的行为,去对应插件的
main.c注册入口看它挂到了哪个菜单项
四、安全与合规边界
这套链路的能力(跨进程内存读写、远程线程执行)是把双刃剑,适合的使用场景是:系统维护时的受控操作、安全审计中对可疑进程的取证分析、内核模式编程的学习与架构研究。
需要明确的边界:本文只讨论"功能在哪里、如何分层",不提供针对受保护进程的绕过技巧,也不描述如何对抗安全软件的检测。在他人系统上使用任何跨进程写入能力前,请确认你拥有明确授权;这既是法律要求,也是这类工具的设计初衷——它是监控与调试工具,不是攻击工具。
相关文件与资源
- 用户态门面函数:phlib/kph.c,负责与内核通信的封装
- 消息协议结构:kphlib/include/kphmsg.h,定义
KPH_MESSAGE等核心结构 - 驱动导出表:KSystemInformer/ksidll.def,声明驱动对外符号
- 本地服务组件:SystemInformer/phsvc/,管理服务与驱动的连接
- 历史实现参考:SystemInformer/heapinfo.c,含已停用的旧远程线程代码
- 构建说明:README.md 与 HACKING.md,环境要求与编译步骤
- 内核模式公共配置:Common.Kernel.props,WDK 相关构建属性
下一步建议:从ksidll.def的导出表入手,逐个符号反查到KSystemInformer/中的实现文件,画一张"导出符号→驱动函数→处理程序"的映射图,你得到的就是当前版本最准确的能力清单(以当前仓库实现为准)。
【免费下载链接】systeminformerA free, powerful, multi-purpose tool that helps you monitor system resources, debug software and detect malware. Brought to you by Winsider Seminars & Solutions, Inc. @ https://windows-internals.com项目地址: https://gitcode.com/GitHub_Trending/sy/systeminformer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考