神烦论坛

 找回密码
 立即注册
查看: 4253|回复: 1

【TC版】注册码V2之开放式通信【防破解必看】

[复制链接]

96

主题

220

帖子

1395

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1395
发表于 2016-11-14 17:25:23 | 显示全部楼层 |阅读模式

注册码V2之开放式通信【防破解必看】


这次为大家带来一个新的通信方式,此通信是注册码V2新增的开放式通信,作者完全可以在注册码V2的基础上新增各种各样的功能。这样也能避免破@解的人找到注册码V2的特征,从而导致你的脚本被破@解。我们在不断的开放一些功能,让大家可以更加灵活自主的管理自己软件,让大家可以更好的去实现防破@解,但是更多的还要作者自己去重写这些接口,以达到独一无二!

以下将以项目的获取自定义数据为例,来讲解这个内容!

1、安装或者更新到最新的注册码V2应用。

最新的注册码V2里,在文件目录,我们会发现多了一个文件:【自定义功能.t】,这个里面有默认的代码,主要是供大家学习使用。
40.png

此代码为默认的代码



2、在
自定义功能.t文件里添加自己的加密代码。以下我们就可以在这个代码的基础修改,把自己想要做的操作都在这里实现即可,这里我们就来用自己的加密算法为项目自定义数据加密,代码如下:
  1. //此功能为高级功能,需要懂得百宝云语法基础
  2. //此功能为高级功能,需要懂得百宝云语法基础

  3. //此文件为用户扩展自定义接口,修改源码必须要重启云应用,否则本文件中的代码不会重新生效
  4. //此文件为用户扩展自定义接口,修改源码必须要重启云应用,否则本文件中的代码不会重新生效
  5. //请注意,一定要语法正确,语法不正确云应用无法正常启动
  6. //请注意,一定要语法正确,语法不正确云应用无法正常启动
  7. //请注意,一定要语法正确,语法不正确云应用无法正常启动
  8. //请注意,一定要语法正确,语法不正确云应用无法正常启动
  9. //参数说明:
  10. //arg   _commoninterface事件,_get事件,_post事件对应的 arg参数值
  11. //      arg内容格式必须为json格式或者百宝云数组格式
  12. //      数据格式举例说明:
  13. //      json格式: {"flag":"abc","data":"456"}
  14. //      百宝云数组格式: array("flag"="abc","data":"456")


  15. function custom_interface(arg)
  16.         //自定义代码处
  17.         //-----------演示代码-----------
  18.         变量 paramArr = 字符串转数组(arg)
  19.         如果(!是否数组(paramArr))
  20.                 paramArr = json转数组(arg)
  21.                 如果(!是否数组(paramArr))
  22.                         返回 "错误的参数列表"
  23.                 结束
  24.         结束
  25.         select(paramArr["flag"])
  26.                 case "动态安全策略"
  27.                         var 注册码 = paramArr["注册码"]
  28.                         var 项目名称 = paramArr["项目名称"]
  29.                         var key = paramArr["key"]
  30.                         var ret = ""
  31.                         if(!exec(strformat("SELECT * FROM 项目键值管理表 where 项目名称='%s' and 键 = '%s'", 项目名称,key), ret))
  32.                                 return "操作失败:查询项目信息失败"//生成出错
  33.                         end
  34.                         return 云端加密(ret[0]["值"],paramArr["data"],矩阵)

  35.         end
  36.         //-----------演示代码-----------

  37.         return "未知请求"
  38. end

  39. var 矩阵 = array(array("L", "3", "P", "g", ";", "<", "a", "L", "K", "5"), array("Z", "6", "s", "p", "=", "0", "_", "u", "G", "G"), array("F", "A", "I", "K", "C", "y", "e", "7", "=", "0"), array("1", "7", "H", "@", "c", "F", "E", "`", "d", "8"), array("s", "i", "D", "5", "Y", "^", "@", "s", "F", "r"), array("M", "]", "p", "z", "e", "U", "u", "_", "5", "["), array("_", "b", "@", "l", "V", "t", "^", "H", "0", "e"), array("0", "e", "5", "1", "5", "d", "O", "g", "N", "R"), array("Y", "g", "Z", "G", "J", "s", ">", "W", "<", "a"), array("f", "J", "s", "r", "X", "f", "p", "M", "3", ">"))


  40. function 云端加密(数据, 密钥, 矩阵1)
  41.         var 密钥1 = ""
  42.         var key1 = ""
  43.         for(var i = 0;i < 8;i = i + 2)
  44.                 var a = strsub(密钥, i, i + 1)
  45.                 var b = strsub(密钥, i + 1, i + 2)
  46.                 filelog(strformat("密钥[%s][%s] = %s", a, b, 矩阵1[a][b]))
  47.                 key1 = key1&矩阵1[a][b]
  48.         end
  49.         var 标识 = strsub(密钥, strlen(密钥) - 4, strlen(密钥))
  50.         select(标识)
  51.                 case 1561
  52.                         return aesencrypt(数据, key1)
  53.                 case 2802
  54.                         return desencrypt(数据, key1)
  55.                 case 7463
  56.                         return teaencrypt(数据, key1)
  57.                 case 1684
  58.                         return rc2encrypt(数据, key1)
  59.                 case 5525
  60.                         return rc5encrypt(数据, key1)
  61.                 case 6436
  62.                         return rc6encrypt(数据, key1)
  63.                 default
  64.                         return 数据
  65.         end
  66. end


  67. //执行sql语句,并返回结果
  68. //如果 db_name 为空表示使用 全局数据名称
  69. function exec(sql, &out_arr = "", db_name = "5112_regCodeV2")
  70.         var ret_arr
  71.         if(!mysqlsqlarray(db_name, sql, ret_arr))
  72.                 var error = getlasterror(1)
  73.                 数据库错误日志(sql&"\n错误信息:"&error)
  74.                 return false
  75.         end
  76.         out_arr = ret_arr
  77.         return true
  78. end


  79. function 数据库错误日志(str)
  80.         filelog(timenow()&" "&str, "数据库错误日志")
  81. end
