Snipaste 2.11.X 离线授权分析
AI 摘要
博主分析了Snipaste 2.11.X的离线授权机制,指出授权码可本地生成,包含Ed25519签名和gzip压缩JSON,并详述机器码生成算法及通过修改exe三字节跳过验签的补丁方法,最后提供脚本工具。
本文已更新于 今天 前
Snipaste 的授权码可以离线本地生成,不需要联网。
激活只有两步:伪造一把客户端认可的授权码 + 打一个补丁让授权码通过。

授权码分析
1. 授权码格式
它是一串 base64 文本,形如:
0F-xxxxxxxxxxxx...
逐步分析授权码:
| 位置 | 含义 |
|---|---|
第 1 位 0 | 固定头 |
第 2 位 F | 校验字符 |
- | 分隔符 |
| 后面一长串 | 真实数据(签名 + 载荷) |
真实数据 = 64 字节 Ed25519 签名 + gzip 压缩的授权信息 JSON。
授权码里面的 JSON 主要字段:
| 字段 | 作用 | 客户端检查吗 |
|---|---|---|
| eml | 邮箱 | 检查,不能为空 |
| dom | 工作组 | 检查,要匹配本机工作组 |
| hwi.machineid | 机器验证码 | 检查,必须匹配本机 |
| hwi.platform | 平台 | 检查,必须等于 1 |
| iat / exp | 签发时间 / 到期时间 | 检查时间范围 |
| lic / pln / api | 版本类型等 | 不检查 |
2. 关键一步:机器验证码(machineid)
Snipaste 的授权是绑定机器的。
生成验证码的算法(和客户端完全一致):
验证码 = blake2s("Snipaste 2" + "1" + MachineGuid) 取后 10 字节
→ 转十六进制大写 → 按 4-8 分段加横杠
→ 末尾追加一个校验字符 → 再追加 "1"MachineGuid存在注册表:HKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid- 每台电脑唯一,重装系统会变
- 注意:这里说的验证码,不是 Snipaste 设置界面里显示的设备码。填错就会报"无效凭证"。
3. 签名与验签
授权信息 JSON 用自签的 Ed25519 私钥签名,客户端用内置公钥验签。
想让伪造的授权码通过验签,有两条路:
- 方式 A:把客户端内置公钥换成自己的公钥(需要改 exe 里的公钥数据)
- 方式 B(本文采用):直接改 exe,让验签结果直接"通过",伪造公钥都不用换
4. 打补丁
Snipaste 2.11.3 x64 只需改 3 个字节:
偏移 0x24AC80(即 RVA 0x14024B880):
0F B6 D8 → B3 01 90
(取验签结果) (直接置 1,nop)
把验签结果存进寄存器,改成"寄存器等于 1 "。补丁后,授权码直接通过验证。
谨记:激活后,不要重新解压覆盖 exe 程序,补丁会被还原,激活立刻失效。脚本会自动备份原版为 .bak,重跑脚本即可重新打补丁。
5. 几个坑
- 状态码 8(时钟过早):签发时间
iat不能是未来,默认now - 5 分钟,出错改--iat-offset +1。 - 状态码 12(无效凭证):多半是 machineid 或 dom 不匹配,别把界面显示码当验证码填。
- 状态码 31(已过期):
exp太短,默认 +10 年不用管。 ref字段必须设成远未来(直接等于 exp):否则客户端会走联网刷新授权,离线环境刷新必失败,授权会掉。
脚本
- snipaste_offline_keygen.py 命令模式运行
- SnipasteKeygen.EXE 图形工具
- 两款都是python写的脚本。为了方便写了一个图形界面的
截图
声明
本项目基于:Snipaste-2.10.8-x64 离线激活记录
本方案仅用于个人学习研究,请支持正版。


写得真诚