电脑守护者 · 安全体检与系统优化
一条流水线:先诊断、再处置、后复检、可回滚。纯本地运行,不联网、不上传任何数据。
为什么不是普通提示词技能
普通技能让模型现场敲命令,结论靠猜。本技能有真实引擎:
| 能力 | 做法 | 普通技能的差距 |
|---|---|---|
| PE 静态分析 | 解析 DOS/NT 头、节区熵、Overlay、加壳节区名、可疑 API 引用 | 只能看文件路径猜 |
| 签名校验 | WinVerifyTrust 内嵌签名 + 目录签名回退(CryptCATAdmin*) |
漏掉一半系统文件,把 notepad.exe 判成无签名 |
| 持久化审计 | 16 类位置全量枚举,含 IFEO / AppInit / COM 劫持 / LSA 通知包 / 打印监视器 / NetSh 助手 / 右键菜单扩展 / shell 动词 / 发送到 / .exe 关联 | 通常只看 3 处 Run 键 |
| 进程伪装 | 系统进程名 vs 实际路径比对、父进程链异常 | 无 |
| 基线差分 | 全量对象快照 + first_seen 时间戳 |
只能回答"现在有没有",回答不了"什么时候有的" |
| 采集信心 | 逐采集器登记成功/失败,折成 1–10 分并列出扣分原因 | 静默跳过失败项,还报满分 |
| 评分 | 按规则加权扣分,每条扣分可追溯到具体证据 | 常常是模型随手给个分 |
双击就能用(普通用户走这条路)
技能目录下有两个入口,双击任意一个就行,不需要打开命令行:
| 文件 | 说明 |
|---|---|
start.pyw |
首选。Windows 把 .pyw 关联到无窗口解释器,双击不弹黑框 |
start.vbs |
备用。.pyw 关联到旧版 Python 时用它,脚本会自己挑最新的 Python |
双击后:起一个只监听 127.0.0.1 的小服务 → 自动打开默认浏览器 → 界面上就是那四个大按钮。
首屏直接显示上次体检评分、C 盘可用空间、能清多少;点按钮才动,清理前必须再点一次确认。
关掉页面后 30 分钟无操作自动退出,不留后台进程;重复双击不会多开,会把已经开着的那个页面重新调出来。
启动失败会弹系统对话框说明原因(不会静默消失)。
安全约定:只 bind 回环地址;每次启动生成一次性 token,所有接口都要带 X-PCG-Token,
跨站请求带不上自定义头,因此挡住网页 CSRF;open 动作只允许打开 reports 目录里的文件。
命令行等价物:
& $PY -X utf8 "$SK\run.py" gui # 打开界面(自己拉浏览器)
& $PY -X utf8 "$SK\start.pyw" --no-open # 只起服务,自己贴地址
入口:任何输入都先反问
不管收到什么,第一件事都是问,不是做。 空消息、一个空格、一个标点、一个"额"、一段乱码,
全部走同一个入口:
& $PY -X utf8 "$SK\run.py" ask "<用户原话>"
输出的是一张四选项卡片:
你想让我做哪件事?回个数字就行
1 清理 C 盘空间 缓存、旧安装包、更新残留 · 先列清单,删了能还原
2 查有没有被植入木马、后门 开机自启 16 处、可疑进程、外联端口 · 出证据,不做查杀
3 电脑卡顿、开机变慢 内存、启动项、后台进程、磁盘空间 · 给具体原因和排序
4 其他问题 蓝屏、没声音、断网、弹窗广告、打印机 · 我再细问
0 取消,什么都不动
| 用户回 | 系统做什么 |
|---|---|
1 |
只读清点,出「能清什么、能腾多少」,不动文件 |
2 |
全量体检,出评分 + 人话结论 + 报告文件名 |
3 |
按卡顿方向定向诊断,给最可能原因和验证方法 |
4 |
二级菜单:蓝屏 / 没声音 / 断网 / 弹窗 / 打印机 / 直接描述(回 1–6) |
确认 |
清 A 级缓存(搬进隔离区,可还原) |
全清 |
连回收站、旧安装包一起清 |
0 或「取消」 |
结束,一个字都不改 |
输入已经说得很明确时(比如「清C盘」),菜单照样出现,但会把对应项高亮,并补一句
「看样子你想做第 1 件,回 1 或 y 就开始」——不用重打一遍。
听不懂时:第一次请用户回数字;连续两次听不懂就不再问,改列可直接复制的命令清单。
这是为了不反复骚扰,也是 interact.UNKNOWN_LIMIT 存在的原因。
用户永远看不到代码
ask 入口的所有输出都经过 voice.py,屏幕上只有三种东西:
- 一句状态:
系统运行中… 正在查看开机自启、进程和网络连接,大约 2 秒 - 一段人话结论:评分、几件事、每件事的后果
- 下一步:能腾多少、回哪个数字
以下内容永远不会出现在屏幕上,只进 HTML 报告:命令行与参数、日志、异常堆栈、耗时秒数、
信心值、扣分构成、inode、批次号、规则 id、字段名。
技术要求与高级用法走 scan / triage / clean 这些原生命令,ask 是给普通用户的那一层。
用法
$PY="C:\Users\Administrator\.workbuddy\binaries\python\versions\3.13.12\python.exe"
$SK="$env:USERPROFILE\.workbuddy\skills\pc-guardian"
& $PY -X utf8 "$SK\run.py" ask # 反问菜单(默认入口)
& $PY -X utf8 "$SK\run.py" ask " " # 一个空格也照样反问
& $PY -X utf8 "$SK\run.py" ask "清C盘" # 识别后高亮第 1 项
& $PY -X utf8 "$SK\run.py" ask 2 # 直接选第 2 项
& $PY -X utf8 "$SK\run.py" scan # 快速体检(引擎 <1s)
& $PY -X utf8 "$SK\run.py" scan --deep # 深度(加 WMI 订阅 + 全量签名)
& $PY -X utf8 "$SK\run.py" scan --html D:\r.html
& $PY -X utf8 "$SK\run.py" triage 卡顿 # 症状定向诊断
& $PY -X utf8 "$SK\run.py" triage 蓝屏 没声音 # 可多症状
& $PY -X utf8 "$SK\run.py" clean --level B # 只看方案,不动任何文件
& $PY -X utf8 "$SK\run.py" clean --level A --yes # 执行:搬入隔离区(可回滚)
& $PY -X utf8 "$SK\run.py" clean --batches # 看隔离批次
& $PY -X utf8 "$SK\run.py" clean --verify <批次> # 同范围复扫,核对残留
& $PY -X utf8 "$SK\run.py" clean --restore <批次># 回滚
& $PY -X utf8 "$SK\run.py" clean --purge <批次> # 永久删除(不可回滚,需用户明确授权)
& $PY -X utf8 "$SK\run.py" baseline --show # 看基线
& $PY -X utf8 "$SK\run.py" report # 用上次结果重出报告
五阶段清理模型
inventory 只读枚举,统计去重后体积(不动文件)
↓
preview 列出逐项清单、风险级别、预计可回收,等确认
↓
apply 逐项移入隔离区 %LOCALAPPDATA%\pcguardian\quarantine\<批次>\
同卷 rename(瞬间完成),跨卷才复制;每项写进 manifest.json
↓
verify 用同一规则、同一范围复扫,残留必须留在报告里
↓
restore 按清单搬回原位;原位置已有同名项则不覆盖,报冲突
purge 永久删除整个批次(唯一不可逆动作,必须显式给批次号)
"清理/优化/一键处理"都不等于授权。 定时任务与无人值守调用默认只允许 inventory 和 preview。
症状路由表(triage)
| 现象 | 主要检查项 |
|---|---|
| 卡顿 / 变慢 | 内存压力、TOP 进程、磁盘剩余、后台进程数、启动项数量 |
| 开机慢 | 自启程序数、自启服务数、计划任务数、磁盘剩余 |
| C 盘满 | 清理方案 TOP8(已去重)、是否需迁出大文件 |
| 弹窗 / 广告 | 持久化项命中、右键接管数、可写目录未签名常驻进程 |
| 断网 / 打不开网页 | 系统代理是否被篡改、DNS 配置、外联与监听规模 |
| 没声音 | Audiosrv / AudioEndpointBuilder 实际状态 |
| 蓝屏 / 死机 | Minidump 数量与最近时间、磁盘告急、sfc/DISM 建议 |
| 打印机 | Spooler 状态、队列清理步骤 |
| 怀疑中毒 | 体检高危项汇总、杀软是否在运行 |
每条输出「最可能原因 + 证据 + 建议动作 + 怎么验证」,不只给结论。
风险分级(处置时的硬规则)
| 级别 | 定义 | 处理方式 | 示例 |
|---|---|---|---|
| A 安全 | 缓存/临时文件,删了会重建 | 可直接执行 | 浏览器缓存、Temp、缩略图、npm/pip/conda 缓存、Electron 更新残留、投递优化 |
| B 中等 | 删错会丢数据但可再生成 | 说明后执行 | 回收站、旧安装包、系统更新缓存、预读文件、微信图片缓存 |
| C 敏感 | 涉及系统内核/电源/组件 | 必须逐项征询 | 休眠文件、WinSxS 精简、Windows.old、自启动项调整 |
反模式清单(引擎层面明确不做)
| 反模式 | 为什么禁止 |
|---|---|
按扩展名全盘递归删 *.log / *.tmp |
会命中程序运行必需的文件,且无法解释删了什么 |
直接删 $Recycle.Bin 内容 |
绕过系统接口,可能损坏回收站元数据;应用 SHEmptyRecycleBin |
用 shutil.rmtree(ignore_errors=True) 一把梭 |
静默失败却报成功——必须逐文件删并复核 |
| 只凭路径子串判定恶意 | 至少两个独立信号(签名、路径所有权、白名单、命令行特征) |
| 目标路径解析不出来就判"残留" | 解析不出只能是 unknown,不能等同于"文件缺失" |
| 有进程证据但没有持久化项就强杀 | 守护进程会重启,且可能误杀用户正在用的主程序 |
| 按厂商名批量删 / 因为共用厂商就升级为卸载整个软件 | 动作不得升级:删一个启动项就只删那一个 |
| 跟随 junction / symlink 递归 | 会顺着 Application Data 之类的链接删到别处 |
| 把"表观大小"当"可回收空间" | 硬链接/reflink/稀疏文件共享磁盘块,必须按 (dev, ino) 去重 |
输出
- 控制台:评分、采集信心值、按严重度排序的发现项(含证据与处理建议)、扣分构成、可回收空间、基线变化、报告路径
- HTML:评分环、体检摘要、风险发现(含"为什么危险/怎么处理")、基线对比、清理方案、采集覆盖与信心值、端口与外联、持久化覆盖、进程概览
- JSON:
%LOCALAPPDATA%\pcguardian\last_scan.json - 基线:
%LOCALAPPDATA%\pcguardian\baseline.json - 隔离区:
%LOCALAPPDATA%\pcguardian\quarantine\<批次>\manifest.json - 签名缓存:
%LOCALAPPDATA%\pcguardian\sigcache.json(带版本号,逻辑变更自动作废)
性能预算
| 项目 | 实测(i5-4590 / 16G) |
|---|---|
| 引擎快速扫描 | 0.5–0.9 秒 |
| 引擎深度扫描 | 4–5 秒(CIM 订阅查询占大头) |
| 进程枚举 | 约 240 进程 / 35ms(Toolhelp 快照,非 WMI) |
| 网络表 | 约 130 连接 / 2ms(GetExtendedTcpTable) |
| 签名校验 | 预热后约 0ms(磁盘缓存) |
> 整体命令行耗时约 2 秒,其中 1 秒是 Python 解释器启动(被本机杀软扫描导致),不是引擎开销。
规则与白名单
rules/security.json— 覆盖扣分权重与严重度,改配置不用改代码rules/whitelist.json—trusted_names/trusted_paths,用于压制误报
误报治理原则:签过名的文件一律放行;用户可写目录里签过名的第三方应用(夸克、豆包、腾讯系、JetBrains 等)不计风险;COM 残留(目标文件已不存在)跳过;SendTo 里的 .lnk/.url 与系统内置壳扩展(.ZFSendToTarget/.DeskLink/.MAPIMail/.mydocs)不算异常,只报可执行文件。
已知边界(不做的事)
| 商业 EDR 能力 | 为什么不做 |
|---|---|
| 内核驱动实时拦截 | 需常驻驱动 + 微软签名,会拖慢老机器 |
| 云查杀库 | 违背"不联网"原则 |
| 沙箱动态行为分析 | 需虚拟化,i5-4590 跑不动 |
定位是离线取证型:不拦截,但能查清"有没有、从哪来、何时来、干什么"。
不能替代 Defender 离线扫描或专业杀毒软件全盘查杀。
踩坑经验
- ctypes 不声明
restype会截断 64 位句柄:OpenSCManagerW/OpenServiceW默认按int返回,导致所有服务查询统一返回absent。必须显式restype = c_void_p—— 这类"静默错数据"比报错更难发现,也是加采集信心值的原因 schtasks.exe在部分环境被安全策略拦截,改用直接解析C:\Windows\System32\Tasks\**的 XML,更快且不受限sc.exe/Get-CimInstance -Namespace root/subscription(约 3 秒)在受限环境可能被拦或过慢,后者只在--deep启用- 大部分系统文件只有目录签名,只做
WTD_CHOICE_FILE会把 notepad.exe、spoolsv.exe 全判成无签名,必须回退到CryptCATAdmin* Get-MpComputerStatus在装了第三方杀软时返回空,改读Security Center\Provider\Av注册表shutil.rmtree(ignore_errors=True)会静默失败:本机安全策略曾拦截大目录递归删除,代码却报"已释放 175MB"。改为逐文件删除 + 删除后复核存在性- 一次性
Get-ChildItem | Remove-Item清理会大量静默失败,须逐项 try/catch 二次清理 - 进程名白名单容易误伤(恶意程序可命名为 google.exe),必须叠加"签名有效"或"位于 Program Files"才放行
- WER 目录(
ReportQueue/ReportArchive/Temp)不能整体搬走,只能清内容,否则 WER 服务报错 Checkpoint-Computer有 24 小时频率限制(注册表SystemRestorePointCreationFrequency),不改这个值时脚本会"静默跳过却返回成功"- 系统还原点会实打实占系统盘:本机 100GB 的 C 盘曾被还原点吃掉 7.98GB(上限 10GB)。清缓存前先看
vssadmin list shadowstorage
免责
本技能为参考性评估工具,不构成安全承诺。发现高危项时请配合专业杀毒软件复检,重要数据先行备份。