Skip to content

通达信 DLL 加密实战

通达信公式(.tni / .dll)可通过 DLL 函数调用外部逻辑。本教程演示如何在 C++ DLL 内部接入 A7验证,让你的有偿指标「未授权不可用」。

思路

通达信公式本身明文,无法藏逻辑;把校验放进 DLL,公式只调用 MyIndicator(...)。DLL 在首次调用时完成卡密登录,未授权直接返回 0 / 空值。

一、DLL 导出函数约定

通达信要求 DLL 导出形如 int PluginFun(int DataLen, int Arg1, ...) 的函数。我们用一个函数承载「授权校验 + 指标计算」:

cpp
extern "C" __declspec(dllexport)
int __stdcall CheckAuth(int DataLen, char* card, char* mac) {
    // 1) 卡密登录
    A7Client client("150018", "YOUR_APP_KEY");
    std::map<std::string,std::string> params = {
        {"Card", card}, {"Mac", mac}
    };
    std::string resp = client.call("SingleLogin", params);
    // 2) 解析 code/data.token;失败返回 0
    if (authOk(resp)) {
        cacheToken(resp);
        return 1; // 已授权
    }
    return 0; // 未授权
}

extern "C" __declspec(dllexport)
double __stdcall MyIndicator(int DataLen, float* h, float* l, float* o, float* c, int arg) {
    if (!hasValidToken()) return 0.0;   // 未授权返回空
    // ... 你的指标算法 ...
    return result;
}

二、在公式里调用

text
AUTH := DLL1(1, '6PCG-ZRSZ-EX83-YBEH', MACSTR);
MYIDX := DLL1(2, H, L, O, C, 0);
DRAWLINE(AUTH=1, MYIDX, ...);

三、机器码怎么来

通达信 DLL 运行在用户机器上,可用 GetVolumeInformation 取盘符序列号,或取网卡 MAC 作为 Mac。详细方法见 设备指纹与硬件绑定

四、注意事项

  • 不要把 AppKey 写死在 DLL 明文段:用字符串混淆或运行时拼装,降低被逆向提取风险。
  • Token 缓存:首次登录成功后在内存缓存 token,后续指标函数只验证 token + 周期心跳,避免每次计算都请求网络。
  • 心跳:在 DLL 里起一个后台线程,每 5 分钟 UserHeartbeatType=card)。详见 心跳保活机制
  • 离线宽限:用户断网时按 离线授权与宽限期 给短暂宽限,避免指标闪断。

五、C++ SDK 参考

DLL 里的 A7Client 可直接复用 C++ SDKrc4Hex / md5 / call 实现(需补 JSON 解析,建议用 nlohmann/json)。

相关链接

A7验证 · 软件授权与网络验证平台