版本 2.1 |
服务地址 cli.deepsafe.top:29295 |
通信协议 HTTP GET |
加密方式 AES-256-CBC
DeepSafe 提供基于卡密的网络授权验证服务。客户端引入 DLL 后,通过 HTTP 与服务端交互完成登录、心跳、解绑等操作。
| 项目 | 说明 |
|---|---|
| 服务地址 | cli.deepsafe.top(如需自定义请在 init() 中修改) |
| 端口 | 29295 |
| 传输方式 | HTTP GET,参数 URL-Encoded |
| 加密算法 | AES-256-CBC,IV 全零 |
| 密钥派生 | MD5(password) × 2 扩展为 32 字节密钥 |
| 响应格式 | Base64(AES 密文) → 解密后为 JSON |
| 防重放 | 请求携带 TimeStemp(Unix 时间戳),服务端 ±10s 容差 |
| 防离线分析 | 请求携带 Nonce(客户端生成的随机数),参与密钥派生 |
GET /{endpoint}?&key1=URL_ENCODE(val1)&key2=URL_ENCODE(val2)&Nonce={随机数} HTTP/1.1
Host: cli.deepsafe.top:29295
通用规则:
- _ . ~ 保留原样)&Nonce={随机正整数}&TimeStemp={Unix时间戳}// 固定密钥 (构建时 VMProtect 加密,运行时解密) string g_AESEncrypyKey = "DeepSafe"; // 实际项目请改为自定义值 // 密钥派生 (AESHelper) MD5(g_AESEncrypyKey + Nonce) // → 16 字节 最终密钥 = MD5_Digest || MD5_Digest // 复制拼接 → 32 字节
HTTP Response Body (Base64 字符串)
│
├─ Base64 Decode
│ ↓
├─ AES-256-CBC Decrypt (key = 派生密钥, iv = 0×16)
│ ↓
└─ UTF-8 JSON 字符串 → json::parse()
可选操作:解绑 → /deepsafeUnbind | 拉黑设备 → /deepsafeLBlocking
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| user | string | ✓ | 开发者用户名 |
| rjm | string | ✓ | 项目名称 (软件名) |
成功响应 JSON:
{
"result": ["Succeed"],
"cause": ["这是一条公告内容,支持 UTF-8 中文"]
}
该接口用于在登录界面展示项目公告,无加密或使用通用密钥加密。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| UserName | string | ✓ | 开发者用户名 |
| ProjectName | string | ✓ | 项目名称 |
| VersionNumber | string | ✓ | 版本号 |
| deviceKey | string | ✓ | 机器码 (MAC+CPU) |
| QQh | string | 当前登录的 QQ 号 |
成功响应 JSON:
{
"code": ["100"],
"result": ["Succeed"],
"state": ["网络验证"] // ← 此字段经过 URL-Encode,需 url_decode()
}
state 取值含义:
| 值 | 含义 |
|---|---|
| 网络验证 | 正常验证模式 |
| 单线模式 | 单线授权模式 |
| 云保护壳 | 加壳保护模式 |
| 停用 | 项目已停用 |
错误码:
| code | 含义 |
|---|---|
| 101 | 账户授权或验证已到期 |
| 102 | 版本已禁用 |
| 400 | 该设备已封禁 |
| 401 | 设备已过期 |
| 403 | 设备已冻结 |
state 字段经过 URL-Encode,客户端必须调用 url_decode() 后再比对。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| user | string | ✓ | 开发者用户名 |
| username | string | ✓ | 项目名称 |
| km | string | ✓ | 卡密 |
| jqm | string | ✓ | 机器码 (MAC+CPU) |
| hQQ | string | QQ 号 | |
| TimeStemp | int | ✓ | Unix 时间戳 (秒),服务端 ±10s 防重放 |
成功响应 JSON:
{
"code": ["100"],
"result": ["succeed"],
"EndTime": ["2026-12-31 23:59:59"],
"TimeStemp": ["1714200000"],
"SafeKey": ["94041a"],
"CheckKey": ["8e044c"]
}
|当前时间 - TimeStemp| ≤ 10s(防重放),否则退出进程SafeKey 与本地编译时嵌入的 g_SafeKey 是否一致CheckKey 与本地编译时嵌入的 g_CheckKey 是否一致/deepsafeLBlocking 拉黑设备并提示"非法修改程序文件"错误码:
| code | 含义 |
|---|---|
| 101 | 卡密已过期 |
| 102 | 卡密不一致(不属于该项目) |
| 103 | 账号已封禁 |
| 104 | 卡密不存在 |
| 303 | QQ 号不匹配 |
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| user | string | ✓ | 开发者用户名 |
| km | string | ✓ | 登录成功的卡密 |
| deviceKey | string | ✓ | 机器码 |
| rjm | string | ✓ | 项目名称 |
调用频率:每 60 秒一次 | 容错:连续失败 3 次后退出进程
成功响应 JSON:
{
"code": ["100"]
}
错误码:
| code | 触发动作 | 含义 |
|---|---|---|
| 101 | 结束心跳回调 → 弹窗 → 退出 | 卡密不存在 |
| 102 | 弹窗 → 退出 | 卡密被禁用 |
| 103 | 结束心跳回调 → 弹窗 → 退出 | 卡密不一致 |
| 104 | 结束心跳回调 → 弹窗 → 退出 | 卡密已到期 |
| 105 | 结束心跳回调 → 弹窗 → 退出 | 项目已停用 |
EndCallback 导出函数,然后再退出进程。连续失败 3 次(即 3 分钟内均失败)触发强制退出。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| user | string | ✓ | 开发者用户名 |
| km | string | ✓ | 要解绑的卡密 |
| rjm | string | ✓ | 项目名称 |
成功响应 JSON:
{
"result": ["Succeed"],
"cause": [""]
}
解绑成功后,该卡密可在其他设备上重新登录。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| user | string | ✓ | 开发者用户名 |
| dev | string | ✓ | 项目名称 |
| km | string | ✓ | 当前登录的卡密 |
| cause | string | ✓ | 拉黑原因(如:非法修改程序文件) |
成功响应:
okay
SafeKey 或 CheckKey 不匹配时自动调用,用于标记设备为非法状态。
| code | 出现接口 | 含义 |
|---|---|---|
| 100 | 全部 | 操作成功 |
| 101 | 登录 / 心跳 / 初始化 | 过期 — 卡密已过期 或 账户授权到期 |
| 102 | 登录 / 心跳 / 初始化 | 禁用 — 卡密/版本被禁用 或 卡密不一致 |
| 103 | 登录 / 心跳 | 封禁 — 账号已封禁 或 卡密不一致 |
| 104 | 登录 / 心跳 | 不存在 / 到期 — 卡密不存在或已到期 |
| 105 | 心跳 | 项目已停用 |
| 303 | 登录 | QQ 号不匹配 |
| 400 | 初始化 | 该设备已封禁 |
| 401 | 初始化 | 设备已过期 |
| 403 | 初始化 | 设备已冻结 |
// init() — DLL 入口调用
void init(HMODULE hModule) {
// 项目配置 (编译时由一键加验证客户端注入)
g_UserName = "Admins";
g_ProjectName = "深度云授权";
g_SafeKey = "94041a";
g_CheckKey = "8e044c";
VersionNumber = "10";
// 收集设备信息
QQ = GetQQ_Plus(); // 获取当前登录的 QQ 号
机器码 = GetMachineID(); // MAC + CPU 序列号
// 初始化校验
if (!GetInitrRequst()) {
ExitProcess(0);
}
// 显示登录窗口 → 启动心跳线程
LoadWindow();
std::thread t(HeartThreat);
t.detach();
}
// 生成随机 Nonce
int GenerateNonce() {
unsigned int n;
HCRYPTPROV hProv;
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
CryptGenRandom(hProv, sizeof(n), (BYTE*)&n);
CryptReleaseContext(hProv, 0);
return n;
}
// 构建 URL: path?&key1=urlencode(val1)&key2=urlencode(val2)&Nonce=xxx
static string BuildUrl(const string& path,
const vector<pair<string, string>>& params) {
string url = path + "?";
for (auto& p : params) {
url += "&" + p.first + "=" + url_encode(p.second);
}
return url += "&Nonce=" + to_string(GenerateNonce());
}
// 发送 GET 并解密响应
static string GetDecrypt(const string& url) {
auto res = cli.Get(url);
if (!res || res->status != 200) return "";
return E_AES256_Decrypt(res->body.c_str(), g_AESEncrypyKey);
}
// 获取公告
string notice = GetDecrypt(BuildUrl("/deepsafeGetNotice", {
{"user", g_UserName},
{"rjm", g_ProjectName}
}));
// 卡密登录
string result = GetDecrypt(BuildUrl("/deeosafeloadkhd", {
{"user", g_UserName},
{"username", g_ProjectName},
{"km", 卡密},
{"jqm", 机器码},
{"hQQ", QQ},
{"TimeStemp", to_string(time(nullptr))}
}));
// 心跳
string heart = GetDecrypt(BuildUrl("/deepsafeHeart", {
{"user", g_UserName},
{"km", LoginKey},
{"deviceKey", 机器码},
{"rjm", g_ProjectName}
}));
// 解绑
string unbind = GetDecrypt(BuildUrl("/deepsafeUnbind", {
{"user", g_UserName},
{"km", 卡密},
{"rjm", g_ProjectName}
}));
验证.cpp。
DeepSafe Network Authentication © 2026