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)
4010SafeCode 不符
4040开发者未配置软件 / 未知 act
4301MD5 特征不符
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. 安全机制

多语言接入

WebAPI 是纯 HTTP + 全密文,任何能发 HTTP 并通过 OpenSSL / 系统 crypto 做 ECDH 与 AES-GCM 的语言都能接入。仓库内提供以下示例,均已实现完整的 ECDH 密钥交换与 AES-256-GCM 加解密:

语言 / 平台示例路径密码学依赖
PHPclient/hvm_client.phpopenssl 扩展
Pythonclient/samples/python/hvm_client_e2ee.pycryptography
C++client/samples/cpp/hvm_client_e2ee.cppOpenSSL + WinHTTP
C#client/samples/csharp/HvmClient.cs.NET 内置
Javaclient/samples/java/Hvm.javaJDK 内置
Goclient/samples/go/hvm_client.go标准库
Delphiclient/samples/delphi/HvmClient.pasOpenSSL
VBclient/samples/vb/HvmClient.bas.NET 内置
易语言client/samples/epl/HvmClient_E2EE.cpp + HVM_易语言示例_E2EE.eDLL 封装
JS / 火山 / 小程序client/samples/js/hvm_client.mjsNode 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,无客户端内存可破;客户端内存强度取决于你的实现与壳。建议:

  1. 密钥拆分:secret / safe_code 拆成多片存储,运行时异或还原,内存中不出现完整字符串。
  2. 反调试:IsDebuggerPresent / CheckRemoteDebuggerPresent / 时间差检测(DTR 级)。
  3. 反注入:校验 PE 头与关键 API 完整性,防 IAT Hook。
  4. 壳保护:VMP 或 Themida 对核心 DLL / EXE 加壳。
  5. 核心逻辑云端化:关键算法走 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,防止被替换或盗链。

当前凭证

AppKeydemo_appkeyAppSecretdemo_secretSafeCode0fc3c4fa879e974e开发者admin(admin / admin123)演示用户demo_user / user123演示卡密DEMO-TIME-2026 · DEMO-PT-100 · DEMO-SVIP-888