Skip to content

About

A foolproof graphical wrapper for Microsoft Activation Scripts with Office vNext license detection and verified offline fallback.

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

MAS 一键激活 · MAS OneClick

把 massgrave.dev 的 Microsoft Activation Scripts(MAS)从「打开 PowerShell → 粘贴命令 → 在文字菜单里选数字」变成双击一次、点一下按钮的图形界面。

不需要安装任何运行环境:宿主是 Windows 自带的 PowerShell 5.1 + System.Net.HttpListener,前端是纯静态 HTML/CSS/JS,无外部依赖、无 CDN、首次成功运行后支持缓存离线运行。

给电脑小白

下载最新版一键激活包(GitHub Release)

下载后先完整解压,再双击解压目录里的 Start.cmd 或 一键激活.cmd。不要直接在压缩包预览窗口里运行。详细步骤见包内的 使用说明.txt。

GitHub 在部分网络环境下可能下载较慢;下载失败时可打开所有 Release页面,或改用作者提供的国内网盘镜像。


怎么用

  1. 双击 一键激活.cmd
  2. UAC 弹窗点「是」(激活必须提权)
  3. 程序窗口自动打开 → 点 「开始一键激活」

就这三步。程序会自己判断该做什么,不需要你理解 HWID / Ohook / TSforge / KMS 的区别。

如果预检里出现 「Defender 可能拦截」,先点它右边的 「添加排除」 再执行——原因见下文。

关闭那个黑色命令行窗口即可退出程序。


它到底做了什么

一键激活.cmd                     提权 + 启动宿主
└─ app\server.ps1                本地 Web 宿主(127.0.0.1,随机空闲端口)
   ├─ 读取真实授权状态             WMI SoftwareLicensingProduct + Office C2R 注册表
   ├─ 推荐引擎                   自动决定要执行哪些开关
   ├─ app\web\*                  前端界面(极光玻璃风格)
   └─ app\worker.ps1             执行引擎
      ├─ 取 get.activated.win 当前锁定的 commit 与 SHA256
      ├─ 取脚本:本机已缓存该版本 → 直接用;否则从官方三镜像下载
      ├─ 校验 SHA256,不匹配就拒绝执行
      ├─ 三镜像全挂 → 回退到本机任何已验证过的副本(跑过一次后断网可用)
      └─ 无人值守执行 + 输出流式回传到界面

推荐引擎的判断规则

检测结果 选择的方案
Windows 未激活,且是 Win10/11 非 Server/LTSC /HWID(永久数字许可证)
Windows 未激活,但是 Win7/8.1 或 Server/LTSC /Z-WindowsESUOffice(TSforge)
Office 已安装但无产品密钥 /Ohook(永久、离线)
两者都需要 两个开关一次执行
两者都已授权 按钮置灰,显示「已全部激活」

它不会去动已经激活的项。 本机实测:Windows 11 家庭版已授权(RETAIL,密钥尾号 8HVX7),Office 2021 家庭和学生版也已授权,因此推荐结果是「已经全部激活,无需操作」,按钮置灰。

Office 检测为什么要查两个地方

这是踩过坑之后才写对的地方。Office 的授权存在两套互不相通的机制里:

机制 位置 谁用
SPP(旧) SoftwareLicensingProduct / ospp.vbs 批量授权、KMS
vNext(新) %ProgramData%\Microsoft\Office\Licenses\<版本>\<类型>\<id> 零售版 / OEM / 账号数字许可证 / Microsoft 365

现代 Office(2016 以后)不会把产品密钥写进 SPP。所以在一台完全正常的、用微软账号激活的机器上,ospp.vbs /dstatus 会报 No installed product keys detected,SoftwareLicensingProduct 里那 9 条记录也全是 ---UNLICENSED---(错误码 0xC004F014)——但那 9 条只是没人用的 SKU 槽位(Trial / Demo / Subscription / Grace 等),不代表未激活。

真正的许可证是 vNext 目录下的一枚签名令牌(UTF-16LE JSON,其中 License 字段是 base64 编码的 JSON)。本机解出来是:

LicenseType      = Perpetual
Status           = Provisioned
ActivationDate   = 2022-09-20
ExpiresOn        = 9999-12-31        → 永久
ProductReleaseId = HomeStudent2021Retail   → 与已安装的 C2R 产品一致
Beneficiary      = User               → 绑定账号而非设备

判定规则:Status == Provisioned 且未过期才算已激活;令牌存在但未生效或已过期会单独报出来,不会静默当成"无产品密钥"。

只查 SPP 会得到一个假阴性——把这台已激活的机器判成"Office 需要激活",进而推荐一个完全没有必要的 Ohook 操作。这正是本项目在真实机器上暴露并修掉的一个 bug。


为什么需要「添加排除」

这是实测出来的真实坑,不是臆测:

