通达信 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 分钟
UserHeartbeat(Type=card)。详见 心跳保活机制。 - 离线宽限:用户断网时按 离线授权与宽限期 给短暂宽限,避免指标闪断。
五、C++ SDK 参考
DLL 里的 A7Client 可直接复用 C++ SDK 的 rc4Hex / md5 / call 实现(需补 JSON 解析,建议用 nlohmann/json)。