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,重跑脚本即可重新打补丁。

激活成功PRO

5. 几个坑

  • 状态码 8(时钟过早):签发时间 iat 不能是未来,默认 now - 5 分钟,出错改 --iat-offset +1
  • 状态码 12(无效凭证):多半是 machineid 或 dom 不匹配,别把界面显示码当验证码填。
  • 状态码 31(已过期):exp 太短,默认 +10 年不用管。
  • ref 字段必须设成远未来(直接等于 exp):否则客户端会走联网刷新授权,离线环境刷新必失败,授权会掉。

脚本

  1. snipaste_offline_keygen.py 命令模式运行
  2. SnipasteKeygen.EXE 图形工具
  3. 两款都是python写的脚本。为了方便写了一个图形界面的

Snipastepatched.zip

截图

声明

本项目基于:Snipaste-2.10.8-x64 离线激活记录

本方案仅用于个人学习研究,请支持正版。