Defender 检测记录 : Trojan:Script/Wacatac.H!ml
命中文件          : MAS_AIO.cmd
处置              : 已隔离删除

MAS 本体长期被 Defender 以机器学习启发式(!ml 后缀就是启发式判定)误报。一旦被隔离,MAS 会以 Failed to create MAS file in temp folder 失败——普通用户看到这句话是完全懵的。

所以本程序做了两件事:

  1. 预检阶段直接告诉你 Defender 实时防护开着、且本工具目录还没有排除项;
  2. 提供 一键 Add-MpPreference -ExclusionPath 按钮,排除范围只限 %LOCALAPPDATA%\MAS-OneClick(脚本缓存目录),不会关掉整个实时防护,也不碰系统盘其它位置。

这个按钮只在你自己点的时候才执行,程序不会偷偷改你的安全设置。想撤销:再点一次移除,或手动

Remove-MpPreference -ExclusionPath "$env:LOCALAPPDATA\MAS-OneClick"

安全设计

项 做法
脚本来源 只有三个官方镜像:raw.githubusercontent.com(锁定 commit)、dev.azure.com/massgrave、git.activated.win,每次随机顺序尝试,没有固定的单点
完整性 先抓官方加载器 get.activated.win,读出它当前锁定的 commit + SHA256,再下载脚本并用和加载器完全相同的哈希算法比对(已实测复现:850F9796…0BFA,与官方声明一致)。不匹配直接中止,绝不执行未校验内容
缓存复验 复用本机缓存前会重新计算哈希,与文件名里记录的前 8 位比对。不符即判定被篡改,删除该文件并中止(退出码 7),绝不会执行
网络访问面 只监听 127.0.0.1,并对 Host 头做校验
本地接口 所有写操作要求每次启动随机生成的 token(注入页面),其它本地网页无法驱动它
命令注入 /api/run 的开关白名单校验 ^/[A-Za-z0-9\-]+$,非法输入直接拒绝(已实测:rm -rf / 被拒)
目录穿越 静态文件路径过滤 ..(已实测:/../server.ps1 返回 404)

脚本本体不落盘到程序目录之外;缓存文件放在 %LOCALAPPDATA%\MAS-OneClick\mas\,文件名带哈希前 8 位——文件名本身就是一份可自校验的凭据,所以「复用缓存」不会成为信任缺口。


离线与降级

这是个在线工具,但跑成功过一次之后就不再完全依赖上游。执行引擎取脚本的优先级是:

顺序 来源 条件 需要网络吗
a 本机缓存里上游当前正在发布的那个版本 加载器可达,且缓存里有同一版本 只需要加载器
b 官方三镜像 缓存里没有该版本 需要
c 本机缓存里任何已验证过的旧版本 加载器不可达,或三镜像全挂 完全不需要

两个有意为之的取舍:

  • 加载器 get.activated.win 不可达时,优先用缓存而不是硬下载。 因为那个分支下拿不到官方 SHA256,新下载的内容根本无法校验;而已缓存的副本是校验通过才落盘的,严格更可信。
  • 缓存复验不是走过场。 每次重用前重算哈希并与文件名比对,被改过的缓存会被删除,而不是被执行。

实测过的场景(用一份受控副本把镜像/加载器指向必失败地址,并在执行前截停,不真跑 MAS):

场景 结果
加载器正常 + 有对应版本缓存 + 三镜像全挂 退出码 0,0 次网络请求,直接命中缓存
加载器正常 + 无缓存 + 三镜像全挂 退出码 4,明确提示本机无可用缓存
加载器正常 + 缓存被篡改 + 三镜像全挂 退出码 7,判定被篡改并删除该文件
加载器也挂 + 有有效缓存 + 三镜像全挂 退出码 0,复验通过后直接使用,0 次镜像尝试
加载器正常 + 无缓存 + 镜像正常 退出码 0,正常下载且 SHA256 校验通过

所以真实的风险点不是「网站会不会挂」,而是首次使用必须有网。第一次跑通之后,这台机器就自己具备离线能力了。界面预检里的「脚本完整性」会直接告诉你本机现在有没有这个能力。


界面

深色极光 + 玻璃拟态,Win11 Fluent 风格,全部系统字体(Segoe UI Variable / 微软雅黑 UI),无网络字体依赖。

  • 左侧栏 — Windows / Office / 权限 三项实时摘要
  • 顶部 — 权限与网络状态胶囊
  • 状态卡 ×2 — 呼吸圆环表示激活状态,列出真实版本、内部版本、功能更新、授权渠道、密钥尾号
  • 一键激活卡 — 中文推荐方案 + 将要执行的开关标签 + 右侧六段式进度轨道(带连接线)+ 四格预检
  • 激活方式 ×4 — HWID / Ohook / TSforge / 在线 KMS,自动给推荐项打角标,也可单独执行
  • 运行日志 — 终端样式,脚本输出逐行流式回传,按内容着色,[oneclick] 引擎行自动翻译成中文

