SDK 现为定向分发,不提供公开下载。DLL 版为二进制黑盒分发(含 C 头文件与使用文档),请联系官方获取;协议版本 Nebula 3.1 · DLL SDK v2.3 · 2026-10-11 更新

Nebula DLL 版 SDK 接入文档(NebulaSDK_x64 / x86.dll)

📚 本文属 Nebula 文档中心,主索引见 Nebula 文档中心;相关文档:C++ SDK 接入 · SDK 加固指南 · API 接口

适用对象:NebulaSDK_x86.dll / NebulaSDK_x64.dll(纯 DLL 黑盒,C 接口)
调用约定:__stdcall · 字符串编码:UTF-8(char*)· 适用平台:Windows 7+(x86 / x64)
目标调用方:易语言、C/C++、C#、Delphi、Python 等一切能调用 Windows DLL 的语言


1. 概述与选型

DLL 版是 Nebula SDK 的二进制黑盒形态:把 Nebula 3.1 协议(ECDH P-256 握手 + AES-256-GCM 信封 + ES256 响应验签 + seq 防重放)完整封装进一个 DLL,导出 38 个 C 风格函数。调用方零密码学实现,声明即可用。

形态适合谁特点
DLL 版(本文)易语言 / Delphi / 不想公开源码集成的 C++ 项目 / 任意能调 DLL 的语言黑盒二进制,声明即可用;升级 DLL 不用重编译宿主;支持完整加壳
C++ header-only 版C++ 项目直接编译进宿主源码级集成,支持 VMP/Themida 壳标记、完整内存守卫与模块注入检测
C# 版 / Python 版.NET / 脚本项目源码分发,能力与 C++ 端对齐
版本变更
v2.3版本更新三件套(GetUpdateInfo / SelfIntegrityCheck / DownloadUpdate)+ 系统代理开关(SetUseSystemProxy)
v2.2运行时安全策略对齐:策略缓存 / 有限自检按策略处置 / 安全事件上报(失败入队随心跳补发)/ 可选自动心跳线程
v2.1修复登录 JSON 序列化缺陷与 Feature 解密密钥派生;登录自动声明 capabilities.runtime_guard=true;响应会话一致性校验
v2.0内置提示框三 API(标题自动用服务端下发的软件名称);敏感内存清零;Release 编译加固;加载时反调试

2. 交付物清单

文件说明
NebulaSDK_x86.dll / NebulaSDK_x86.lib32 位版本(.lib 为导入库)
NebulaSDK_x64.dll / NebulaSDK_x64.lib64 位版本(.lib 为导入库)
NebulaSDK.hC 语言头文件:全部 API 声明、错误码、状态枚举(x86/x64 通用)

编译环境:Visual Studio 2022(v145 工具集)、C++20、Windows SDK 10。DLL 与宿主架构必须一致,混用会导致 LoadLibrary 失败。

3. 两种集成方式

方式 A:隐式链接(.lib + .h + .dll)

适合 C/C++、易语言。VS 项目设置:链接器 → 输入 → 附加依赖项加 NebulaSDK_x86.lib(或 x64);附加库目录指向 .lib 路径;C/C++ → 附加包含目录指向 NebulaSDK.h。

BAT
cl /EHsc main.cpp /I. /link NebulaSDK_x86.lib    rem 32 位
cl /EHsc main.cpp /I. /link NebulaSDK_x64.lib    rem 64 位

.lib 只是导入库,运行时仍需对应架构的 .dll 与 exe 同目录。

方式 B:动态加载 LoadLibrary(免 .lib)

适合 C#、Python、Delphi 或需要运行时按需加载的场景。只需 .dll 一个文件,用 LoadLibraryA + GetProcAddress 逐个取函数地址(声明原型参见 NebulaSDK.h)。

4. 调用流程

TEXT
Nebula_Create                  创建实例
    |
Nebula_SetServer / SetAppKey / SetClientVersion / SetMachineId
Nebula_SetRespSignKey          (可选) 响应签名公钥
Nebula_SetDeviceInfo           (可选) 设备指纹六项
    |
Nebula_Handshake               ECDH P-256 握手,建立加密通道
    |
Nebula_Init                    初始化,拉取配置(含软件名称)
    |
Nebula_LoginPassword / LoginUsernameCode / LoginCard   三选一登录
    |
Nebula_Heartbeat / GetUserInfo / GetDevices / GetNotice / CheckVersion
Nebula_GetOnline / Activate / Unbind / DecryptFeature
Nebula_SecurityCheck           (v2.2+) 周期安全自检
    |
Nebula_Logout                  退出登录
    |
Nebula_Destroy                 销毁实例(自动清零敏感内存、停心跳线程)

机器码需调用方自行采集传入 Nebula_SetMachineId(DLL 不自动采集硬件信息,避免 WMI 权限、虚拟机兼容、易语言环境差异等问题)。常见方式:硬盘序列号 / CPU ID / 主板序列号单项、多项拼接取 SHA256,或 Windows 产品 ID。设备绑定由服务端自动处理:已绑定设备直接通过,未绑定未达上限自动绑定,达上限拒绝(4001)。

最小可运行示例(C):

C
#include "NebulaSDK.h"
#include <stdio.h>

int main() {
    NEBULA_HANDLE h = Nebula_Create();
    Nebula_SetServer(h, "https://your-server.com");
    Nebula_SetAppKey(h, "YOUR_APP_KEY");
    Nebula_SetClientVersion(h, "1.0.0");
    Nebula_SetMachineId(h, "MACHINE_ID");

    if (Nebula_Handshake(h) != 0) { Nebula_ShowErrorBox(h, NULL); Nebula_Destroy(h); return 1; }
    Nebula_Init(h);

    if (Nebula_LoginPassword(h, "your_username", "your_password") == 0) {
        char result[16384];
        Nebula_GetResult(h, result, sizeof(result));
        printf("Login: %s\n", result);
        Nebula_Heartbeat(h);                /* 心跳保活,30~60 秒一次 */
        Nebula_Logout(h);
    } else {
        Nebula_ShowErrorBox(h, NULL);       /* 失败直接弹框,免拼错误信息 */
    }
    Nebula_Destroy(h);
    return 0;
}

5. API 一览

全部 38 个导出函数均为 __stdcall,字符串参数为 UTF-8 const char*;返回 0 成功,负数为 DLL 内部错误,正数为服务端业务码。

5.1 生命周期与配置

函数说明
Nebula_Create(void)创建实例,返回非 NULL 成功
Nebula_Destroy(h)销毁实例;自动清零全部会话密钥与 feature_key、停止自动心跳线程
Nebula_SetServer(h, url)服务器地址,握手前必调
Nebula_SetAppKey(h, key)AppKey,握手前必调
Nebula_SetClientVersion(h, ver)客户端版本号
Nebula_SetMachineId(h, id)机器码,必填不能为空,调用方自行采集
Nebula_SetDeviceInfo(h, board, cpu, disk, bios, mac, gpu)设备指纹六项(可 NULL 跳过单项)
Nebula_SetRespSignKey(h, pem)响应签名公钥(ES256 PEM),设置后自动验握手/响应签名防中间人

5.2 握手 / 初始化 / 登录

函数说明
Nebula_Handshake(h)Nebula 3.1 ECDH P-256 握手;成功后自动派生会话密钥,临时私钥用完即清零
Nebula_Init(h)初始化拉取配置;自动提取 data.software.name 作提示框标题
Nebula_LoginPassword(h, user, pwd)账号密码登录
Nebula_LoginUsernameCode(h, user, code)账号 + 激活码登录
Nebula_LoginCard(h, code)卡密直登

v2.1 起登录请求自动携带 capabilities: {"runtime_guard": true},服务端开启 RuntimeGuard 强制策略时可正常放行。

5.3 业务 API(登录后)

函数说明
Nebula_Heartbeat(h)心跳保活,建议 30~60 秒一次;返回 1002/1003 表示会话失效
Nebula_GetUserInfo(h)获取用户信息
Nebula_GetDevices(h)获取绑定设备列表
Nebula_Activate(h, code)激活卡密到当前账号
Nebula_Unbind(h, pwd, all)解绑设备(all=1 解绑全部,需密码)
Nebula_GetNotice(h, id)获取公告(NULL 取最新)
Nebula_CheckVersion(h, channel)版本检查(NULL 默认 stable)
Nebula_GetOnline(h)在线人数
Nebula_Logout(h)退出登录,自动清零 feature_key

5.4 结果 / 状态 / Feature

函数说明
Nebula_GetResult(h, buf, size)取上次操作 JSON 结果(建议 ≥16384 字节缓冲)
Nebula_GetLastError(h)最后错误码(0=无错误)
Nebula_GetLastErrorMessage(h, buf, size)错误文字描述(建议 ≥1024 字节)
Nebula_GetState(h)状态机枚举值:CREATED(0)→HANDSHAKING(1)→ESTABLISHED(2)→INITIALIZED(3)→LOGGED_IN(4)→LOGGED_OUT(5)→DESTROYED(6);异常转换:LOGGED_IN 收到心跳 1002/1003 回退 ESTABLISHED(需重新登录)
Nebula_DecryptFeature(h, data, buf, size)解密 NF1 功能密钥:NF1.<base64(iv+AES-256-CBC密文)>.<hex(HMAC-SHA256)>,encrypt-then-MAC 先验后解;密钥域分离派生 SHA256(feature_key + "|nebula-feature-aes") / SHA256(feature_key + "|nebula-feature-mac")(v2.1 起与服务端及其余 SDK 一致),解密完成后密钥副本与明文中间副本立即清零;建议缓冲 ≥8192 字节,返回实际写入字节数

返回 JSON 统一格式:{code, msg, success, data, need_relogin, need_update, force_offline}。登录成功 data 含 token / expire_at / feature_key;Init 响应 data 含 software.name(提示框标题)、heartbeat_interval(心跳建议间隔)、session_ttl、version(latest / need_update)、grace(离线宽限开关)。

5.5 运行时安全与自动心跳(v2.2+)

函数说明
Nebula_GetRuntimePolicy(h, buf, size)读取缓存的 runtime_policy 原文 JSON(init/login/heartbeat 三通道下发),未收到时 {}
Nebula_SecurityCheck(h)运行「可靠不误报」检测集(用户态/远程调试器、PEB NtGlobalFlag),命中后按服务端策略处置并上报。返回值:0=未命中/策略未启用(无副作用)、1=REPORT(仅上报)、2=POPUP(上报+弹提示框)、3=TERMINATE(上报+置错误态 lastError=-20)、4=REVOKE_SESSION(上报 CRITICAL 事件+清登录态,服务端同步封禁会话)。建议心跳循环中周期调用
Nebula_ReportRuntimeEvent(h, type, level, score, detail)上报安全事件(对齐 runtime_security_event 接口)。type 如 DEBUGGER_VM_CHECK / RUNTIME_CHECK(服务端大写归一);level 取 LOW/MEDIUM/HIGH/CRITICAL(NULL 默认 HIGH);score 取 0-100000(0=由服务端按事件类型修正);detail 为明细 JSON(可 NULL)。网络失败自动入队(上限 64 条)随心跳补发,返回 0 表示服务端已接受
Nebula_SetAutoHeartbeat(h, enable, seconds)内置心跳线程(默认关闭);≤0 用服务端下发间隔(默认 60 秒);登录态失效自动清理;易语言侧登录成功后开一次即可,免写时钟循环

完整内存守卫 / 模块注入 / Manual Map 检测仅在 C++ 源码 SDK 提供;DLL 黑盒版内置「可靠不误报」检测集 + 策略驱动处置。

5.6 自动更新与代理(v2.3+)

函数说明
Nebula_GetUpdateInfo(h, buf, size)读取 init / CheckVersion 下发的更新信息 JSON:current / latest / min / channel / need_update / force_update / download_url / file_hash / file_size / self_file_hash / self_file_size / changelog
Nebula_SelfIntegrityCheck(h)DLL 自身完整性:计算 DLL 文件 SHA256 与字节数,与服务端在当前版本下登记的 self_file_hash / self_file_size 比对;返回 0=未登记跳过 / 1=通过 / 2=失败(lastError=-20)。注意:服务端登记值即版本管理里的客户端文件哈希(self_file_hash 复用 file_hash,一份登记两用);DLL 场景默认不登记 DLL 哈希 → 返回 0 自动跳过,不误拦
Nebula_DownloadUpdate(h, dir, insecure, out, size)下载宿主更新包并强制校验:未登记 file_hash 拒绝(-21);file_size > 0 时叠加大小校验;仅 https(http 需 allow_insecure=1 显式放行);先写 .tmp 再改名,避免半包被宿主误用;dir 传 NULL 默认保存到宿主 exe 所在目录。DLL 不自替换——拿到 out_path 由宿主完成解压/替换/重启
Nebula_SetUseSystemProxy(h, enable)默认 0=直连(对齐 C++ SDK 防代理注入抓包);企业内网传 1;localhost 永远直连