复制代码

注意:修改代码了之后,记得一定要重启云应用!记得一定要重启云应用!记得一定要重启云应用!(重要的事情说三遍)


3、本地客户端通信注册码V2,获取自定义数据。

这里就不需要使用注册码V2提供的COM或者DLL去访问了,直接使用原生态的接口访问即可。
以下以TC为例,使用 commoninterface接口通信。
关键代码段如下:
  1. 功能 自定义功能示例_初始化()
  2.     //这里添加你要执行的代码
  3.     DLL初始化()
  4.     注册码初始化("5f3412f705f91cebaac1c8a95a7cf64d", "测试项目")
  5. 结束
复制代码
注册码V2的项目初始化。必须要调用的。

测试按钮的功能实现代码:

  1. 功能 按钮3_点击()
  2.     //这里添加你要执行的代码
  3.     var 云端返回, 密钥
  4.     自定义加密("key1", 云端返回, 密钥)
  5.     traceprint("密钥: " & 密钥)
  6.     var ret = 自定义解密(云端返回, 密钥)
  7.     traceprint(ret)
  8. 结束
复制代码

以下为自定义加密与解密的代码,此代码必须与注册码V2里的自定义功能里的加密解密一致,否则会导致加密的数据无法解密出来。下面是代码:
  1. var 矩阵 = array(array("L", "3", "P", "g", ";", "<", "a", "L", "K", "5"), array("Z", "6", "s", "p", "=", "0", "_", "u", "G", "G"), array("F", "A", "I", "K", "C", "y", "e", "7", "=", "0"), array("1", "7", "H", "@", "c", "F", "E", "`", "d", "8"), array("s", "i", "D", "5", "Y", "^", "@", "s", "F", "r"), array("M", "]", "p", "z", "e", "U", "u", "_", "5", "["), array("_", "b", "@", "l", "V", "t", "^", "H", "0", "e"), array("0", "e", "5", "1", "5", "d", "O", "g", "N", "R"), array("Y", "g", "Z", "G", "J", "s", ">", "W", "<", "a"), array("f", "J", "s", "r", "X", "f", "p", "M", "3", ">"))
  2. var Rnd = array(1561, 2802, 7463, 1684, 5525, 6436)

  3. function 自定义加密(key, &result, &data1)
  4.     var arg = array()
  5.     arg["flag"] = "动态安全策略"
  6.     arg["注册码"] = 全局_注册码
  7.     arg["项目名称"] = 全局_项目名称
  8.     arg["key"] = key
  9.    
  10.     var data = ""
  11.     for(var i = 0; i < 8; i++)
  12.         data = data & rnd(0, 9)
  13.     end
  14.    
  15.     data = data & Rnd[rnd(0, 5)]
  16.     data1 = data
  17.     arg["data"] = data
  18.     var ret_buff = MyCommoninterface(arg)
  19.     result = ret_buff
  20.     traceprint(result)
  21. end

  22. function 自定义解密(数据, 密钥)
  23.     var 密钥1 = ""
  24.     var key1 = ""
  25.     for(var i = 0; i < 8; i = i + 2)
  26.         var a = strsub(密钥, i, i + 1)
  27.         var b = strsub(密钥, i + 1, i + 2)
  28.         traceprint(strformat("密钥[%s][%s] = %s", a, b, 矩阵[a][b]))
  29.         key1 = key1 & 矩阵[a][b]
  30.     end
  31.     var 标识 = strsub(密钥, strlen(密钥) - 4, strlen(密钥))
  32.     select(标识)
  33.         case 1561
  34.         return Aes解密(数据, key1)
  35.         case 2802
  36.         return Des解密(数据, key1)
  37.         case 7463
  38.         return Tea解密(数据, key1)
  39.         case 1684
  40.         return Rc2解密(数据, key1)
  41.         case 5525
  42.         return Rc5解密(数据, key1)
  43.         case 6436
  44.         return Rc6解密(数据, key1)
  45.         default
  46.         return 数据
  47.     end
  48. end
