清乐云 Pro
首页 进入管理后台

清乐云 · 官方文档

企业级网络授权 / 卡密分销 / 代码防破解一体化平台 · 自部署 · 5 种 SDK · 一行接入

1. 产品介绍#

清乐云 面向软件开发商,把「网络授权 + 反破解 + 卡密分销 + 云端下发」打包成一套自部署平台。你的软件(PC / 移动 / 工具 / 游戏辅助等)接入后可获得:

技术栈 · 后端:Go 1.22 + Gin + GORM · 数据:PostgreSQL 16 + Redis 7 · 前端:Vue 3.5 + Element Plus + Vite 5 · 部署:Docker Compose + Nginx。

产品形态

组件作用暴露端口
serverGo REST + WebSocket API内部 8000
adminVue 管理后台 + Nginx 静态5173 (可改)
postgres / redis持久化 / 会话 / 心跳 / 限流仅内网

2. 快速开始#

接入只有 3 步:创建应用 → 生成卡密 → 客户端调 SDK

第一步 · 创建应用

  1. 进入 管理后台 → 应用管理,点「新增应用」
  2. 填名称、描述、版本号;机器码/多开/加密选项保持默认即可
  3. 保存后记录 AppKeyRSA 公钥(客户端 SDK 3 个必填参数)

第二步 · 生成一批卡密

  1. 进入 管理后台 → 卡密管理,点「批量生成」
  2. 选应用 → 类型(例:时长卡 · 30 天 · 5 张)→ 生成
  3. 弹窗点「导出本批次」拿到卡号 CSV,用于售卖或代理分发

第三步 · 客户端接入(5 行代码)

pythonfrom qingleyun import Client
c = Client(server="http://your-server:5173", app_key="AK_XXXX", version="1.0.0")
c.activate("CARD-CODE-HERE")   # 第一次输入卡密激活
c.login()                        # 之后每次启动自动登录
c.start_heartbeat()              # 后台线程心跳 (默认 60s)
typescriptimport { Client } from './qingleyun.mjs'
const c = new Client({ server: 'http://your-server:5173', appKey: 'AK_XXXX', version: '1.0.0' })
await c.activate('CARD-CODE-HERE')
await c.login()
c.startHeartbeat()
csharpusing 清乐云.SDK;
var c = new QingleyunClient("http://your-server:5173", "AK_XXXX", "1.0.0");
await c.ActivateAsync("CARD-CODE-HERE");
await c.LoginAsync();
c.StartHeartbeat();
cpp#include "qingleyun.hpp"
qly::Client c("http://your-server:5173", "AK_XXXX", "1.0.0");
c.activate("CARD-CODE-HERE");
c.login();
c.start_heartbeat();
SDK 下载管理后台 → SDK 下载;每个包含源码 + Demo + 离线签名一致性自检脚本 + README。

3. 管理端功能#

侧栏按 概览 / 经营 / 发布 / 系统 4 组呈现;超管 标记的仅超级管理员可见。所有高危操作会二次密码 sudo

3.1 概览

3.2 经营

3.3 发布

3.4 系统

3.5 全局能力(非独立菜单)

已有代码但暂未挂菜单:用户管理(views/user/Index.vue)、TOTP 2FA、修改密码 UI — 通过在线客户 / 卡密 / 黑名单页可间接达成同等操作。

4. 代理商门户#

代理商独立子站,路由前缀 /agent,JWT 与管理端账号完全隔离。入口:代理商登录

页面路径能干什么
仪表盘/agent/dashboard余额 / 历史充值 / 消费 / 生卡总数;权限套餐摘要;近 30 天销售曲线(销售额 / 佣金 / 生卡数);最近流水与生卡
生成卡密/agent/generate选授权应用 → 时长/次数/永久 → 预设时长 → 面额(推荐价一键应用)→ 扣余额生成;受套餐限制(卡类型、日配额、单次上限、允许 app、最低售价系数)
我的卡密/agent/cards只看自己生成的;高级筛选;复制卡号;若管理员授予 can_freeze_own_cards 可自助冻结/解冻
资金流水/agent/transactions充值 / 生卡 / 佣金 / 退款 / 调整等流水按类型筛选
提现/agent/withdrawals发起提现(支付宝 / 微信 / 银行卡)→ 冻结对应余额;查状态;等审批打款

5. REST API#

Base URLhttp://your-server:5173/api(Nginx 反代到内部 8000)。所有 POST 请求 body 为 JSON,Content-Type 必须 application/json

5.1 客户端签名规则

所有客户端 POST 必带以下三 header,服务端 HMAC-SHA256 校验:

Header说明
X-App-Key应用 AppKey,管理后台可看
X-TimestampUnix 秒,服务端容忍 ±300s
X-Nonce32 位随机 hex;10 分钟内不能重放
X-SignHMAC_SHA256(secret, method|path|timestamp|nonce|body_sha256),hex 小写
签名字段拼接示例(Python):
pythonmsg = f"{method}|{path}|{ts}|{nonce}|{sha256(body).hexdigest()}"
sign = hmac.new(secret.encode(), msg.encode(), sha256).hexdigest()

5.2 客户端接口 /api/client/*

MethodEndpoint说明
GET /info 应用元信息 + RSA 公钥(X1 验签用)
GET /notice 启动公告(Markdown)
GET /version 检查更新 / 拿最新版直链
GET /variables 远程变量(带 version 增量)
GET /build/:id/download加壳产物下载
GET /ws WebSocket 长连接(见 §6
POST /handshake X2:RSA-OAEP 换 AES session
POST /integrity X3:上报 EXE 完整性 hash
POST /free_trial 免费试用(1h 临时 session,同机 24h 冷却)
POST /activate 卡密激活
POST /register 账号自助注册(App 开启注册码通道后可用)
POST /login 账号登录,拿 access_token
POST /heartbeat 心跳(默认 60s,超时自动踢线)
POST /logout 退出,token 立即失效
POST /rebind 客户端自助换机器码(受 rebind_max_count 限制)
POST /check 通用授权判定(DRM)
POST /resource/get 受保护数据资源下发(AES 一次性 key)
POST /codeblock/get CloudGate μVM 字节码下发
POST /codeblock/hostcallCloudGate Tier B 服务端计算

5.3 管理端接口 /api/admin/*

公开POST /auth/loginPOST /auth/refreshPOST /auth/register-send-codePOST /auth/register-verifyGET /tos

需登录(按模块,仅列核心):

模块Endpoint 示例
认证 /auth/me · /auth/logout · /auth/change-password · /auth/totp/* · /auth/sudo
服务条款 /tos/status · /tos/accept
应用 /apps CRUD · /apps/:id/rotate-key
远程变量 /apps/:id/variables CRUD
受保护资源 /apps/:id/resources CRUD(含 type=xvm)
卡密 /cards · /cards/generate · /cards/import · /cards/extend · /cards/freeze-batch · /cards/:code/freeze
黑名单 /blacklist CRUD · 支持 kick_online / freeze_cards 联动
在线 /online · /online/kick-session · /online/kick-user
代理 /agents CRUD · /agents/:id/recharge · /agents/:id/permissions
提现 /withdrawals · /withdrawals/:id/{approve,reject,pay}
版本 / 产物 /versions CRUD · /builds 上传/签发
公告 / 审计 /notices · /audit
SDK / Tools /sdks · /tools/list
导出 sudo/export/cards · /export/users · /export/agents
超管 super/admins/* · /admins/:id/impersonate · /tenants/* · /system/health

5.4 代理商接口 /api/agent/*

MethodEndpoint说明
POST/auth/login · /auth/refresh代理登录
GET /me · /apps · /recommended-prices身份 + 授权 app + 推荐价
GET /cards · /transactions · /withdrawals只看自己名下
GET /stats/overview · /stats/daily仪表盘数据源
POST/cards/generate扣余额生成
POST/cards/:id/{freeze,unfreeze}can_freeze_own_cards 权限
POST/withdrawals提交提现

公开运维GET /health(健康检查)· GET /metrics(Prometheus,默认仅 loopback)· GET /api/tools/{list,download/:filename,health}(工具包公开下载)。

6. WebSocket 实时通道#

客户端 GET /api/client/ws?token=<access_token> 建立 WSS 长连接,用于:

心跳:客户端每 30s 发 {"type":"ping"},服务端回 {"type":"pong"};90s 无 pong 视为断开重连。

7. SDK 使用#

5 套 SDK 协议层与服务端 字节级一致,每种 SDK 提供:源码 + Demo + 离线签名一致性自检 + README。管理后台 → SDK 下载 一键打包。

Python

单文件 qingleyun.py;标准库为主;可选装 cryptography 支持 X1 验签 / X2 加密。

pythonfrom qingleyun import Client, NetworkError, AuthError
c = Client(server="http://your-server:5173", app_key="AK_XXXX", version="1.0.0")
try:
    c.activate("CARD-CODE")   # 首次激活;已激活的直接 login
    c.login()
    c.start_heartbeat(interval=60)
    var = c.get_variables()["discount_pct"]  # 远程变量
    data = c.get_resource("vip_config")      # DRM 数据
except AuthError as e:
    print("卡密无效或过期", e)
except NetworkError as e:
    print("网络失败", e)

TypeScript / JavaScript

支持 Node ≥ 18;qingleyun.ts(源码)+ qingleyun.mjs(编译产物);含 codegate.ts Tier B async 支持。

typescriptimport { Client } from './qingleyun.mjs'
const c = new Client({ server: 'http://your-server:5173', appKey: 'AK_XXXX', version: '1.0.0' })
await c.activate('CARD-CODE')
await c.login()
c.startHeartbeat()
const { discountPct } = await c.getVariables()

C# / .NET

单文件 QingleyunClient.cs;.NET 6+;只依赖 BCL;含 CodeGate.cs 与 WinForms / WPF / Console Demo。

csharpusing 清乐云.SDK;
var c = new QingleyunClient("http://your-server:5173", "AK_XXXX", "1.0.0");
try
{
    await c.ActivateAsync("CARD-CODE");
    await c.LoginAsync();
    c.StartHeartbeat();
}
catch (AuthException ex) { Console.WriteLine($"卡密无效: {ex.Message}"); }

C++

Header-only qingleyun.hpp;Windows Only(Vista+);只依赖 WinHTTP + BCrypt;含 xvm.hpp(μVM 解释器)。

cpp#include "qingleyun.hpp"
qly::Client c("http://your-server:5173", "AK_XXXX", "1.0.0");
try {
    c.activate("CARD-CODE");
    c.login();
    c.start_heartbeat();
} catch (const qly::AuthError& e) {
    MessageBoxA(nullptr, e.what(), "授权失败", MB_ICONERROR);
}

易语言

提供 清乐云.ec 模块 + demo;仅 Windows 核心库;无第三方依赖。

e清乐云.初始化 ("http://your-server:5173", "AK_XXXX", "1.0.0")
如果真 (清乐云.激活卡密 ("CARD-CODE") = )
    清乐云.登录 ()
    清乐云.启动心跳 ()
如果真结束

8. 加壳工具(PackerX32)#

官方工具包提供两条加壳路线,从 管理后台 → 工具下载 获取 zip 后本地运行。

方案可执行文件定位
pe_patcher(推荐生产)patcher.exe注入 .qly 节 + 运行时 DLL;可勾选 VMProtect 二次加壳;支持 X3 完整性预生成
PackerX32 经典packer.exe + stub.exe把目标 EXE 嵌入 stub RCDATA;运行时先弹卡密,再解压启动

加壳流程(pe_patcher)

  1. 解压 zip,双击 patcher.exe(qly_runtime*.dll / vmp 目录须同级)
  2. 首次输入管理员账号密码(在 管理员 页创建);勾「记住本机」加密保存本地
  3. 选目标 EXE → 自动识别 x86/x64 → 选 AppKey、客户端版本、安全 flags(反调试 / 反 Hook / 完整性 / 字符串混淆)
  4. 点「加壳」→ 输出 原名_qly.exe
  5. 可勾 VMProtect 双层(轻度 / 标准 / 极度 preset 或自定义 .vmp
  6. 加壳完成后可算 X3 expected hash 写入 sidecar,供管理端 应用管理 一键 promote
CLI 支持patcher.exe --input app.exe --appkey AK_XXX --version 1.0.0 --sec-flags 0x07 --vmp

安全选项 (X3)

flag能力命中后
0x01反调试(5 层)ExitProcess(0xDEAD0001)
0x02反 Hook(12 关键 API)ExitProcess(0xDEAD0002)
0x04完整性校验ExitProcess(0xDEAD0003)
0x08字符串混淆
VMProtect_Con.exe 是第三方商用软件,本包附带仅供测试;生产请购买正版授权(vmpsoft.com)。

9. CloudGate 代码保护#

CloudGate 把 1-3 个关键函数编译成 μVM 字节码(XVM) 存服务端,客户端 CodeGate.invoke(name, args) 凭 valid token 拉取 → 内存里解释执行 → 用完清零。反破解者反编译本地二进制看不到这段逻辑,无 token 拿不到字节码。

与普通 DRM 的区别

特性受保护资源(DRM 数据)CloudGate(代码保护)
保护对象 字符串 / JSON / binary 代码逻辑
接口 POST /resource/getPOST /codeblock/get
执行位置 客户端拿明文使用 客户端 μVM 解释;Tier B 关键步骤在服务端
抗静态逆向 只能防抓包 逻辑不在本地二进制

使用步骤

  1. 进入 XVM 编译器,用类 C 高级语言或 XVM 汇编写核心函数
  2. 点「编译」→「测试运行」验证结果(Tier B 的 server(...) 调用需部署后测)
  3. 点「保存为受保护资源」,选目标应用 + 资源名 + 访问权限(任意登录 / 已激活 / VIP)
  4. 应用管理 打开 CloudGate 代码块下发 开关
  5. 客户端 SDK 里调 CodeGate.invoke("license_gate", [seed])

两档模式

详见 CLOUDGATE_GUIDE.md(工程完整版)。

10. 安全体系#

清乐云采用 5 层纵深防御:从传输层到应用层到客户端二进制到代码逻辑,逐层加固。

机制作用可选/默认
传输 HTTPS + Nginx 加密链路防中间人 生产必需
X0 HMAC-SHA256 请求签名 + Nonce 防重放 防篡改、防重放、防伪造客户端 默认全开
X1 RSA-PSS 响应签名(X-Resp-Sign 客户端用 App 公钥验签,防伪造服务端响应 默认全开
X2 应用层 Body 加密(RSA-OAEP 握手 + AES-256-GCM)抓包也看不到明文(含 HTTPS 被 MitM 场景) App 级开关
X3 加壳反调试 / 反 Hook / 完整性 hash 客户端二进制反破解 加壳时勾选
业务 机器码黑名单(3 级 severity) 拉黑破解者机器;可踢线 + 冻卡 手动或联动
逻辑 CloudGate μVM 字节码 + Tier B 关键函数不在本地二进制里 App 级开关

认证与鉴权

数据与运行时

11. 部署运维#

官方仅支持 Docker Compose 部署。参考 docker-compose.yml + docs/deployment.md

一键启动

bash# 1. 克隆代码
git clone https://your-repo/qingleyun.git && cd qingleyun

# 2. 配置环境变量
cp .env.example .env
vim .env      # 必填 POSTGRES_PASSWORD / REDIS_PASSWORD / JWT_SECRET / NETAUTH_AES_FIELD_KEY / ADMIN_INIT_PASSWORD

# 3. 启动全部服务
docker compose up -d

# 4. 打开管理后台
open http://$(hostname -I | awk '{print $1}'):5173

核心环境变量

变量要求说明
POSTGRES_PASSWORD 强密码 Postgres root
REDIS_PASSWORD 强密码 Redis auth
JWT_SECRET ≥ 32 字符 JWT 签名,不能含 changeme 等占位词
NETAUTH_AES_FIELD_KEY ≥ 32 字符,≠ JWT PII 字段加密
ADMIN_INIT_PASSWORD ≥ 12 字符 首个 super admin 初始密码,登录后立即改
ADMIN_HTTP_PORT 默认 5173 admin 容器映射端口
NETAUTH_SDK_DIR 路径 SDK 下载源目录
NETAUTH_TOOLS_DIR 路径 工具包公开下载目录

生产建议

12. 常见问题#

客户换电脑了怎么办?

三条路: 应用允许「客户端自助换绑」,客户端调 /rebind(扣配额); 客服在 卡密管理 里点该卡「换绑机器码」(强制换绑不扣次数); 在应用配置里放宽 rebind_max_count

支持哪些数据库?

官方支持 PostgreSQL 16+(15 也能跑)。MySQL / SQLite 未适配。

能扛多少并发?

单实例(2C/4G)实测:100 万注册用户 + 1000 万卡密 + 10000 并发心跳。瓶颈基本在 Postgres;上 3 副本 + Redis Sentinel 后可到 10 万并发。

能不能让用户在线买卡?

系统本身不含收银台,但代理商门户 /agent-login 就是"卡商门户";配合微信/支付宝面对面收款或对接你自己的 CDK 站,让下级代理买卡后代客户激活即可。

远程变量更新客户端要等多久?

接了 WebSocket 的客户端 即时收到 var_update 推送;未接 WS 的下次心跳(默认 60s)会带 version 增量拉取。

能不能强制下架某版本?

可以。版本管理 → 找到那版本 → 点「停用」;下次客户端 GET /version 会自动回退到上一个可用版本。

X2 应用层加密开了之后老 SDK 客户端会不会挂?

会。X2 开启前请确认所有客户端都升级到支持 /handshake 的版本;旧 SDK 会握手失败。建议先灰度:新版 SDK 发布 → 观察 30 天 → 后台开 X2。

怎么防止软件被破解?

五层组合拳: 加壳勾选反调试 + 反 Hook + 完整性(X3); 上 VMP 双层; 开 X2 加密通道; 核心算法搬到 CloudGate; 及时把发现的破解机器加黑名单。任何单层都不是银弹,堆叠才有威慑力。

调试器检测触发后用户看到啥?

进程被 ExitProcess(0xDEAD000X) 静默结束,不弹窗。0xDEAD0001=调试器 / 0xDEAD0002=Hook / 0xDEAD0003=完整性。排查建议:让用户关杀软 / 关 Wireshark / 关 Fiddler 后重试。

数据安全怎么保证?

数据存哪里?会传到你们服务器吗?

不会。清乐云是自部署 SaaS,服务器完全在你自己名下(云主机或机房),数据从来不出你的服务器。我们不接触任何用户数据。

13. 联系我们#

技术咨询 / 商业授权 / 私有定制 / SLA 服务:

QQ
2993253189

© 清乐云 · 官方文档 v2.0 · 最后更新