已用无头 Chrome 做 DOM 布局审计(1360×900):OVERFLOW_X[0],docScrollWidth == clientWidth(无横向溢出),四张方法卡尺寸完全一致 329×249,图标 SVG 全部渲染,区块纵向节奏 overview@130 / action@508 / methods@1076 / console@1688。

响应式断点 1180 / 1000 / 780px,支持 prefers-reduced-motion。


目录结构

MAS-OneClick\
├─ Start.cmd                 ASCII 名备用入口(转发给下面那个,防中文名在传输中乱码)
├─ 一键激活.cmd              傻瓜式入口(提权 + 启动)
├─ 使用说明.txt              给使用者看的白话说明
├─ app\
│  ├─ server.ps1            宿主:状态探测 / 推荐引擎 / API / 任务调度
│  ├─ worker.ps1            执行引擎:取脚本 + 校验 + 无人值守执行
│  └─ web\
│     ├─ index.html
│     ├─ styles.css
│     └─ app.js
├─ LICENSE                   MIT
├─ .gitignore
└─ README.md

运行期(自动创建,可随时删):
%LOCALAPPDATA%\MAS-OneClick\
├─ state.json               任务状态
├─ run\console.log          脚本原始输出
├─ mas\MAS_AIO_<hash>.cmd   已校验的脚本缓存(有了它就能离线运行)
└─ browser\                 应用窗口的独立浏览器配置

命令行(调试用)

# 只跑状态探测,不起服务
powershell -ExecutionPolicy Bypass -File .\app\server.ps1 -SelfTest

# 指定端口,不自动开窗口
powershell -ExecutionPolicy Bypass -File .\app\server.ps1 -Port 8899 -NoBrowser

故障排查

现象 原因 / 处理
点按钮提示「需要管理员权限」 没通过 一键激活.cmd 启动。点预检里的「以管理员重启」
预检显示「网络不可达」 DNS/ISP 拦截了 get.activated.win。开 Cloudflare WARP,或换网络
日志出现「所有镜像失败且本机无可用缓存」 三个官方镜像都不可达,且本机没有可退的缓存副本——首次运行就是这个状态。通常是代理/防火墙/DNS 拦截,开 Cloudflare WARP 或换网络。只要成功跑过一次,之后断网也能激活
日志出现「缓存副本与记录的哈希不符」 本机缓存的脚本被改动过。程序已删除该文件并中止,联网重跑即可
日志出现 SHA256 mismatch 下载被中间人篡改,程序会主动拒绝执行。换网络重试
日志出现「脚本被安全软件删除」 Defender 误报隔离。点预检里的「添加排除」后重试
执行完状态没变 部分场景需要重启才生效;先看日志里的真实输出

已知边界(实测说明)

  • 激活动作本身没有在本机端到端跑过。 本机 Windows 与 Office(vNext 账号数字许可证)均已授权,推荐引擎正确地给出了「无需操作」,所以没有可执行的激活路径可供验证。完整验证需要在真机上真正执行一次激活——这属于你的机器、你的决定,程序不会在没人点按钮的情况下自己动手。
  • 三个真实 bug 是被真机数据抓出来的,已修:①只查 SPP 导致 Office 账号制授权被误判为未激活(详见上文「Office 检测为什么要查两个地方」);②提权重启后旧窗口留下来对着已退出的服务,现在会显示交接遮罩;③离线缓存一度是死代码——每次都无条件重新下载,三镜像一挂就报错退出,本机明明躺着一份校验过的副本却用不上。现在缓存是三档优先级里的第一档和最后一档(详见「离线与降级」)。
  • 已实测通过的部分:宿主自检与推荐引擎(输出与机器真实状态一致)、全部 HTTP 接口、token 与开关白名单、目录穿越防护、DOM 布局审计、脚本 SHA256 复现校验(与官方声明逐字节一致)、四点静态资源服务、离线/降级七场景回归。
  • 非管理员启动时,执行阶段会额外弹一次 UAC(因为 MAS_AIO.cmd 需要在提权进程里跑)。通过 一键激活.cmd 启动则不会。
  • 离线能力是自动积累的:成功跑过一次之后,已验证的脚本会留在 %LOCALAPPDATA%\MAS-OneClick\mas\,此后无论上游是否可达都能继续工作。但第一次使用必须有网——这点无法回避,因为本程序有意不预置脚本(预置会被 Defender 在解压瞬间删掉,反而更糟)。

免责

本程序只是 massgrave.dev 开源脚本(MIT)的图形外壳,不修改、不重新分发脚本本体,也不内置任何授权数据。脚本的下载、校验、执行全部在你本机完成。请自行确认你有权在目标设备上使用该系统与授权方式。

About

A foolproof graphical wrapper for Microsoft Activation Scripts with Office vNext license detection and verified offline fallback.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages