|
注册码V2之开放式通信【防破解必看】
这次为大家带来一个新的通信方式,此通信是注册码V2新增的开放式通信,作者完全可以在注册码V2的基础上新增各种各样的功能。这样也能避免破@解的人找到注册码V2的特征,从而导致你的脚本被破@解。我们在不断的开放一些功能,让大家可以更加灵活自主的管理自己软件,让大家可以更好的去实现防破@解,但是更多的还要作者自己去重写这些接口,以达到独一无二!
以下将以项目的获取自定义数据为例,来讲解这个内容!
1、安装或者更新到最新的注册码V2应用。
最新的注册码V2里,在文件目录,我们会发现多了一个文件:【自定义功能.t】,这个里面有默认的代码,主要是供大家学习使用。
此代码为默认的代码
2、在自定义功能.t文件里添加自己的加密代码。以下我们就可以在这个代码的基础修改,把自己想要做的操作都在这里实现即可,这里我们就来用自己的加密算法为项目自定义数据加密,代码如下:
- //此功能为高级功能,需要懂得百宝云语法基础
- //此功能为高级功能,需要懂得百宝云语法基础
- //此文件为用户扩展自定义接口,修改源码必须要重启云应用,否则本文件中的代码不会重新生效
- //此文件为用户扩展自定义接口,修改源码必须要重启云应用,否则本文件中的代码不会重新生效
- //请注意,一定要语法正确,语法不正确云应用无法正常启动
- //请注意,一定要语法正确,语法不正确云应用无法正常启动
- //请注意,一定要语法正确,语法不正确云应用无法正常启动
- //请注意,一定要语法正确,语法不正确云应用无法正常启动
- //参数说明:
- //arg _commoninterface事件,_get事件,_post事件对应的 arg参数值
- // arg内容格式必须为json格式或者百宝云数组格式
- // 数据格式举例说明:
- // json格式: {"flag":"abc","data":"456"}
- // 百宝云数组格式: array("flag"="abc","data":"456")
- function custom_interface(arg)
- //自定义代码处
- //-----------演示代码-----------
- 变量 paramArr = 字符串转数组(arg)
- 如果(!是否数组(paramArr))
- paramArr = json转数组(arg)
- 如果(!是否数组(paramArr))
- 返回 "错误的参数列表"
- 结束
- 结束
- select(paramArr["flag"])
- case "动态安全策略"
- var 注册码 = paramArr["注册码"]
- var 项目名称 = paramArr["项目名称"]
- var key = paramArr["key"]
- var ret = ""
- if(!exec(strformat("SELECT * FROM 项目键值管理表 where 项目名称='%s' and 键 = '%s'", 项目名称,key), ret))
- return "操作失败:查询项目信息失败"//生成出错
- end
- return 云端加密(ret[0]["值"],paramArr["data"],矩阵)
- end
- //-----------演示代码-----------
- return "未知请求"
- end
- 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", ">"))
- function 云端加密(数据, 密钥, 矩阵1)
- var 密钥1 = ""
- var key1 = ""
- for(var i = 0;i < 8;i = i + 2)
- var a = strsub(密钥, i, i + 1)
- var b = strsub(密钥, i + 1, i + 2)
- filelog(strformat("密钥[%s][%s] = %s", a, b, 矩阵1[a][b]))
- key1 = key1&矩阵1[a][b]
- end
- var 标识 = strsub(密钥, strlen(密钥) - 4, strlen(密钥))
- select(标识)
- case 1561
- return aesencrypt(数据, key1)
- case 2802
- return desencrypt(数据, key1)
- case 7463
- return teaencrypt(数据, key1)
- case 1684
- return rc2encrypt(数据, key1)
- case 5525
- return rc5encrypt(数据, key1)
- case 6436
- return rc6encrypt(数据, key1)
- default
- return 数据
- end
- end
- //执行sql语句,并返回结果
- //如果 db_name 为空表示使用 全局数据名称
- function exec(sql, &out_arr = "", db_name = "5112_regCodeV2")
- var ret_arr
- if(!mysqlsqlarray(db_name, sql, ret_arr))
- var error = getlasterror(1)
- 数据库错误日志(sql&"\n错误信息:"&error)
- return false
- end
- out_arr = ret_arr
- return true
- end
- function 数据库错误日志(str)
- filelog(timenow()&" "&str, "数据库错误日志")
- end
复制代码
注意:修改代码了之后,记得一定要重启云应用!记得一定要重启云应用!记得一定要重启云应用!(重要的事情说三遍)
3、本地客户端通信注册码V2,获取自定义数据。
这里就不需要使用注册码V2提供的COM或者DLL去访问了,直接使用原生态的接口访问即可。
以下以TC为例,使用 commoninterface接口通信。
关键代码段如下:
- 功能 自定义功能示例_初始化()
- //这里添加你要执行的代码
- DLL初始化()
- 注册码初始化("5f3412f705f91cebaac1c8a95a7cf64d", "测试项目")
- 结束
复制代码 注册码V2的项目初始化。必须要调用的。
测试按钮的功能实现代码:
- 功能 按钮3_点击()
- //这里添加你要执行的代码
- var 云端返回, 密钥
- 自定义加密("key1", 云端返回, 密钥)
- traceprint("密钥: " & 密钥)
- var ret = 自定义解密(云端返回, 密钥)
- traceprint(ret)
- 结束
复制代码
以下为自定义加密与解密的代码,此代码必须与注册码V2里的自定义功能里的加密解密一致,否则会导致加密的数据无法解密出来。下面是代码:
- 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", ">"))
- var Rnd = array(1561, 2802, 7463, 1684, 5525, 6436)
- function 自定义加密(key, &result, &data1)
- var arg = array()
- arg["flag"] = "动态安全策略"
- arg["注册码"] = 全局_注册码
- arg["项目名称"] = 全局_项目名称
- arg["key"] = key
-
- var data = ""
- for(var i = 0; i < 8; i++)
- data = data & rnd(0, 9)
- end
-
- data = data & Rnd[rnd(0, 5)]
- data1 = data
- arg["data"] = data
- var ret_buff = MyCommoninterface(arg)
- result = ret_buff
- traceprint(result)
- end
- function 自定义解密(数据, 密钥)
- var 密钥1 = ""
- var key1 = ""
- for(var i = 0; i < 8; i = i + 2)
- var a = strsub(密钥, i, i + 1)
- var b = strsub(密钥, i + 1, i + 2)
- traceprint(strformat("密钥[%s][%s] = %s", a, b, 矩阵[a][b]))
- key1 = key1 & 矩阵[a][b]
- end
- var 标识 = strsub(密钥, strlen(密钥) - 4, strlen(密钥))
- select(标识)
- case 1561
- return Aes解密(数据, key1)
- case 2802
- return Des解密(数据, key1)
- case 7463
- return Tea解密(数据, key1)
- case 1684
- return Rc2解密(数据, key1)
- case 5525
- return Rc5解密(数据, key1)
- case 6436
- return Rc6解密(数据, key1)
- default
- return 数据
- end
- end
复制代码
MyCommoninterface 函数封装
//请注意一定要使用最新版的dll
- function Commoninterface(str)
- var result
- 变量 ret = 动态库调用(全局_DLL路径, "long", "CommonInterfaceW", "wchar *", str, "pwchar *", result, "long", 1024 * 10)
- 返回 result
- end
复制代码
算法不是太难,只是为大家提供了一个思路,那么大家就可以在此基础上更改了!
测试结果如下图所示:
获取到的密文通过自己的解密算法,把密文解密回来了,效果还不错!
总结:
通过这样的方式,我们就可以跳过注册码V2提供的获取自定义数据接口,来实现自己的方法获取,同时,你还可以利用此接口操作自己的数据库,或者是与其他应用通信等等,只有你想不到,没有你做不到的功能!
所以此方式才叫 注册码V2之开放式通信。
结尾
好了,大家如果觉得注册码V2不够完善,那么可以通过上面的接口自己去实现,也可以提交需求给Abin老师,老师会抽时间根据需求增加!不过还是建议大家自己实现,毕竟这样就成为自己独一无二的功能了!
下面附带示例源码下载!
【TC版】注册码V2系列教程总汇: http://bbs.91shenfan.com/thread-435-1-1.html
|
|