WebAPI
入口:POST /api/web.php?k=<AppKey>&sw=<软件ID>,请求体仅一个字段 data=<全密文 base64>,没有任何明文业务参数。
act 一览
| act | 说明 | body 字段 |
|---|---|---|
ping | 心跳 / 申领服务器租约 | machine |
verify | 登录 + 全量计费状态(时间 / 点数 / 等级 / 超级会员 / 按需) | user, pass, machine, md5 |
recharge | 卡密充值(天数 / 点数 / 等级 / 超级会员 / 用户级云常量) | user, pass, code |
buy | 按需收费:购买功能 | user, pass, feature, pay_with(points|super) |
use | 计点消耗(按次扣费) | user, pass, cost |
check_update | 查询版本更新 | ver, arch(32|64|arm) |
invoke | 远程自定义函数(云函数) | user, pass, fn, params |
quick_verify | 快速验证(机器码 + 到期时间) | token, machine |
响应
外层:{"data":"<S2C 密文>"};解密后:{"code":0,"msg":"ok","data":{…},"ts":1700000000}
返回码
| code | 含义 |
|---|---|
0 | 成功 |
2 | 业务不通过(到期 / 点数不足 / 等级不足等,见 msg) |
5 | 业务错误(卡密无效、功能不存在、余额不足…) |
10 | 用户名或密码错误 |
4001 | 重放封包 / 已拉黑(24h) |
4002 | 密文校验失败(长度 / GCM / 签名 / 篡改) |
4003 | 时间戳超差(默认 ±300s) |
4010 | SafeCode 不符 |
4040 | 开发者未配置软件 / 未知 act |
4301 | MD5 特征不符 |
4901 | 防山寨:服务器实例冲突 |
502 | 云函数执行异常 |
全密文协议(v4 · ECDH + AES-256-GCM)
1. 获取服务器公钥
首次通信前,客户端 GET api/web.php?k=<AppKey>&act=get_server_pub,得到 {"ok":true,"server_pub":"<base64 SPKI>"}。公钥可公开,不含任何私钥信息。
2. 派生会话密钥
客户端本地生成 ECDH P-256(或 RSA-2048)密钥对
共享密钥 S = ECDH(client_priv, server_pub) ← 服务端用 server_priv + client_pub 独立算出同一个 S
salt = SHA256("HVM-E2EE-SALT")
info = SHA256(app_key | "|" | client_pub_b64 | "|" | server_pub_b64)
会话密钥 K = HKDF-SHA256(S, salt, info, 32) ← 32 字节,全程不出现在网络上3. 请求封包(C2C)
wire = IV(16)
| ts(8, 小端)
| nonce(32, hex)
| mode(1) // 0 = 静态密钥, 1 = ECDH/RSA 非对称
| cpubLen(2, 小端) | client_pub_b64
| spubLen(2, 小端) | server_pub_b64
| AES-256-GCM 密文(变长)
| GCM tag(16)
| body_sig(64, hex 的 HMAC-SHA256)
明文 JSON = {ver:4, act, app_key, ts, nonce, client_id, safe_code,
client_pub, server_pub, body:{...}}
GCM AAD = IV | ts | nonce | mode | 公钥段(公钥被篡改 → 认证失败)
body_sig = HMAC-SHA256(secret + "::body", act|nonce|ts|明文JSON|client_pub|server_pub)
POST body = data=4. 响应封包(S2C)
wire = IV(16) | GCM 密文 | GCM tag(16)
AAD = app_key | "|" | client_pub_b64 | "|" | server_pub_b64 | "|" | 请求 nonce
密钥 = 同一个会话密钥 K
明文 = {"code":0,"msg":"ok","data":{...},"ts":...}
外层 = {"data":""} 5. 安全机制
- 全密文无特征:线上只有 AppKey 与密文,业务参数零明文。
- 端对端加密:会话密钥由双方各自从公私钥交换推导,外部仅截获公钥与密文,无法解密。
- 认证加密:AES-256-GCM 同时保证机密性与完整性,任何位翻转都会被拒绝(4002)。
- 多重签名:
client_id(运行 ID)、safe_code(封包安全码)、body_sig(包体 HMAC)。 - 一次性过期:
nonce与整包 SHA256 入库,二次发包触发 4001 并拉黑 IP / ClientID / 机器码 24 小时。 - 时间窗:
ts与服务端时间差超过 ±300 秒即拒绝(4003)。
多语言接入
WebAPI 是纯 HTTP + 全密文,任何能发 HTTP 并通过 OpenSSL / 系统 crypto 做 ECDH 与 AES-GCM 的语言都能接入。仓库内提供以下示例,均已实现完整的 ECDH 密钥交换与 AES-256-GCM 加解密:
| 语言 / 平台 | 示例路径 | 密码学依赖 |
|---|---|---|
| PHP | client/hvm_client.php | openssl 扩展 |
| Python | client/samples/python/hvm_client_e2ee.py | cryptography |
| C++ | client/samples/cpp/hvm_client_e2ee.cpp | OpenSSL + WinHTTP |
| C# | client/samples/csharp/HvmClient.cs | .NET 内置 |
| Java | client/samples/java/Hvm.java | JDK 内置 |
| Go | client/samples/go/hvm_client.go | 标准库 |
| Delphi | client/samples/delphi/HvmClient.pas | OpenSSL |
| VB | client/samples/vb/HvmClient.bas | .NET 内置 |
| 易语言 | client/samples/epl/HvmClient_E2EE.cpp + HVM_易语言示例_E2EE.e | DLL 封装 |
| JS / 火山 / 小程序 | client/samples/js/hvm_client.mjs | Node crypto / WebCrypto |
近 20 项防破方案
| 方案 | 实现方式 |
|---|---|
| 全密文无特征 | 线上仅 ?k=(公开标识)与 data=(密文),业务参数零明文。 |
| 端对端加密 | ECDH 密钥交换 + HKDF 派生 + AES-256-GCM,会话密钥不落地。 |
| 防山寨服务器 | 服务器指纹单实例租约;山寨服务器一律 4901;换机后旧实例立即失效。 |
| 防爆破 | 核心参数云端化(云常量 / 云函数),客户端为空壳。 |
| 防截包 / 二次发包 | 封包 Hash 入库一次性过期,重放拉黑 IP / ClientID / 机器码 24h。 |
| MD5 哈希校验 | 程序特征码存放云端,1 字节改动即 4301。 |
| 封包签名 | ClientID · SafeCode · body_sig HMAC · 封包 Hash 记录。 |
| 一次性过期 | nonce + 封包 Hash 双表入库。 |
| 时间窗校验 | ts 与服务端偏差超过 ±300s 拒绝。 |
| 内存保护 | 客户端密钥拆分 + 反调试 + 反注入,建议配合 VMP / Themida。 |
| 防调试 | 时间差检测、调试器探测。 |
| 云常量(1)软件级 | 登录成功后才返回,核心参数云端化。 |
| 云常量(2)用户级 | 登录且未到期才返回,按卡类写入,区分级别与功能权限。 |
| 远程自定义函数 | 核心算法云端化,可访问数据库与服务器文件。 |
| 计费组合 | 时间 / 点数 / 等级 / 超级会员 / 按需,任意叠加。 |
| 快速验证 | 机器码 + 到期时间一行接入,临时接单防骗。 |
| 无级代理 | 无限层级,独立制卡价与说明,子代加扣款。 |
| 层级分成 | 深度 N + 比例序列(默认 3% · 2% · 1%)。 |
| 版本管理 | X32 / X64 / ARM,签名 Token 限次下载 + MD5 校验。 |
| 工单系统 | 售前售后一体,邮件 / 短信通知,无人值守。 |
内存保护指导(客户端侧)
服务端是 PHP,无客户端内存可破;客户端内存强度取决于你的实现与壳。建议:
- 密钥拆分:secret / safe_code 拆成多片存储,运行时异或还原,内存中不出现完整字符串。
- 反调试:IsDebuggerPresent / CheckRemoteDebuggerPresent / 时间差检测(DTR 级)。
- 反注入:校验 PE 头与关键 API 完整性,防 IAT Hook。
- 壳保护:VMP 或 Themida 对核心 DLL / EXE 加壳。
- 核心逻辑云端化:关键算法走
invoke云函数,客户端只留空壳(推荐)。
自动更新(update.exe)
更新程序随软件一同发布,主程序启动时调用:
update.exe [主程序名] [架构] 1) 读取 config.txt(api_url / k / sw / secret / safe_code / arch) 2) act=check_update 查询是否有新版本 3) 收到 latest=true 时,用返回的限次签名 URL 下载更新包 4) 校验 MD5 → 备份旧 EXE(.old) → 替换 → 重启主程序
服务端 api/update.php 校验 Token 有效期、使用次数与文件 MD5,防止被替换或盗链。
当前凭证
AppKey
demo_appkeyAppSecretdemo_secretSafeCode0fc3c4fa879e974e开发者admin(admin / admin123)演示用户demo_user / user123演示卡密DEMO-TIME-2026 · DEMO-PT-100 · DEMO-SVIP-888