|
2.利用吴氏加密算法我们将吴涛在易语言中提供的自有加密算法称之为吴氏算法。
吴涛提供了两种加自有加密算法:一种是易数据库的加密。还有一种是配置菜单中的易语言源代码口令保护。易语言的易用性就在这里了,大家一定要充分利用这些现成的东西。
使用易语言自带的易数据库的加密功能目前是非常可靠的,这是吴涛研制的自有算法,目前还没有破J易数据库的工具推出。这样就使得一些重要的东西存放在加密后的易数据库中十分安全。
易语言源代码口令保护也是一个吴涛自有算法,加密后的源代码连易语言公司也不能解密。因此我一般用它保护注册机和商业程序,所以我的注册机和商业程序的源代码在我用过的每台电脑中都有,但口令只有我知道,没有口令保证打不开,哈哈。
下图为使用配置菜单后弹出的窗口,大家可以为易语言源代码加上保护口令。
3.海岛挖宝听过海盗船长的故事吧,故事中海盗将宝物分开存放,这样即使找到一处其他地方也没有损失,而且不仅如此,他们也将藏宝图也分成一块一块的存放。
金庸鹿鼎记的小说总看过吧,皇帝将藏宝图分八册存放,一一找到是非常困难的哦。韦小宝这个天才也花了两三年的时间才找到全部哦。
软件中一些比较重要的文本型字符的保护也是这样,你可以分开位置存放,分段、分开类型存放,用时再转换数据类型。分开存放是指分不同的全局变量、程序集变量与局部变量存放。
加密第13定理:相关加密的部分一定要分开存放。
对于RSA验证也要这样不要一次性地全部验证了,这样一点意义也没有。应该是软件启动时验证一部分,在软件运行中验证一部分。
在Debug的手册里可以看到Debug工具的局限:第一个局限是只能下4个内存区域的断点,每个断点不能控制超过两个字节,这样内存断点不能控制超过16个字节的区域。
假设你的注册部分有300行,你可以分成30个子程序调用或重复的子程序。放一些垃圾代码也不会损失什么。
作业:将RSA验证的一次性验证改为分三次验证,并且每次返回不同的数据类型。
4.随机验证
随机验证很重要,例如你的一处验证是一直存在的,奸人就很容易地下断点跟踪了。因此在软件启动时进行一次正常验证外,其他情况下的验证最好是随机的,用30分之一或50分之一的机会进行验证,这样奸人会不停地试你的软件在哪一处进行了验证,因此破J的时间会相当地长。
加密第14定理:足够多的随机验证足以让破J者累死。
随机验证包括随机进入不同的验证子程序。
或随机中的最大数大一些,只有30分之一的机会验证。
或在窗口中放上一些颜色与底图一样的图片框,这样奸人不一定会点击这里,但用户万一点中了,就会触发验证。
我们假设所有软件都能被破J,包括易语言在内,那么如果他破J的速度跟不上你发布新软件的速度,那么他永远在破最新版而累死。或者说他破J的时间比你写一个软件的代价大,这时还不如他直接写这个软件来得合算。
反破J的任务之一就是让奸人累死,或浪费他的生命。
下面的办法也可以使用:你可以在读到待验证的注册码、公钥、注册文件后,通过定义10000个数组,存入上述同样的内容以备以后进行验证,这最多浪费一些内存。验证时随机使用其中的一个进行验证,由于奸人不知你用的是数组中的哪一个进行的比对,而且是随机的,每次验证的值都不一样,不让奸人吐血才怪呢。
计次循环首(10000,计次)
数组[计次] = “123456” ’ 复制一万个公开注册码或公钥,破J者知道也无所谓。
计次循环尾
数组[取随机数(1,10000)]
你不要立刻检查注册码,10000份拷贝你只要以后随机找一份用就行了,破J的人不知道你正在用的是那一个,同时你可以事先编好且运行时不断使用一些假的读取注册码数组的调用干扰破J者。这种方法对程序的性能影响微不足到,只是浪费一点内存。因为Debug对内存下断点的局限,这种情况他要下断点,累死的就是破J的人了。
5.不同权限验证在启动时进行一次验证是非常必要的,这样让奸人知道确实是验证了,以让他心理放松警惕,而这次的验证只是一部分验证,并没有完全验证。
还有的建议在启动时将注册信息读入后不要进行验证,保不定在哪里进行验证,个人认为这样让破J者提高了警惕性,会认为软件作者很有经验。麻痹敌人也很重要呀。
例如,在启动时验证通过一次,验证级别加强一级,然后再在其他的地方再进行验证就可以了。
下面代码是确认了一个级别
计次循环首(到数值(验证1),)
已注册 = 1
计次循环尾()
……
……
在另一个触发子程序中再通过这个级别再验证:
计次循环首(已注册)
计次循环首(到数值(验证2),)
已注册 = 2
跳出循环()
计次循环尾()
跳出循环()
计次循环尾()
在其他触发子程序中再通过这个级别再验证:
计次循环首(已注册)
计次循环首(到数值(验证3),)
已注册 =3
跳出循环()
计次循环尾()
跳出循环()
计次循环尾()
有时也可以将级别降一降,怎么降,当然是不考虑级别直接验证了:
6.忽悠型的垃圾验证代码前面已讲过花指令的原理,在程序中人为地再放一些垃圾代码以忽悠奸人也是一个好办法。垃圾代码就是一些假的验证代码,基本上是明文的,这样的代码上百上千,足以让奸人累死。
其实对付那些“根据跳转指令的爆破”高手来说,一个办法就够他们头疼的了,就是你在程序中不明显加入与判断是否正版有关的语句,也不做任何提示,以免让他们顺藤摸瓜,而是在判断为盗版后,跳转到另一个看似很合理的分支,而那个分支和正版的分支代码差不多,只是在计算公式或其它算法上稍动一下,使其运算结果不正确,这样,他们就在机器码级别上就分不清哪个是对的,哪个是错的了,即使他们认为破J成功,其实运行时,得的结果错误百出,他们就没兴趣了,呵呵,算损的吧!!!
加密第15定理:大量添加垃圾代码虽然是无奈之举,但很管用。
作业1:制作一个常量迷幻器
要求:制作一个常量代码自动生成器。可随机生成成百上千个易语言源代码形式,可直接拷贝到易语言中成为常量。变量也可以这样制作。
写好这样一个程序后,就可以自动生成垃圾代码,然后复制,粘贴到易语言的常量表中即可。如下图所示:
变量也可以这样生成,不过生成的变量可以任意拷贝为全局变量,或程序集变量,或局部变量。制作时的名称可以为中文名称,直接编译后不会在EXE文件中找到同名的中文名称。因此您可以放心地将这些名称定义为:“垃圾常量1”、“垃圾变量1”等等以示与正常代码进行区别。
作业2:制作一个代码迷乱器
本次作业性质同上,也是自动生成易语言的一些无用垃圾代码,以迷乱奸人的破J,让他找到的全是垃圾代码,从而大大延长了破J时间。
通过直接拷贝编辑框中的内容,粘贴到您的代码中,可自动完成任务,如下图所示:
上图所生成的是一些明文的加密方法的垃圾代码,让奸人去研究这些垃圾吧。
上述子程序名称最好也有时调用一下,反正不会真正产生作用的,用多线程调用最好。
或者您平时注意多收集一些别人用于加密时的子程序,拷贝到一个易语言程序中,保存,这样的代码作为垃圾代码放在你有用的程序中,虽然增加了一些程序的体积,但安全性是大大提高了。并且基本上没有牺牲软件性能与稳定性。
7.伪验证技术
还是先举一个例子说明吧,易表软件在10.0版本前已发现有大量的注册机存在,于是易表作者其后改变了加密方式,易表10.0推出后还是出现了注册机,并且这种注册机注册过的软件可以使用。于是有些用户用注册机取得的注册码使用了,过了一段时间,当盗版用户将重要数据存入易表后,突然有一天数据库被锁定了,于是只好注册易表,并且让易表作者为数据库解锁。
从这里可以基本上判定易表新版本采用了伪验证技术,即在较为明显的地方提供了一级验证,这种验证方式没有经过太强的加密,而二级验证在一定的条件下才触发,而这个条件是检查到了用户输入了重要的数据,或大量的数据,或使用次数较多。
基本原理是注册文件由前后两个注册码拼接而成。一般情况下只进行第一个注册码的验证,而当条件成熟时进行第二个注册码验证。
这是一种双赢的策略,易表作者即收到了注册费,付费的人还会道歉,并且感谢易表作者。哈哈,大家要学习这招哦。
但本办法对于数据库应用及数据量大时检查最好,而对于一些没有生成数据的用户无效。
发布软件的时候发布自己编写的注册机,弄个假破J版,那么想破J的就可能不来了,即使有真的破J,谁会有自己给自己写假破J快啊!可能假破J版中只破J一半,等用户使用了,有数据了再锁定,让他们注册后再给解锁,付了钱还要谢谢你,哈哈,损招,但有用!
加密第16定理:伪验证可以迷惑一般破J者,甚至自己发布一个伪注册机。
8.定时验证、延时验证、客户数据集累验证过一段时间后再验证,如你在2005年1月发布一个软件,那么就内定2005年6月后触发验证机会。
或您的软件是一个数据库产品,那么您可以在程序中设置如果数据库大于5MB时就进行验证,并且最好您能确定这些数据是不重复的,刻意加入的。
如易表设置了伪验证,这时市场上出现了新的注册机,当用户用这个注册机后,提示是注册成功了,但当用户输入重要数据后的某个日子,突然打不开数据库了,用户很着急,因为以为是破J成功了,所以将重要的资料输入了,只能拿钱向易表作者进行注册了。而且还千恩万谢,后悔自己不该用破J。哈哈,一举两得呀。
这个方法对于数据库应用软件来说是绝好的办法。
作业:制作一个算法程序放在你的数据库软件中,这个子程序可以统计你的数据库软件使用时,用户输入的是否是拷贝的东西,还是正常的数据。当统计到1000时触发验证。方法思路为:可以通过查看用户有没有使用复制与粘贴快捷键,或资料进行排序,如果有大量重复的,就说明是奸人在拷贝数据破J,否则是一个资料一个资料的输入的,说明是正常使用的重要资料,这时进行对比就好了。
本方法对有资料的破J使用者有极好的控制作用,通过第6条的伪验证技术与本技术结合,那么就可以知道是不是正版用户,并且可以锁定数据库,等他注册后再给他解锁。
加密第17定理:加密的结果应该是双赢,伪验证是一个上策。
9.验证与专业知识相结合技术将验证与专业知识相结合,让奸人必须学习专业知识后才能真正去破J,这样所花的功夫比自己写一个软件的代价还要大,而有的专业知识不是专家是不知道的,因此是一个较好的加密方法。
前述中采用了“到数值(验证1())”这样的代码返回的是0或1两者之间的一个数,可以用乘法进行混合计算,如:
音量 = 播放位置X到数值(验证1())
当验证正确时返回的是1,这时的结果是正确的,否则返回0,这时的结果为0,是错误的。
这样的代码可以混合到您的专业知识中,如:算命软件可将天干地支、生辰八字中的某个地方进行此类计算,计算类软件可以将某种特殊的计算过程如此结合计算,绘图类软件可将绘图中的算法部分加入此类计算,音响设计类、机床设计软件……
加密第18定理:你知道的专业知识,破J者不一定了解哦。让专业知识与验证相结合吧。
10.伪装,用易语言写自有支持库大家可以将DLL文件的扩展名改为易语言的支持库文件FNE扩展名,这样进行非独立编译后,与其他FNE文件混合在一起,甚至您可以用易语言写一个支持库,将其中一部分作为验证部分。
易语言的支持库文件FNE文件其实就是一个DLL文件,只不过扩展名改变了而已,用易语言写支持库的方法金眼睛已发过一篇贴子,进行过说明,请大家在易语言论坛上搜索金眼睛的贴子就可以找到了。
作业:找到金眼睛关于用易语言写支持库的贴子,并且自己写一个支持库。
11.绝妙的暗桩设置应该想到的用代码实现的暗桩前面都讲了不少,下面是一些特别的暗桩供奸人品味的。
大家可以在一些不起眼的地方再放一些暗桩,如:在窗口最小化事件中随机验证,如在某个组件鼠标被移动事件中验证,
有时需要将数据完整性验证放在更高一级的验证中,不要一上来就检查文件是否被更改。
同一验证可以使用多次,这样奸人认为你已经验证过了,没有必要会再验证一次,而相反这时又产生了验证,让奸人防不胜防。如启动时就立即检查程序完整性,如果发现被更改,那就立即退出程序,而在一些子程序中也随机放这样的验证。
更多的暗桩大家自己设计最好。
加密第19定理:加密重要的是暗桩的设置,破J不完全就是一个无效破J。
12.发布不完整版本有的软件作者在发布共享软件时,放在外面的是不完整版本,将更多的数据资料在注册后提供。这样做也可以,只是麻烦一些而已。如有的图形制作软件,将图片资源另外打包,用户注册后再给完全版的图片。
也有的将DLL文件中的验证部分作了空处理,而在注册后提供真正的注册DLL文件及注册码。还有的直接将KEY文件放在了DLL文件中另外提供。
加密第20定理:不要发布完整版本,以静制动。
13.程序、数据结合加密技术把程序运行所必需要的资源放到一个数据库文件中,给这个数据库设密码,密码是主程序的数据摘要变换后的结果。程序运行是先验证有没有注册,如果已经注册,就对运行程序本身(取执行文件名())取数据摘要,用自己设计的算法多次变换后形成一个字串,用该字串作为数据库的密码打开数据库文件。如果打开数据库失败,就说明主程序被人修改了,终止程序运行即可。(不终止也没戏,程序找不到运行所需的资源。)
另外设计一个程序,用同样的算法算出数据库密码,然后给数据库加密即可。
密码形成算法建议使用大数支持库。但如果是汇编高手用汇编写注册机的话,会直接将支持库的所有反汇编码抄进去就可以了,问题是他们有没有时间搞。
14.自定义算法前面讲过采用RSA与数值计算支持库交叉计算的办法,这就是一种自有的算法,如果能用上数值计算支持库中的矩阵、傅丽叶变换等高级功能就更好了。
多重RSA交叉打乱:大家也可以多用一些RSA密钥,如用5个,10个都无所谓,重要的是将这些注册码都打乱,让奸人哭死。打乱的方法就是你自己独创的方法了。
更多的自有算法就要靠大家自己去研究了。祝大家好运。
加密第21定理:加密不反对古怪和变态的方法,鼓励哦。
15.加密框图下面给出一个加密的设计框图,大家可以根据自己的实际情况改变加密的策略:
图中主程序外围进行了花指令编译,并且用加普通壳进行保护。脱壳了也无所谓,因为设置了暗桩,随机检查。
图中表示主程序运行后,首先进行了常规的注册码第一次验证,找有没有注册文件。如果这个被破J,注册码应该是一个短的RSA,而真正的注册码是三个RSA的叠加。会生成伪注册机也无所谓。
主程序中用暗桩的形式对窗口标题、版权信息进行验证,这是考虑到如果一启动就验证这些很容易被奸人看出来从而会跳过去。因此用一些随机,或分级,或条件法取得不固定的验证。
主程序中用暗桩的方式对加壳后主程序的完整性进行校验,这个也不要放在常规的验证中,否则很容易被跳过去。可以查文件长度,MD5或CRC32都可以上。
主程序中用暗桩的方式加入了反调试模块。
主程序中布满垃圾验证代码。并且源代码有备注,不会搞错的。
主程序在某个条件下随机进行第二级验证,从注册码中取第二段数据,如果注册码长度不够且取不到第二段数据,那么就说明已使用了伪注册机,将用户的数据库锁定,等他付钱来注册。
主程序在一个条件下再激活验证,从注册码文件中取第三段数据,如果注册码长度不够,且取不到第三段数据,那么就说明已使用了伪注册机,将用户的数据库锁定,等他付钱来注册。
编程中还注意将加密的字符串搅乱且分不同地方存放,用吴氏加密命令加密重要数据,也可加入数值计算支持库的算法,也可以加入一些惩罚手段,也可以再加入自己的一些算法。
|
|