news 2026/10/13 14:30:45

为什么抛弃PowerShell重写?流氓软件克星v2从脚本到C WinForms单文件架构的完整历程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么抛弃PowerShell重写?流氓软件克星v2从脚本到C WinForms单文件架构的完整历程

【免费下载链接】RogueCleaner

流氓软件克星:扫描和清理 Windows 流氓右键菜单、自启动、计划任务、服务、浏览器插件和文件关联残留

项目地址:https://gitcode.com/gh_mirrors/ro/RogueCleaner
点击查看免费下载

流氓软件克星(RogueCleaner)v2 是一款用 C# WinForms 重写的 Windows 单文件清理工具,专门扫描和清理流氓右键菜单、开机自启动、计划任务、后台服务、浏览器插件和文件关联残留。这篇文章完整复盘了它从 PowerShell 脚本版走到 C# 单文件架构的原因、设计决策与验证方式,帮你看懂这次「从脚本到 C# WinForms 单文件」重写的来龙去脉。

🚪 先回答标题:为什么 PowerShell 版本撑不下去了

流氓软件克星 v1(v1.0.0-preview)发布时是一个「过渡架构」:GUI exe +RogueCleaner.ps1脚本 +rules规则目录,靠外部 PowerShell 脚本跑扫描和清理逻辑。

它能用,但缺点也很实在,最终正是这几个问题逼出了重写:

痛点具体表现
发布包脏用户要下 exe、.ps1、rules一堆文件,还常被 WinRAR SFX 自解压外壳「藏」着,缺文件、解压错目录就崩
杀软误报难解释运行一个 exe 却往外释放 PowerShell 脚本,安全软件天然警惕,作者也说不清「为什么」
高 DPI 卡顿200% 缩放下界面重排卡,表格滚动掉帧
扫描慢单线程串行跑各类注册表/服务/任务枚举
误操作不可逆删错了没有恢复入口,用户只能手动回滚注册表
更新麻烦没有版本检查,升级要手动下载整套文件

一句话:v1 是「能跑就行」的脚本工具,v2 要做一个可恢复、可审查、可自动更新的单文件产品。这不是「换个语言」,而是产品形态的整体升级。

🧩 v2 单文件架构的核心决策

v2 最核心的决定只有一句话:运行时只保留一个 exe,其余全部内嵌或删除。

1. 砍掉所有运行时 sidecar 文件

v1 依赖这些外部文件,v2 全部移除:

  • ❌RogueCleaner.ps1(运行时脚本引擎)
  • ❌rules\*.json(规则目录)
  • ❌ WinRAR SFX 自解压外壳
  • ❌ base64 内嵌脚本

规则数据改为 C# 源码中的普通结构化数据,开源可审查。这样「发布物」就只剩一个文件:

流氓软件克星.exe

2. 运行目录约定:exe 放哪,数据就建在哪

程序不会把自己搬家。你放桌面,它就在桌面同目录建一个数据目录:

流氓软件克星数据\ ├── reports # 扫描/清理/复扫报告 ├── backups # 清理前备份 ├── logs # 错误日志 ├── updates # 更新检查状态 ├── quarantine # 被移动隔离的文件 ├── state # 更新检查等运行状态 └── feedback # 脱敏识别反馈

这个设计直接回应了 v1「目录散落、缺文件就崩」的抱怨——单文件 + 单一数据目录,用户一眼能看全。

3. 编译方式:用 Windows 自带的 .NET Framework 编译器

v2 保留C# WinForms + .NET Framework 4.x(兼容性覆盖 Win7 SP1 / Win10 / Win11)。构建脚本 Build-Exe.ps1 调用系统自带的csc.exe把 src/v2/ 下所有.cs编译成单 exe:

powershell -NoProfile -ExecutionPolicy Bypass -File .\Build-Exe.ps1

输出就是根目录的流氓软件克星.exe,发布目录 dist\流氓软件克星 里也只有一个 exe。程序入口和版本信息定义在 RogueCleanerV2.cs 的AppMeta里。

🧵 多线程扫描引擎:从串行脚本到并行 C#

v1 的 PowerShell 是串行跑的;v2 把扫描拆成 10 类扫描器,用Parallel.Invoke并行执行,并发数取min(4, CPU 核心数)。扫描入口在 ScannerEngine.ScanAll:

  • 右键菜单(传统shell/shellex/ Win11 注册项)
  • 「此电脑」/资源管理器导航栏入口
  • 开机启动注册表(Run、RunOnce)
  • 启动文件夹
  • Windows 后台服务
  • 计划任务
  • 浏览器插件(Chrome/Edge 扩展策略、Native Messaging Host、Firefox)
  • 文件关联(图片/视频/压缩包/Office 的打开方式残留)
  • 隐藏卸载入口
  • 正在运行的弹窗/守护进程