5.7 内置提示与自定义 UI

函数说明
Nebula_ShowErrorBox(h, hwnd)失败时弹出「[错误码] 描述」红色错误框;成功时(lastError=0)不弹框直接返回
Nebula_ShowResultBox(h, hwnd)弹出上次操作 JSON 结果框(成功绿色 / 失败红色)
Nebula_SetUICallback(h, cb, data)自定义提示回调(void __stdcall cb(const char* title, const char* msg, int is_error, void* user)),NULL 恢复系统 MessageBox

提示框标题自动使用 Init 下发的软件名称——后台改软件名即生效,无需改代码重编译。

6. 错误码

DLL 内部错误(负数)

码宏含义
0NEBULA_OK成功
-1INVALID_HANDLE无效句柄
-2INVALID_ARG无效参数
-3NOT_INIT未初始化
-4 / -5 / -6NETWORK / TIMEOUT / HTTP网络 / 超时 / HTTP 错误
-7 / -8JSON / CRYPTOJSON 解析 / 加解密错误
-9BUFFER_SMALL缓冲区不足(结果截断)
-10INTERNAL内部错误
-11 / -12NOT_LOGGED_IN / SESSION_EXPIRED未登录 / 会话过期
-20 / -21—完整性校验失败 / 更新包校验拒绝

服务端业务码(正数,与 HTTP 接口一致)

码含义码含义
1001参数错误3001~3004卡密不存在 / 已用 / 作废 / 过期
1002 / 1003未登录 / 令牌过期4001 / 4002 / 4004设备超限 / 未绑定 / 已拉黑
1004app_key 无效或停用5001 / 5002限流 / 签名校验失败
2001~2004密码错误 / 封禁 / 锁定 / 待激活6001 / 6002 / 9999版本过低强更 / 维护中 / 服务器内部错误

7. 易语言接入示例

DLL 命令声明(32 位):

易语言
.版本 2
.DLL命令 Nebula_Create, 整数型, "NebulaSDK_x86.dll", "Nebula_Create"
.DLL命令 Nebula_Destroy, , "NebulaSDK_x86.dll", "Nebula_Destroy"
    .参数 handle, 整数型
.DLL命令 Nebula_SetServer, 整数型, "NebulaSDK_x86.dll", "Nebula_SetServer"
    .参数 handle, 整数型
    .参数 server_url, 文本型
.DLL命令 Nebula_SetAppKey, 整数型, "NebulaSDK_x86.dll", "Nebula_SetAppKey"
    .参数 handle, 整数型
    .参数 app_key, 文本型
.DLL命令 Nebula_Handshake, 整数型, "NebulaSDK_x86.dll", "Nebula_Handshake"
    .参数 handle, 整数型
.DLL命令 Nebula_Init, 整数型, "NebulaSDK_x86.dll", "Nebula_Init"
    .参数 handle, 整数型
.DLL命令 Nebula_LoginPassword, 整数型, "NebulaSDK_x86.dll", "Nebula_LoginPassword"
    .参数 handle, 整数型
    .参数 username, 文本型
    .参数 password, 文本型
.DLL命令 Nebula_GetResult, 整数型, "NebulaSDK_x86.dll", "Nebula_GetResult"
    .参数 handle, 整数型
    .参数 buffer, 文本型
    .参数 buffer_size, 整数型
.DLL命令 Nebula_ShowErrorBox, 整数型, "NebulaSDK_x86.dll", "Nebula_ShowErrorBox"
    .参数 handle, 整数型
    .参数 hwnd, 整数型

调用:

