我眼中的加密与解密
作者:thebutterfly
我接触加密与解密已经5个年头了,在看雪论坛中也潜水了两个春秋,却一直不敢说自己的水平怎么样.面对这个标题,更是心有千言却难以下笔.我只能说说我个人接触加密解密的经历以及自己对加密解密的一些浅陋的看法,如果有不妥之处,还请各位高人多多指教.
(一)我和破解
我是从游戏中熟悉电脑的,上了高中,我终于有了一台自己的电脑.而我迷上破解是从借同学的一张光盘开始的.那张光盘上有一个目录叫"高手区",里面除了有一些CrackMe的破解动画外,还有看雪论坛当初编写的那本"Crack Tutorial"(名字不一样,内容相同),现在看起来那些东西似乎显得过于低级和简单了,可不管怎样毕竟是它们引领着我走进了破解的大门,更确切的说,是走进了计算机科学的世界(为什么?后面会说).
那本Crack Tutorial以及一些其他的破解动画确实给我了很多学习的东西,例如我印象最深的是几句程序判断注册的"经典组合":
1)cmp xxx,yyy
jz/jnz zzz
2)call xxx
test/or eax,eax
jz/jnz yyy
.........
现在你对这些可能不屑一顾,但以那个时候的加密解密水平来衡量的话,这已经是很不错的了(不信可以翻翻2001年的看雪论坛精华)
可是,当时我才高一,对计算机理论知之甚少,很快破解的学习便进行不下去了,主要是很多指令都不懂,例如对于一条简单的lea指令助记符,当时我就是不懂诸如lea ebx,DWORD PTR [ebp + 4]之类的指令到底是什么含义,虽然现在看起来这些指令是那么的简单,不仅如此,类似于消息循环等Windows程序的基本内容我都一无所知.所以,高二的时候我便下定决心要学习汇编语言.我利用去大学参加竞赛的机会买了一本x86汇编语言的教材,从此便开始了汇编语言的学习.
学习汇编语言并不是一帆风顺的.不少人视汇编为畏途,认为汇编是最难学习的语言之一,更何况我是自学.在高中繁忙的学习中,如果每天能抽出半个小时看汇编就已经很不错了,更要命的是有问题找不到人问,一切只能靠自己解决(有人问:看雪论坛呢?回答:当时我上不了网),x86的基本架构,指令寻址方式等我都花了很长一段时间才弄明白.这段艰辛的路程至今仍然记忆犹新.
到了大学,我有幸进入了软件工程系,得以继续学习我感兴趣的计算机.我利用1年的时间我自学完了Windows编程(靠的就是罗云彬的那本<<Windows环境下32位汇编语言程序设计>>),过程同样是曲折的,记得我有一次编写多线程程序时,程序怎么也不能正常结束,那时我花了3天的时间才弄明白原因:书上内容有误......
我买了<<加密与解密>>又一次开始学习,也是正式开始学习破解,到这个时候,我发现,书上讲的那些例子是那么简单易懂,高中第一次看加密解密时的疑惑这时全部无影无踪了.看雪论坛上不少的精华文章都能毫无困难的读懂.我深深感到当初选择学习汇编语言是正确的,正是因为那时的选择才使得现在学习破解才如此的顺利.
如今我仍然在学习<<加密与解密>>,但同时有有了新的挑战:学习保护模式Windows驱动程序的编写.
我对看雪论坛的认识也是从那本Crack Tutorial开始的,看雪论坛是我两个每次上网必去的论坛之一(另一个是霏凡论坛),不过当时论坛很不稳定,经常上不去,而且系统换来换去的(以后才知道是遭到攻击了),后来我家安装了包月的宽带,我才真正成为看雪论坛的常客,并在04年7月份注册了现在的帐号.看雪论坛确实是很好的论坛,国内没有其他破解相关论坛的质量有它高的.正是由于大家的无私奉献才造就了今日的看雪论坛.翻开看雪论坛精华集,对比一下2001年的精华1和2005年的精华7,感慨万千啊.
(二)为什么要学破解
记得当初初识破解时,我觉得破解很神秘高深,那些大牛破解了软件还不忘在软件上留个名,多么风光啊.正是由于这种动机才促使我努力去成为一名破解高手.如今的我当然还不能称为高手,可是我知道,我在成为高手的路上又走了一步.此时破解对于我来说已经不只是简单爆破几个玩具程序,它包含了更多更广的内容,如逆向工程.在学习破解的过程中,我不断学习到很多相关的东西,如SEH,PE文件的结构等知识.我曾经计划用10年的时间成为破解高手,现在已经过去了接近5年,不管到时候怎么样,我的目标不会变.10年不行就15年.因为破解已经成为我的兴趣,一种探索计算机世界的兴趣.所以说,当初的那些简易的Crack教程引领我走进了计算机世界的大门,不仅仅是破解的.
(三)我对加密解密的一些个人看法
此部分内容如有不妥之处还请各位指正
1.关于学习加密与解密
各位从我的经历可以看出来,当初我是对计算机一无所知,到现在初步掌握了破解技术,其间走过了不少弯路.关于如何学习加密与解密我就不多说了,看雪大哥有文章,置顶贴也有相关的说明(http://bbs.pediy.com//showthread.php?s=&threadid=769),我只是结合自己的经历来说明
----关于对"初学者"的一些提醒
学习加密解密的有两类人,其一对计算机已经有一些了解,例如懂汇编语言,懂计算机体系结构等等,只是不知道如何把知识应用到加密解密这一方面.这类人是真正的初学者.他们学习加密解密会比较容易,花的精力也会比较少.其二则是对计算机知之甚少,例如那些不懂汇编语言的,也就是和我当初一样.恕我直言,这类人其实不能称为"初学者",充其量只是"门外汉"而已,论坛上很多初级问题正是他们提出的(如某某指令的含义是什么等,这可以去查Intel的手册的).他们如果想达到一种比较高的层次,就必须花很多的时间和精力.但问题是,你有这么多的时间和精力吗?我当初从一无所知到现在花了5年的时间----我当时才高二,时间和精力都有.对于第二类人,我不怀疑你们的主观因素,相信其中有不少是愿意学习破解的,对破解真正感兴趣的,也是有耐心愿意学习的.但是我很怀疑你们的客观条件----时间和精力.学习破解基本上相当于学习大学两年的课程还多(如果你想成为高手).所以,如果你们想学好破解,想成为高手,首先要想想是否有充足的时间和精力.如果没有就不要浪费太多了,能玩玩几个简单的程序就可以了.
2.关于软件加密问题
有句话说:理论上任何软件只要能完整运行所有功能一次即可PJ.其实更准确的说法是这样:
(在Cracker不增加功能模块的前提下)任何一个软件,如果所有功能都能够在本地机器上运行至少一次,那么这个软件经过修改一定可以无限制的在本地机器上运行所有功能.(可以被PJ)
证明:在软件运行每一个功能模块时抽出此功能模块代码,然后将它们组合就成为PJ后的软件了(注意是理论上的证明)
逆命题也对:
如果一个软件可以被PJ,那么它的所有功能一定可以在本地机器上运行至少一次
证明:假设某软件已经被PJ,但是它的某功能不能在本地机器上运行,也就是说,从软件中得不到这个模块的代码,那么PJ后的代码中是如何有这一段代码的呢?注意前提:Cracker不增加功能模块
因此,一个软件可以被PJ 等价于 它的所有功能可以在本地机器上运行至少一次
也就是说,
一个软件不能被PJ 等价于 它不可能在本地机器运行所有功能一次
要打造(理论上)不能被破解的软件,这是一条基本原则
例如,Demo版的软件没有某个功能模块代码,那如果Cracker不自己写代码是无论如何也不可能PJ成全功能的软件的.
在第6期的看雪论坛精华中有篇文章<<保护软件著作权要注意避免的思路误区>>,作者是廖红旭,作者一针见血的指出当前软件保护的关键失误是"简单地通过条件判断语句来“甄别”合法用户",就是说,把整个保护的"终审权"交给一个简单的条件判断语句.应当说,作者是非常正确的,但是他提出的方案(“不论前述认证结果正确与否,都将该认证结果再次作为算子,经过必要运算后对发行前已受保护的软件核心功能代码进行解码”,<<加密与解密>>第二版P224的思想类似)也不能彻底解决这个问题,因为一旦Cracker得到了一个可用的Key,那么这个软件就相当于可以执行所有功能一次,也就是可以PJ,作者自己也承认这一点.
计算机=硬件+软件+网络,所以,加密和解密也必须体现这个特征.
考虑等价条件:它不可能在本地机器运行所有功能一次,怎样才能满足这个条件?思路如下:
a.本地机器上不能存在所有功能代码.
这是Demo版软件的特征,那么,正式版应当如何处理呢?
b.在非本地机器上存在本地机器缺失的代码,且这段代码不能在本地机器上执行(否则就相当于本地机器有所有代码)
如果认为这"非本地机器"是硬件,那么就有狗加密方案,如果认为是网络服务器,那么就有CS模式方案
写得很乱,毕竟是自己的原创,不妥之处还请各位多多批评指正
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课