把本地大模型接进 Windows 内核,我做了个进程威胁分析系统

刚入行不久,踩了不少坑,但这个方向我觉得值得聊聊。


某天在看 EDR 相关资料的时候,我突然想到一个问题:

传统的主机入侵防御系统(HIPS)靠规则引擎拦截进程——但规则是死的,攻击是活的。如果让大模型来"读懂"进程行为,会怎样?

这个想法听起来有点离谱,因为内核操作和 LLM 推理是两个几乎不可能在延迟上兼容的东西。但我还是做了,花了些时间,做出来这个:

LLM HIPS —— 一个把本地大语言模型接入 Windows 内核拦截链路的进程威胁分析系统。

GitHub 地址:https://github.com/blackstreetlight/LLMHips


为什么使用本地大模型

在真正的主机安全场景下,本地大模型具有会话不泄露的重要属性,会话都存在个人电脑上,既可以让模型越用越懂你(或者你的主机),也避免了一些重要的信息泄露。如果会这方面的技术,还可以针对自己的情况对模型进行微调。

但是,本地大模型的使用也带来了一些不便:算力不支持、少规模的参数权重导致模型的效果不尽人意、难兼顾准确率和流畅度的平衡.....

尽管如此,我还是打算尝试一下,之后也会接入当下各个主流大模型的 API,对比两者在实际应用场景下的表现优劣。不过在我看来,当下基于规则的主机防御存在一定的滞后性,而大模型这种具备 “意图理解” 的优势很好的弥补了这方面的不足。(毕竟谁不喜欢免费雇佣一个可以实时关注自己电脑安全的工作者呢~🐎🐎)


先看看它长什么样

添加图片注释,不超过 140 字(可选)

系统总览仪表盘——左侧是风险分布饼图和高风险进程 Top 5,右侧是实时事件流,会持续滚动

打开控制台,可以实时看到系统上所有进程的创建事件,每一条都有风险等级(高/中/低)、触发的规则、签名状态、父进程信息。高风险进程会被标红并直接内核阻断。

添加图片注释,不超过 140 字(可选)

进程监控列表——每一行都是一个进程事件,可以看到完整路径、命令行、风险判定原因

添加图片注释,不超过 140 字(可选)

实时进程树——这是我最喜欢的一个功能,父子进程关系用 DAG 图展示,高风险节点红色高亮,进程退出后节点变暗但不消失

添加图片注释,不超过 140 字(可选)

内核阻断历史——每一条被 ZwTerminateProcess 阻断的进程都有完整记录,包括阻断时长、规则触发原因、是否有签名


它是怎么工作的

整个系统分四层:



Windows 内核(Ring 0) └── ZDriverHips.sys ← 拦截进程创建,规则引擎同步判决 ↓ IOCTL C# 桥接服务(Ring 3) └── SecurityBridge ← 补充签名验证,重新评分,推送事件 ↓ WebSocket React 控制台 └── 可视化 + LLM 查询界面 ↓ HTTP Qwen2.5-7B(本地 vllm) └── 对进程事件做自然语言分析

内核层做拦截决策,LLM 做分析解释,两件事完全解耦。

这是这个设计最关键的一个约束:内核回调函数必须在微秒级内返回,不可能等 LLM 推理。所以 LLM 永远在执行路径之外——它收到的是已经被放行或阻断的事件,负责给分析人员一个人话能看懂的解释。


做的过程里有几个坑印象比较深

第一个坑:内核的开发和接口的设定要严谨

内核驱动用 C 写,用户态桥接层用 C#。两边通过 IOCTL 传递一个固定格式的事件结构体。C# 这边用 [StructLayout(LayoutKind.Sequential)] 来声明,要求和内核的 DRIVER_EVENT_BUFFER 逐字节对齐。

开发过程中,我在结构体首位加了一个 uint EventType 字段(4 个字节),但忘了同步重新编译驱动。结果进程名字段从缓冲区偏移了 2 个 Unicode 字符开始读——日志里出现了一堆乱码进程名。

数据读回来没有报错,只是值是错的。这种静默错误比崩溃还难排查。

第二个坑:签名验证必须在两层分别做。

WinVerifyTrust(Windows 标准的 Authenticode 签名验证 API)是用户态 API,内核驱动没法调用。所以驱动对每个进程都只能上报"签名状态未知"。

这就导致一条很重要的规则——"未签名程序从 %APPDATA% 启动 → 高风险"——在内核层根本没法触发,是死代码。

解决方式是在 C# 桥接层收到事件后,用 P/Invoke 再调一次 WinVerifyTrust,拿到真实签名结果之后重新评分。这套两段式验证才让这条规则真正活了。

第三个坑:实时进程树怎么画。

进程树的数据不是"快照",是一条一条事件流进来的。每个进程创建事件携带父进程 PID,但父进程不一定已经在树里了(监控是中途开始的)。进程退出事件要让节点变暗,但不能删掉。PID 还会被复用。

最后用 React Flow + Dagre 做了一个增量构建的 DAG,每次新事件进来只更新变化的节点,退出事件只改节点样式不删除。效果还不错,但高频事件流下 Dagre 重新布局的性能还是个问题,后面需要做增量布局。


我想直接说它现在做得不够好的地方

我觉得这种话该说清楚,免得给人错误预期。

最重要的一条:LLM 目前没有在真正"研判",它只是在转述。

它收到的信息是:进程名、路径、命令行、风险等级、父进程、签名状态。它生成的内容,大部分时候就是把这些信息用自然语言重新组织了一遍。

风险等级是规则引擎在 LLM 被调用之前就定好的。模型没有外部威胁情报,没有历史事件记忆,不能建立行为基线。

把 LLM 摘掉,拦截结果不会变。这是 v1.0 最诚实的局限。

其他的不足:

  • 内核目前只监控进程创建,无文件攻击、DLL 注入、注册表持久化完全看不到

  • 每条事件孤立评估,不能识别多步骤的慢攻击

  • WebSocket 推送没有鉴权,局域网内都能接收到事件流

这些都是接下来要做的事情,我把它们放进了 v1.1 的 Roadmap。


接下来要做什么(v1.1 计划)

特性

想法

RAG 威胁知识库

把 CVE、MITRE ATT&CK、沙箱报告向量化,让 LLM 查询后再生成分析,减少空洞的转述

领域微调

在恶意软件样本数据集上微调,让模型对 LOLBin 攻击有真实感知

Agent 架构

让 LLM 能主动查询上下文(VirusTotal、父进程链、网络连接)再给出判断

内核检测面扩展

注册表监控、网络连接监控、文件写入监控

多模型支持

Claude / Gemini / ChatGPT / DeepSeek 可切换接入


如果你也对这个方向感兴趣

项目用 MIT 协议开源,代码都在:

👉 https://github.com/blackstreetlight/LLMHips

有一个 Mock 驱动模式——appsettings.json 里打开 UseMockDriver: true,不需要任何 Windows 内核环境或 GPU,在 macOS / Linux 上就能跑完整的前端 + 桥接,方便感兴趣的人先把整个链路摸一遍。

我是刚入行不久的新人,很多地方肯定做得很粗糙。 如果你在内核安全、EDR、LLM Agent 方向有经验,很欢迎开 Issue 或者评论区直接说——哪怕是"你这个地方想错了,因为……",对我来说都比点赞更有价值。

有问题也欢迎直接问。


如果觉得这个方向有意思,点个赞或者转发给可能感兴趣的人,会有很大帮助,谢谢。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