每个扫描器内部再按注册表 root 分片并行,但限制并发避免卡系统。UI 侧用「先显示进度、分批追加结果、固定行高、关闭自动换行重算」的策略,专治高 DPI 下的表格卡顿——这正是 v1 最被吐槽的点之一。

所有扫描结果统一成一个Finding对象(见 Finding),字段包括Risk、Vendor、UserVisibleName、UserImpact、TechnicalLocation、Evidence等。UI 只显示人话(「在哪里冒出来」「用户会看到什么」「工具会怎么处理」),技术路径和证据放到悬停详情里——v2.0.3 专门为此把Safe360Ext、Q360AMPPL这类技术名换成了普通用户能看懂的描述。

🛡️ 备份 → 清理 → 复核 → 复扫:防止误操作的完整闭环

这是 v2 相对 v1 最「值钱」的升级:清理前备份,清理后复核并复扫。流程固定为 7 步:

  1. 用户勾选项目
  2. 二次确认(显示高风险数量和需要管理员权限的数量)
  3. 为每一项写备份
  4. 执行清理动作
  5. 逐项复核目标是否真的消失/禁用
  6. 自动复扫
  7. UI 显示成功、失败、跳过、残留

清理失败绝不显示为完成——权限不足、软件自保护、目标被立即重建、路径已变化,失败项会保留在复扫列表并显示具体原因。

恢复中心:误删可回滚

每次清理生成一个备份批次,存在流氓软件克星数据\backups\。主界面点「恢复中心」可以按批次回滚注册表、被移动文件、服务启动状态和计划任务状态。

  • 支持整批恢复 / 单项恢复
  • 注册表恢复带 32/64 位视图(/reg:32或/reg:64)
  • 只有全部恢复成功才删除批次记录;任意一项失败就保留并显示原因
  • 文件恢复时若原位置已有同名文件,不覆盖、不删备份,避免误伤用户文档

配套原则:不常驻后台、不加壳、不混淆、不静默更新、不绕过软件自保护、不改写UserChoice、不默认卸载主程序、不删除用户文档。

🔄 版本更新与杀软误报处理

v2.0.6 起,更新走「软件内弹窗确认下载 → 自动替换 exe → 自动重启」的闭环,不再跳 GitHub 页面让用户手动下。检查逻辑按天缓存到流氓软件克星数据\state,绝不静默更新——只有用户点确认才下载 Release 里的直出 exe 并替换。

关于杀软误报:这个工具会读取/备份/删除注册表、禁用服务和计划任务,天然容易被启发式规则归为「系统工具类风险」。项目的应对策略是用透明度换信任——源码、构建方式、规则全部公开可审查;发布包只含 exe 和 SHA256 校验值;正式版还会移除验收测试器特征,进一步缩小误报面。详见 release/火绒误报回复.md 和 release/Win10Win11报错回复.md。

🧪 如何构建与验证单文件 EXE

想自己编译或审查源码,克隆仓库后一条命令构建:

git clone https://gitcode.com/gh_mirrors/ro/RogueCleaner cd RogueCleaner powershell -NoProfile -ExecutionPolicy Bypass -File .\Build-Exe.ps1

v2 还内置了几个「烟测」参数,不弹 GUI、不清理,专供开发自检:

参数作用
--scan-smoke只扫描并写报告,验证扫描链路
--identity-smoke验证厂商身份识别不误报(Corel GUID 含2345、系统 MSI 宿主等负向用例)
--feedback-smoke验证反馈脱敏不泄露用户名/SID/邮箱等
--ui-smoke检查按钮可见性、详情面板、截图写入 reports

发布前的完整验收会用Build-Exe.ps1 -ValidationBuild单独编译验证版,跑 10 个模拟工件(右键、开机启动、浏览器宿主、打开方式、计划任务、服务等),标准是RunnableCases=10, Passed=10, Failed=0(见 docs/validation/2026-07-20-v2-acceptance.md)。正式发布版不含验收器,只为缩小误报面。

📦 从 v1 到 v2.0.6 的版本演进