易语言
handle = Nebula_Create ()
Nebula_SetServer (handle, "https://your-server.com")
Nebula_SetAppKey (handle, "YOUR_APP_KEY")
.如果 (Nebula_Handshake (handle) = 0)
    Nebula_Init (handle)
    .如果 (Nebula_LoginPassword (handle, "user", "pass") = 0)
        result = 取空白文本 (16384)
        Nebula_GetResult (handle, result, 16384)
        Nebula_SetAutoHeartbeat (handle, 1, 0)    ' v2.2+ 内置心跳,免时钟循环
        Nebula_Logout (handle)
    .否则
        Nebula_ShowErrorBox (handle, 0)           ' 失败直接弹框
    .如果结束
.否则
    Nebula_ShowErrorBox (handle, 0)
.如果结束
Nebula_Destroy (handle)

8. C# / Python 调用提示

C#(P/Invoke):[DllImport("NebulaSDK_x86.dll", CallingConvention = CallingConvention.StdCall)];字符串参数用 string(CharSet.Ansi),输出缓冲用 StringBuilder;句柄用 IntPtr。注意 AnyCPU 目标需在项目属性里固定「首选 32 位」或分别编译 x86/x64 两版,保证与 DLL 架构一致。

Python(ctypes):ctypes.WinDLL("NebulaSDK_x86.dll")(__stdcall 对应 WinDLL);句柄 c_void_p;字符串入参传 bytes(UTF-8),出参用 ctypes.create_string_buffer(16384) 后 .value.decode("utf-8")。

全部参数均为 UTF-8:C# 非 ASCII 内容需先转 UTF-8;Python 传 "中文".encode("utf-8")。

9. 加固与加壳

  • Release 构建已内置:符号隐藏、字符串合并、COMDAT 折叠、全程序优化、无 PDB(PostBuild 删除 .exp/.pdb)、PE 校验和
  • 加载时反调试(仅 Release):IsDebuggerPresent / CheckRemoteDebuggerPresent / PEB NtGlobalFlag 三层,命中即加载失败(不用 TerminateProcess,更难定位)
  • 敏感内存清零:握手后清 ECDH 私钥与共享密钥、Feature 解密后清密钥副本、Logout 清 feature_key、Destroy 清全部会话密钥
  • 外层加壳:可对宿主 exe 使用 VMProtect / Themida 正常加壳;对 NebulaSDK_*.dll 本体建议保持原样(内部已加固,且壳可能破坏 DLL 的 TLS / 导入表导致加载失败;如必须加壳,请先用 Nebula_SelfIntegrityCheck 场景回归测试)
  • DLL 自校验默认不启用:版本管理登记的哈希即客户端 exe 的哈希(一份登记两用:更新下载校验 + 宿主自校验),不登记 DLL 哈希;Nebula_SelfIntegrityCheck 未登记时返回 0 自动跳过,调用方无需处理
  • 安全设计原则:DLL 不持有任何长期秘密(签名私钥只在服务端);不做本地授权判断(授权全部由服务端决定);即使 DLL 被完全逆向也无法伪造服务器响应(ES256 签名);即使 DLL 被 patch 也无法获得服务器权限(服务端最终判定);AppKey 是软件标识而非秘密凭证,泄露无碍协议安全

10. 常见问题

  • 线程安全:内部互斥锁保护,所有 API 可跨线程调用同一 handle;高并发场景会被锁串行化,避免大量并发调用
  • 缓冲区:GetResult ≥16KB、GetLastErrorMessage ≥1KB、DecryptFeature ≥8KB;不足会被截断(返回实际写入字节数)
  • 内存管理:SDK 与调用方之间不传递动态分配指针,输出全部走调用方缓冲区,无需也不应释放 SDK 返回的数据
  • 超时:连接 / 发送 10 秒,接收 30 秒
  • HTTPS 证书:DLL 默认不校验 SSL 证书(兼容自签 / 调试);但只要调用了 Nebula_SetRespSignKey,ES256 签名验证即保证响应真实性——SSL 校验可忽略,签名验证不可忽略
  • 密钥安全:DLL 不提供任何读取内部密钥的接口;会话密钥 / ECDH 私钥 / feature_key 仅内部使用
  • 架构不匹配:LoadLibrary 失败最常见原因——32 位程序配 x86 DLL,64 位配 x64
  • 提示框标题:未 Init 或 Init 失败时用默认「Nebula SDK」;正常流程下自动用服务端软件名