复制代码


MyCommoninterface 函数封装
//请注意一定要使用最新版的dll
  1. function Commoninterface(str)
  2.     var result
  3.     变量 ret = 动态库调用(全局_DLL路径, "long", "CommonInterfaceW", "wchar *", str, "pwchar *", result, "long", 1024 * 10)
  4.     返回 result
  5. end
复制代码



算法不是太难,只是为大家提供了一个思路,那么大家就可以在此基础上更改了!




测试结果如下图所示:
41.png

获取到的密文通过自己的解密算法,把密文解密回来了,效果还不错!






总结:
通过这样的方式,我们就可以跳过注册码V2提供的获取自定义数据接口,来实现自己的方法获取,同时,你还可以利用此接口操作自己的数据库,或者是与其他应用通信等等,只有你想不到,没有你做不到的功能!
所以此方式才叫 注册码V2之开放式通信。




结尾
好了,大家如果觉得注册码V2不够完善,那么可以通过上面的接口自己去实现,也可以提交需求给Abin老师,老师会抽时间根据需求增加!不过还是建议大家自己实现,毕竟这样就成为自己独一无二的功能了!
下面附带示例源码下载!






【TC版】注册码V2系列教程总汇:   http://bbs.91shenfan.com/thread-435-1-1.html
回复

使用道具 举报

0

主题

5

帖子

40

积分

一级圣斗士

Rank: 1

积分
40
发表于 2018-11-5 14:05:01 | 显示全部楼层
  1. 功能 自定义功能示例_初始化()
  2.     //这里添加你要执行的代码
  3.     DLL初始化()
  4.     注册码初始化("5f3412f705f91cebaac1c8a95a7cf64d", "测试项目")
  5. 结束
复制代码

这里的DLL初始化具体是指什么的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|神烦论坛 ( 苏ICP备18043773号 )

GMT+8, 2024-12-22 10:51

Powered by bby! X3.4

© 2015-2024 baibaoyun

快速回复 返回顶部 返回列表