完整变更记录见 release/1.0到2.0.6更新说明_52pojie.md,关键节点:

  • v2.0.1:确立「不能静默卸载就弹原厂卸载器」的边界;修复同一注册表键下多个启动项备份互相覆盖
  • v2.0.2:修表格 tooltip 横向无限延伸、风险列颜色、EXE 发布包只含 exe
  • v2.0.3:把技术名换成「人话」,收紧 WPS/bili/ASUS 等宽泛关键词,降低误报
  • v2.0.4:恢复中心重做为青绿色主题,不再是默认灰白 WinForms
  • v2.0.5:恢复中心「真的恢复」——逐项执行并逐项复核,支持 32/64 位注册表视图
  • v2.0.6:软件内自动下载更新 + 恢复中心兼容旧版本备份记录

注意:从 v2.0.5 升到 v2.0.6 这一次仍可能需手动下载一次,因为 v2.0.5 自身还是旧更新逻辑;装上 v2.0.6 后,后续版本就走软件内自动下载重启了。

✨ 总结:这次重写到底解决了什么

流氓软件克星 v2 从 PowerShell 脚本到 C# WinForms 单文件,不是「换个语言」,而是把「能跑就行」的脚本工具,升级成一个可恢复、可审查、可自动更新的单文件产品:

  • 单文件:告别.ps1/rules/ SFX 外壳,用户只下一个 exe
  • 多线程:10 类扫描器并行,告别串行慢扫描和高 DPI 卡顿
  • 可恢复:备份→清理→复核→复扫,恢复中心按批次回滚
  • 可审查:源码、构建脚本、规则全公开,SHA256 校验,正式版缩小误报面
  • 可更新:软件内弹窗确认下载、自动替换重启,绝不静默

核心原则始终如一:先备份、再清理、再复扫;宁可少删,也不替用户乱删。

想深入看架构,可以读 docs/superpowers/specs/2026-07-20-v2-single-file-design.md(v2 单文件设计)和 docs/superpowers/specs/2026-08-04-vendor-identity-false-positive-design.md(厂商识别误报治理)。源码主文件在 src/v2/RogueCleanerV2.cs,主题定义在 src/v2/UiTheme.cs。

【免费下载链接】RogueCleaner

流氓软件克星:扫描和清理 Windows 流氓右键菜单、自启动、计划任务、服务、浏览器插件和文件关联残留

项目地址:https://gitcode.com/gh_mirrors/ro/RogueCleaner
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 14:29:47

工商业储能系统投资回报分析与成本收益模型

1. 工商储项目投资回报分析框架工商储(工商业储能系统)作为分布式能源的重要组成部分,其投资回报测算需要建立完整的分析模型。我们通常从三个维度构建评估体系:财务模型、技术参数和运营策略。以1MWh集装箱式储能系统为例&#x…

作者头像 李华
网站建设 2026/10/13 14:29:30

Java接口与抽象类怎么选?从语法区别到实战设计原则一次讲透

1. 面试题背后的真实考点 如果你正打算跳槽,或者刚面完几家公司,大概率遇到过这个问题。Java 中接口和抽象类的区别是什么?怎么选择? 很多人的第一反应是:接口用 implements,抽象类用 extends;…

作者头像 李华
网站建设 2026/10/13 14:27:22

Agent技能系统设计实战:从工具定义到稳定调用的完整方案

Agent 项目总在"就差最后一步"时崩掉?如果你带过稍微复杂一点的 Agent 项目,大概率见过这样的现场:模型已经正确理解用户意图,也知道该调用哪个工具,结果因为工具描述写得含糊、参数传错、超时没人管&#x…

作者头像 李华
网站建设 2026/10/13 14:25:41

C程序员必修课:用gdb精准定位段错误与内存问题

1. 为什么今天还得死磕gdb——一个C程序员绕不开的“手术刀”你写完一段C代码,编译通过,运行起来却直接段错误,或者输出结果和预期差了一大截;你加了printf调试,结果一加就正常,一删又出错,典型…

作者头像 李华
网站建设 2026/10/13 14:24:20

Python CT切片三维重建:从DICOM到可旋转模型

简介:这份资源面向医学图像处理初学者与Python开发者,聚焦CT切片图像的二维序列到三维模型的重建实践,帮助读者理解体渲染、表面重建与最大密度投影等核心方法的实现思路。压缩包共2个文件,包含1个py脚本与1个txt说明文档&#xf…

作者头像 李华
网站建设 2026/10/13 14:20:44

Spring Boot + DbUnit 数据库隔离测试实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华