TA的每日心情 | 开心 2017-9-13 00:40 |
---|
签到天数: 444 天 [LV.9]以坛为家II
|
该文章来自互联网
本文为全中文编写,不需要有PE文件格式知识,不需要掌握汇编或C语言的编程技巧,一些加密算法直接由易语言提供,特殊的加密算法大家可以翻译C语言代码、汇编代码或VB代码。
本文中将“Cracker”一词翻译为“奸人”,意为“奸邪小人”之义。本人对破解者一向深恶痛绝,有人说中国的软件发展中破解者有一份功劳,可我说这话不对,看看因盗版而产生的微软对操作系统及软件业的垄断,国内软件业在盗版的夹缝中生存……,如此下去,软件作者没有收益,将不再会有优秀的软件推出。防止盗版,匹夫有责,我想通过本书的推出可以加强易语言用户的加密能力,将盗版杀死在大家共同的手中。
随着采用易语言编制程序的人们越来越多,写一个软件易被奸人破解的情况也越来越多了,有个别用户甚至于怀疑易语言是否有安全性。从技术性上来说,我只能说加密技术与编程语言无关,一个编程语言的安全性一般指所生成的机器码是否稳定、可靠,而不是防破解方面,如果想要很好地防止破解,那么掌握一门加密技术是非常必要的。
本书考虑到使用易语言的用户大部分对PE文件结构不太熟悉,因此没有采用很底层的方法去教学,而是采用与易语言直接表达的方式试图说明如何加密。
本书基本上是按以下的顺序进行讲解的:
破解技术 反破解技术1 反破解技术2 反破解技术3
防改文件 文件名验证 LOGO图片验证 窗口标题验证
防改文件大小暴破 加壳后数据签名验证 加壳后CRC验证 文件大小验证
防调试 花指令 反调试模块 反调试支持库
内存注册机 不进行判断,用循环代替 字符串打乱器 及时清内存
算法注册机 RSA算法 数值计算支持库
其他 多处验证点 随机验证 命名刻意隐蔽
本书是集体创作作品,并集成了多位作者的公开著述,在此一并表示感谢。其中部分文字内容根据易语言的特性作了修正。文中不署这些作者的姓名,以防止奸人对他们的软件的刻意破解。
本章整理:麻辣教师
目 录
《易语言软件加密技术》 1
一.易语言程序加密的目的 5
1.保持软件的完整性 5
2、保护软件开发者的权益 5
二.易语言程序加密的原则 5
1.加密前要考虑周到且严密 5
2.需要加密的内容要制定一个计划 6
3.加密时制作好文档,以备以后的修改 6
4.发布前问一下是否可以正式发布软件了 6
三.防止程序内容被更改 7
1.防止软件名称被更改 7
2.防止窗口标题被更改 7
3.防止LOGO图片被更改 8
四.防止内存注册机 8
1.不要使用简单判断 9
2.采用MD5对比 9
3.多注册码拷贝 9
五.防止文件被暴破 10
1.常用加壳软件介绍 10
2.加壳后文件大小验证 14
3.加壳后数据签名验证 14
4.加壳后CRC验证 15
六.防调试方法 16
1.易语言的花指令 16
2.反调试模块的使用 17
3.反调试支持库的使用 17
4.通过检查父进程得知是否被调试了 18
5.使用多线程 19
七.注册机制 19
1.简单注册原理 19
2.RSA算法注册 20
3.数值计算支持库 27
八.给奸人一些教训 27
1.给破解者的教训 27
2.给破解版使用者的教训 30
3.行为不要过火 30
九.网络验证法 30
1.实现的原理 30
2.存在的几个问题 31
十.加密狗加密 31
1.加密狗的选用 32
2.加密狗加壳法 33
3.加密狗写存储器法 33
十一.加密算法策略(暗桩) 34
1.易数据库密码怎么泻露了 34
2.利用吴氏加密算法 37
3.海岛挖宝 38
4.随机验证 39
5.不同权限验证 40
6.忽悠型的GHOFFICE过滤词语验证代码 41
7.伪验证技术 43
8.定时验证、延时验证、客户数据集累验证 44
9.验证与专业知识相结合技术 44
10.伪装,用易语言写自有支持库 44
11.绝妙的暗桩设置 45
12.发布不完整版本 45
13.程序、数据结合加密技术 45
14.自定义算法 46
15.加密框图 46
附录1加密已形成密码学 48
附录2《如何用简单方法防止破解》 49
附录3代码与数据结合技术 50
(正 文)
一.易语言程序加密的目的
在此有必要说明一下为何要为自己的程序进行加密,初步认为有以下两点:
1.保持软件的完整性
这里包括了文件名不被更改,文件版权信息不被更改,文件尺寸不被更改。
很多时候有的奸人拿到您的软件,他可以将文件名更改,将文件版权信息的字符串或图片更改,然后放上自己的东西,如放上病毒可以对其他电脑造成破坏,如果放奸人的弹出广告收益的是奸人,而不是作者。相反,使用这些软件的用户反而将作者痛骂一通,造成声誉上的损失。因此处于保护自己的完整权益来说,也是有必要保护软件的完整性。
例如QQ软件,曾出现过多款个人行为的补丁版,更改了QQ的一些信息与界面,为此QQ公司十分头痛,以后的一些事大家也知道,现在看是破解QQ的很少了,而且在安装QQ新版本时,它会检查是否有破解补丁存在,如果存在就不运行。
2、保护软件开发者的权益
也许你会说,一个不被破解的软件一定是一个没有加密的软件,那么看看下文您就会知道,那只是一个理想中的事情,除非您是有钱了没有事干的人,否则您开发软件的目的是什么我是很难知道的。
无论是个人还是公司,如果生产一个软件得不到收益,以及后继开发资金的鼓励,那么无疑这个软件是很难再开发下去的。这样的例子很多很多,我不想举例,国内已出现了很多软件的破解版,而一旦出现了破解,那么所造成的损失是非常大的。
二.易语言程序加密的原则
早先人们的加密方法是通过在软盘上格式化一些非标准磁道,在这些磁道上写入一些数据,如软件的解密密钥等等。这种软盘成为“钥匙盘”。软件运行时用户将软盘插入,软件读取这些磁道中的数据,判断是否合法的“钥匙盘”。
软盘加密还有其它一些技术,如弱位加密等等。
随着近年来软盘的没落,这种方法基本上退出了历史舞台。新的软件加密技术也越来越多了。
1.加密前要考虑周到且严密
说实话,有很多人在易语言论坛上发贴,说自己用易语言编写的软件有了破解,还非常高兴,有人用才会被破解,但我想,如果是很高兴的这样子,除非你的软件技术含量很低,或你是微软,想被别人破解,您不应该高兴,这有点象别人打了你一耳光,你还很高兴,你的知识产权或著作权已被奸人侵犯了,性质很恶劣,后果很严重。除了拿起法律武器,劳命伤财,还有就是加强加密方式。
如果被制作出注册机,情况是最糟糕的,作者需要全部更换全部用户的注册KEY文件,工作量相当地相当地大。因此一个好的软件保护发布前必须考虑周到,而且是面面俱到,否则出一个新版,发现一个破解,再出一个新版去修正,那样的事情是极其弱智的。
2.需要加密的内容要制定一个计划
一开始不明白如何加密的易语言用户,一般就找一下论坛上关于注册的例程套用到自己的程序中,认为这样就是加密了,实际上本节所要讲的是制作一个学习计划,将所有需要用到的知识与软件都收集到,这个计划就是一个加密计划,也是本书所要讲述的。
3.加密时制作好文档,以备以后的修改
在加密中有可能使用了多处加密,因此需要将文档写好,以防止以后忘记,实际上您可以在易语言中使用备注的方式作以说明,这些备注在编译时是不会被编译进目标EXE文件中的,大家可以放心写,同时也节省了写外部文档的时间。以后如果找时,可以直接搜索找到加密的地方。
4.发布前问一下是否可以正式发布软件了
制定一个风险评估标准,以考验一下程序的风险性,被破解的可能性,如果你是破解者,在不知道如何加密的情况下会如何去破解这个软件。
有一个参考的评估标准在下面。
共享软件注册加密自我评测表
评测方法:以下问题,若答案为是加1分。
1. 是否加壳?
2. 是否采用两种以上的不同的工具来对程序进行加壳/压缩?
3. 是否有软件自身的完整性检查功能?(CRC校验或其他)
4. 与软件保护相关的字符串是否有进行加密处理?
5. 是否采用了比较成熟的密码学算法?
6. 是否有多处验证点,调用多个不同函数或判断多个不同全局标志进行注册验证?
7. 是否有随机验证的功能?
8. 是否采用了在线验证功能?
9. 注册过程中是否尽量少地给用户提示信息?
10. 是否不依赖于GetLocalTime( )、GetSystemTime( )这样众所周知的函数来获取系统时间?
11. 是否有伪破解功能?
12. 是否在软件中嵌入了反跟踪的代码?
13. 是否对校验函数命名做了刻意隐蔽?
14. 是否将注册码、安装时间记录在多个不同的地方?
15. 是否在校验时故意加入冗余干扰代码来误导解密者?
16. 是否有自己独特的防破解措施?
建议:得分在6分以上才可以正式发布软件!
制作者:中国共享软件联盟?lcraz
三.防止程序内容被更改
从本节开始,已进入讲解加密的正题,但可能章节不必这样划分,即按加密/破解的方法来划分,如防反调试,反跟踪,反……。但笔者觉得,从一个一个小的知识点的进入是非常重要的。
下面的有些内容是我请教了酒桶醉死的经验后总结的,在此表示感谢。
1.防止软件名称被更改
这里是极为简单的方法:
判断(到大写(取执行文件名() = “我的程序.EXE”)
在上述中,为何使用到“判断”命令,而不是“如果”命令呢,大家可以想一下,“判断”命令的代码安全性要比“如果”命令高,这里不会举出一个汇编的例子,只要说明一下即可。即“判断”命令是多重分支结构,这样就增加了被破解的难度,因此,大家一定要注意这样一件事情,就是在进行加密比较时一定不要使用比较的语句,那样很容易被奸人使用破解工具下断点,那么正确的做法应该是如何的呢,请看下面代码:
计次循环首(到数值(是否注册成功()),)
全局_注册成功 = 1
计次循环尾()
通过上面的代码可以看出,这里没有使用判断语句,而采用了一个循环命令去参与。其中“是否注册成功()”确实是返回了一个逻辑值,但通过“到数值()”命令后就会被为0或1之间的一个数字,会用易语言的人都知道,一个循环命令中,如果循环数为1,会执行循环中的命令,否则为0不进入循环。生成机器码后,奸人会很难找到判断的汇编码,大大加强了保护性。
上述的基本方法是有了,但请您将这个方法隐藏于您的程序代码行的某一深处,实际上加密是各种方法的综合,现在所教的只是其中的一种,大家要将多种加密方式用于一个软件之中。这需要大量的时间学习与体会。
加密第1定理:“如果()”语句一定不要出现在加密算法中。
加密第2定理:用“循环”类命令代替判断语句。
2.防止窗口标题被更改
窗口标题是否被别人更改这个也可以通过与上述同样的方法实现验证。
判断(_启动窗口.标题 = “我的程序.EXE”)
大家也许会说,这些好象没有必要吧,谁会这么无聊,将软件的名称与窗口标题更改呢,大家看这样一个例子吧:有一个电脑培训班,采用了明伦五笔练习打字软件进行电脑培训班,他们破解了,且修改了明伦打字软件的版权信息,改为自己电脑培训班的标志,产生的教学效果即:学生认为这家培训班的技术实力很强,自己可以开发打字软件,而且经常弹出电脑培训班的标志与广告,产生了很好的广告效果,学生介绍学生,更多的学生参与进来了。
从上述事件看,很显然明伦打字软件的作者一点好处也没有,全部被破解者侵占了。因此一个好的软件保护必须是全面而且周到的。
另外,我要提醒大家的是,这样的语句也是非常不保险的,这样的话很容易被奸人改了字符串,以致于字符串也被更改了,或很快能找到比较的地方,从而轻松跳过去。较为理想的是将字符串打乱,即将“我的程序.EXE”以“字符()”、“取代码()”、“取反()”、“异或()”等命令用字符串相加的方法加在一起成为一个字串后再比较。
判断(取数据签名(_启动窗口.标题) = 取数据签名(“我的程序.EXE”))
3.防止LOGO图片被更改
有的人怕程序信息被更改,采用了图片显示程序标题的方式,这样这种图片较不易被奸人修改,但可能也有个别高手进行修改,因此图片的大小是知道的,这样可以用以下语句进行判断:
计次循环首(到数值(取字节集长度(_启动窗口。底图)=342488)),)
其中上述的数字是您已知的图片大小尺寸字节数,而不是乱写得来的。
也可以将图片放在易语言的资源中,直接进行比较。
计次循环首(到数值(_启动窗口。底图)=#图片1),)
以上方法虽然软件的体积大了一些,但带来的直接好处是,程序量一大,为破解带来了更大的困难,虽然损失了体积,但保证了安全。
你的关于窗口也要这样保护起来哦。
使用数据操作支持库中的“加密数据()”、“解密数据()”命令加密图片后存放在图片资源中,用时再解密显示出来。例如您的一些口令就直接用这个加密就可以了。解密时注意直接放在一行代码中比较,不要存到一个变量中,这样在内存中是找不到明文的。
四.防止内存注册机
“内存注册机”的原理就是在不用分析原程序的加密算法,实现直接读取原程序在加密计算过程中内存里显示出的明文注册码。
很多易语言软件加密时,算法是足够复杂了,但是就是KEY文是存在内存中的,这样就极易为破解。破解者只要写一个小程序,将这个内存地址显示出来,就一切OK了。特别是现在还有自动生成此类内存注册机的软件,只要填入内存地址,一下就生成了。如下图所示。
解决这个问题的办法是推荐使用RSA注册法,如果你不想采用,那就要一些技巧了。
1.不要使用简单判断
不要使用如果这样简单的判断语句,使用循环命令进行判断。
在程序中与你的数据相结合进行判断最好。
2.采用MD5对比
你的注册码判断过程最好不要直接判断两个注册码文本的方法,正确的应该是取文本的MD5码,再用取到的这两个MD5码进行对比,即用户输入在注册编辑框中的文本信息与注册码文本信息进行MD5的直接对比。有时奸人会输入一个假的注册号,然后在内存中寻找这个数据后再进行分析,如果转换为MD5判断后,奸人在内存中是轻易找不到自己输入的数据的;
3.多注册码拷贝
即在内存中复制大量的注册码,在验证时随机取一个进行判断就可以。这样的好处是奸人要跟踪N多个注册码内存,不知在哪一处就验证了,这会让他烦死。
注册码分开放在N个地方也是个好方法。 |
|