|
本帖最后由 痛恨一生 于 2015-6-13 22:48 编辑
七.注册机制
1.简单注册原理在易语言安装后的程序“\e\lib\krnln\samples\软件注册.e”就是演示了软件注册的原理。
其中有一个子程序是重复取硬件码的,存在取硬件码失败的情况,因此要重复多取几次,如果取失败就用一个默认的硬件码代替。这个大家一定要看一看,
注册机的原理就是:用户在使用过软件一段时间后,认为软件较为理想,要求向作者注册,而此软件中提供了用户本机上的硬件号,用户将此硬件号发给作者,作者给出一个注册码,用户拿到此注册码后填写,软件就注册成功。注册码的计算是由硬件号产生的,计算过程只有作者知道。
例如:用户机器上的硬件号为34,作者返回的注册码为1904。用户在注册码输入栏中输入1904,那么注册成功。作者是这样计算的,34X56=1904。那么软件中也是这样计算的。以上介绍的只是例子,大家也许会说,从1输到9999,总有一个会遇上的,但事实是硬件码不会这样简单,可以是16进制的,而计算也不会这么简单,可能会用上矩阵也说不定,因此相比较而言,靠猜测的方法去破J是愚蠢的。
下面看一下易语言自带例程中的程序代码,此为要求用户输入注册码时的判断语句:
此为判断语句调用的返回注册码的子程序:
通过以上检查是否输入的硬件码与注册码对映。
而软件作者手上有一个注册机,可以生成此硬件代码,大家可以在此例程上加一个按钮,此按钮的代码如下:
这样作者就可以很轻松地得到注册码,然后将这个注册码发给用户用于注册了。
上述只是在一个理想的状态中实现的,即没有奸人对你的软件进行破J。如果奸人看上了你的软件,只靠这么简单的方法,那么一定会吃大亏的。因此大家在注册码生成的计算上要想尽一切办法使之复杂化,如:采用位异,采用加上计算数值,采用……有些办法将在后面章节中进行介绍。
2.RSA算法注册①RSA简介
使用RSA非对称密钥算法对指定字节集数据进行签署,支持32到4096之间任意合法的RSA位数,返回签署后的结果文本。
说明一,电子签名系统简要实现方法:
首先给所有具有签署权利的人员授予不同的RSA钥匙,RSA钥匙由“公钥”、“私钥”、“公共模数”三部分组成,为了生成符合要求的随机密钥,可以下载使用 http://dywt.com.cn/RSATool2v14.rar 第三方工具软件(内有操作说明)。然后将所有人员的“公钥”和“公共模数”成对向外公布,“私钥”由被授予人员自行妥善保管。
被授权人员使用“私钥”和“公共模数”对指定数据进行签署,然后将签署后的结果文本随同被签署数据一起发送,接收者收到后,使用该签署者公开的“公钥”和“公共模数”及签署结果文本对被签署数据进行验证,如验证通过则说明该数据必定是此签署者所认可的,且没有经过任何篡改。
说明二,数字签名用作软件注册系统的实现步骤:
1、欲注册用户提供注册信息(如硬件代码、用户姓名等);
2、软件作者使用自己的私钥对该注册信息进行数字签署得到签署结果文本;
3、将此签署结果文本作为注册钥匙文件发送给用户;
4、在用户端的软件使用相同的用户信息、注册钥匙文件及软件作者的公钥进行签名验证,如果通过表明已经注册,否则表示未注册。使用本方法在私钥未泄露的前提下,可以绝对避免破J者做出软件的注册机。
②RSA工具使用简介
RSATool工具运行界面如下图所示:
有很多人说RSA工具不会用,其实RSA工具的使用方法吴涛已说明得非常清楚了。下面引用吴涛说明书的原文:
吴涛写的RSATool工具使用说明书如下:
RSATool 2.14 工具软件使用指南:
(软件下载地址:http://eyuyan.com/RSATool2v14.rar)
为了生成符合要求的随机RSA密钥,请类似如下操作:
1、在“Number Base”组合框中选择进制为 10 ;
2、单击“Start”按钮,然后随意移动鼠标直到提示信息框出现,以获取一个随机数种子;
3、在“KeySize(Bits)”编辑框中输入 32 ;
4、单击“Generate”按钮生成;
5、复制“Prime(P)”编辑框中的内容到“Public Exp.(E)”编辑框;
6、在“Number Base”组合框中选择进制为 16 ;
7、记录下“Prime(P)”编辑框中的十六进制文本内容。
8、再次重复第 2 步;
9、在“KeySize(Bits)”编辑框中输入您所希望的密钥位数,从32到4096,位数越多安全性也高,但运算速度越慢,一般选择1024位足够了;
10、单击“Generate”按钮生成;
11、单击“Test”按钮测试,在“Message to encrypt”编辑框中随意输入一段文本,然后单击“Encrypt”按钮加密,再单击“Decrypt”按钮解密,看解密后的结果是否和所输入的一致,如果一致表示所生成的RSA密钥可用,否则需要重新生成;
12、到此生成完成,“Private Exp.(D)”编辑框中的内容为私钥,第7步所记录的内容为公钥,“Modulus (N)”编辑框中的内容为公共模数,请将上述三段十六进制文本保存起来即可。
|
③一个简单的RSA注册机
例如:我们已通过上述RSA工具得到以下三个变量:
公钥:
20063
私钥:
7FC4638275AF6B27AFD040FED32A941D227154ECDE37ABFF73D72DB50F9FC70C75BC3AF0EC26016BC706D953A9C5D6831E0DDD27B42A182CB92A6E426693511E42EB0BF9D64459809D5EC305E13B2A85BA004BA934232305D3DA1205E7AD1D01744BBCF286B23D64CC68371FDD39DAA43861920DA3DE5F9335A77983BFD08A83
公共模数:
CEB774FCCE9DB84A4452A0774264FC55F35A8D8AA9D1FC5EBD3E0880B7B62A4EF834FD6E855CD84A4D04F3BBDE32180FC3EE45AB5582C2320A6575C6ECF923A24EAF59F22F930631347E0E3B0477A89FCE22FE741F5053EC5320AAF6489CC407056361F01E031A02DB52CB0CBDFBB11F72C340354C6CAB78D97630EB8A6A5431
初始化代码如下:
注册窗口设计界面如下:
注册按钮代码如下:
上面的程序窗口插在用户的程序中,当需要注册时即弹出注册。
作者手中的注册机软件界面如下:(注意保密)
生成按钮代码如下:(注意保密)
上述程序已在易语言4.0中运行通过。运行抓图如下所示:
加密第7定理:RSA算法虽然很强,但弱在钥匙文件如何保密上。
④算法实现中的注意事项
上述代码中取硬件码的命令没有采用重复取,而只取了一次,在实际操作中需要正规地多取几次,获取硬件码失败也要作相应的默认处理。并且硬件码好要转换为另一串字符串。
上述代码中所有字串均未作分解处理,实际编程中需要分解,且分别隐藏到程序各处。最好也加上密。
上述代码中注册码文本较长,可直接读取一个文本文件进行比较。即生成的注册码存在一个文本文件中,在点击注册按钮后,直接找这个文本文件的内容进行对比。文本文件的文件名可以是硬件号的名称。
上述是基本算法演示,其中的注册算法还可以再进行加工,变得更复杂一些。
上述中注有(注意保密)字样的代码与程序需要软件作者严格保密,不对外公开。
大家再看一个易语言大奖赛获奖作品:“家电维修”的例子,大家也可以在易语言新建窗口中找到这个程序,看看注册窗口的代码吧,如果您按这样的做法去发布软件,会有什么安全性可言呢。
⑤设计RSA的变形算法
重要提示:上述是对RSA整体进行一次性验证,虽说RSA是一个非常强的加密算法,但是这样的算法太简单,很容易被破J,那么需要通过以下的方法进行变形。以下所举的例子只是一个参考,你自己的方法越古怪越变态越好。
例如,可以采用分解RSA算法,每次只验证一小部分,以保证在程序的各个地方进行不同种类的验证,返回的值有的可设计为数值型,有的可设计为逻辑形,以利于在程序中不同地方调用,调用后可以根据数据进行运算,如果是破J版,那么使用破J版的人得出的结果一定是错误的。采用双RSA密匙、多RSA码也是个好办法,但最好两者之间再混合一下,采用RSA与数值计算支持库混合的方法可以加强加密强度。
另外,密匙字串需要分开存放,全局变量中放一些,程序集变最中放一些,局部变量中放一些,常量中放一些,字符串一定要打乱,不可存为一个变量中,还可以RSA之上再加密,如RSA密钥是加密格式的,验证完后立即清变量……要注意的事项还是很多,一定要考虑周密一些,即要达到加密的目的,也不要太复杂了,以免自己也被搞糊涂了。如果有错误,误将正版用户当盗版用户对待就不太好了。
3.数值计算支持库易语言提供的数值计算支持库很有特色,其特点就是可以计算任意位数,因此大家可以根据这个特性来制作加密算法,考虑到奸人如果制作一个注册机就必须去研究易语言,及了解了易语言的数值计算支持库后才能去破J,但即使这样,也不能轻松就能写出注册机,试想一下,数值计算支持库本身就花了很长时间写出,因此奸人们是无论如何也是制造不出注册机的。并且一般来说,奸人如果出注册机,一般都希望文件小一些,从而也不会用易语言写注册机程序,一般采用C语言写,即使写了也要带上很大的系统支持库与数值计算支持库,太累了吧,哈哈。
在此建议的是将RSA算法与数值计算支持库相结合的办法,这样的注册机基本上就不会再有了,只要防止内存注册机出现即可。内存注册机的防止可以通过不进行判断的方式解决。而防止暴力破J是通过对软件加壳后,在外部CRC验证保证程序完整性,程序内部再多重检查,加上几个暗桩,这样通过层层把关,最终就可以确保万无一失了。
由于PE文件格式的局限性,任何加密程序都有可能被破J,我们所要做的仅仅是加强加密的复杂度,让奸人知难而退,耗费他们的时间与精力,浪费他的时间就是在杀他。
八.给奸人一些教训实际上,我们的用户已区分为以下四种人:共享试用者、正版注册者、破J使用者、破J版使用者。
当我们需要给破J者一些教训时,一定要将正常用户区分开,否则正常用户有所损失,那么就根本不会来购买您的软件,您的声誉也会下降的。
1.给破J者的教训有句名言:“软件很生气,后果很严重!”。
给破J者的教训要深刻一些,最好让他刻骨铭心,永世不忘。
对于一个破J新手来说,很草率地去破J一个成熟的软件,对他来说是灾难的开始,给破J者制造麻烦,让破J者知难而退是一件有乐趣的事。这事一定不要忘记做哦,否则我这文章就白写了。
但最好不要在软件中写有辱骂破J者的话,这样会将奸人狗急跳墙了,反过来会非常强烈地一定要破J你,反而得不偿失,技术上的比拼是正当的,人格侮辱就不太好了。
一个通常的教训如下:
但如果你想变态地去教训奸人,那么我也没有办法阻止你了,毕竟你已在授权文件中警告过用户不要乱动你的东西了。哈哈。
有时候,奸人是使用的虚拟机,你重启、死机什么的都对他有影响,唯一他比较可怜的就是硬盘中的一些资料了。下面是将文件删除到回收站,及清空回收站的代码:
2.给破J版使用者的教训上面是对于奸人的教训,但对于一般破J使用者来说,也要给予配当的惩罚,但不能太过严厉,不能对他们的机器造成严重破坏。一般来说给予一次广告机会,数据错误,或设置一些小损失即可。
常见的有以下,其他的请你根据你自己软件的内容进行适当的创意吧。
第1种:建议发现是破J版使用者在用时,可为你的软件加一些贴面广告,这样您会有一些收益,以补充你的一些损失。
第2种:将一些数据搞错了,而且是非常明显的错误,让他有些损失。
第3种:建议开始一段时间让他正常用,查明破J版使用者如果保存较多的内容,说明他很在乎经常使用你这个软件,并且认为破J正常,已可以正常使用了,这时等他的数据量大时,将数据库锁定,他一定欲哭无泪,只好请你帮他解锁,购买您的软件了。
易表的作者就是用这种方法。
实际上这是一种暗桩操作,即在发布几个月后再检查是否是正版,或在数据库存储到一定时间后再检查是否是正版用户,这样的加密方法值得大家学习。
可能您很生气,想让破J版使用者得不到好的下场,最好不要删除重要数据。且我个人是不建议大家删除有用的数据的,毕竟这些都是国家的财富。
加密第8定理:加密的结果是双赢才行,用户真正认识到了来注册,同时也能用上正版了。
3.行为不要过火作者给奸人一些教训是正当的,可是软件会存在BUG,写加密程序也会有BUG存在。如果将正版用户的数据损坏了就不太好了,毕竟大家还是要靠口碑生存的。即使您是对的,但如果盗版用户多,那么如果太严厉了,就没有人敢用你的软件了。
如江民事件,就是前车(JU)之鉴。
如果您能搞出一个即让破J者假象破J,为你作宜传,而又能争取到用户,那样是最皆大欢喜的了。易表就是一个例子,他的软件表面上被破J了,但实际上还存在暗桩,结果用了一段时间后,用户的重要数据被锁定了,只能乖乖注册。
加密第9定理:口碑好的软件才能传播得更广。
|
|