前言自计算机诞生之日起,其技术的发展可谓日新月异,各种新技术、新思路不断涌现。个人计算机操作系统也经历了DOS,Windows3.x,Windows9x,Windows2000及WindowsXP的历程。各种应用软件从最初的几个、几十个字节发展到现在的动辄几张光盘,成千上万的共享软件和商业软件越来越庞大,技术内涵也日趋复杂。一款优秀的软件,其技术秘密往往成为他人窃取的重点。作为软件开发人员,为了保护自己辛辛苦苦开发的软件不轻易被他人“借鉴”,有必要对软件保护(加密)和破解(解密)技术进行研究。但是,软件保护和破解方面的资料目前比较匮乏,许多软件开发人员不得不自行摸索,导致在重复劳动中走了不少弯路,耗费了大量的时间和精力。随着软件以共享方式在网络上发布这种方式的流行,软件保护和数据加密技术的迫切性被越来越突出地表现了出来。软件加解密的发展历史我们通常是随着操作系统的不断升级来划分相应的软件,所以划分软件加解密的发展历史就是操作系统发展的历史。1.DOS时期这个时代的软件主要是正式版和功能不全的Demo版以及一些磁盘防拷贝保护,很少有所谓的共享软件(Shareware)。所以DOS时代所谓的解密通常是去掉软件中的某些限制或跳过原版磁盘检查,然后通过广大业余的BBS提供下载。但值得一提的是,这个时代的软件由于16位操作系统很容易接触到系统底层的原因,而导致个别软件保护方式异常强悍,又因为在16位平台上很难区分系统领空和程序领空而导致天然的破解跟踪困难,所以这个时代的软件保护机制两极分化很严重。2.Windows95早期当Windows95出现的时候,很多人不适应这个平台,它上面的加解密资料奇缺,对许多人来说就像做了一场恶梦。这段时期共享软件渐渐地盛行起来,采用序列号保护的共享软件越来越多。由于当时许多程序员对刚刚出现的Windows95不了解,感觉有些手足无措,编制的软件在加密部分都比较脆弱,所以那时候的序列号加密方案特别脆弱。3.Windows95末期其实这段时期应该是Windows95和Windows98共存的时期。在这个时期,程序员已经对Windows9x这个系统了如指掌,一些需要较高编程技巧、与系统核心等底层联系紧密的软件纷纷出笼。这个时期,共享软件大多还是采用序列号加密方式,但其序列号通常经过复杂的计算,所以很难像早期的软件一样,随随便便就能被解密。4.Windows2000/XP时期这段时期就是Windows9x和Windows2000/XP共存的时期。这时,各种软件的加密外壳泛滥,特别是各种专用加壳软件的出现,大大地提高了软件的保护质量;同时,解密技术也不断提高,各种新式的解密工具随即出现。此时的序列号加密越来越多地采用密码学中不可逆的加密算法,使得解密的过程越来越像高等数学的研究。软件解密者要想得到正确的序列号就必须对各种成熟加密算法有很深的了解,或者找出软件加密算法的漏洞(像WinRAR。CloneCD等软件的Keygen就是利用ECC椭圆算法的加密漏洞而编制出来的)。关于本书2000年初,作者想找一些研究加解密的朋友交流一下,但十分令人遗憾的是,那时国内这方面的技术资料很缺乏,不成系统,大家交流的也有限,因此就建了一个主页“看雪学院”,与大家共同探讨加密与解密的知识。这个主页是当时国内惟一一个从技术角度研究加解密的站点,并在广大网友的支持下,健康地成长了起来了。后来,主页提供的软件调试论坛成了国内知名的加解密技术论坛,吸引了密界众多高手。大家以知识共享的精神,无私地将自己所知的技术奉献出来了,至今为止原创了2500余篇文章,极大地推动了国内加解密技术的发展。这是一本很难写的书,因为当时这是一个全新的领域。从Windows95面世以来的6年内,市面上没有一本这方面的书,网上也很缺乏相关资料。为了填补国内Windows平台上加密与解密书籍的空白,作者与软件调试论坛的密界一流好手努力合作,克服种种困难,于2001年9月推出了国内第一本全面介绍Windows平台下软件加密与解密技术的书籍,这就是本书的第一版《加密与解密:软件保护技术及完全解决方案》。在第一版中,我们试图从软件加密和解密这两个方面对当今流行的软件保护技术进行了分析。希望读者看过本书之后,能够对各种流行的软件保护与破解技术有所了解。第一版一面世就得到了广大读者的喜爱和认可,获得了2002年全国优秀畅销书奖(科技类)!在全国很多计算机专业书店获得了名利前茅的销售业绩,而且一年来在著名的华储网销售排行中都被排在前几名内。次年,本书在台湾发行了繁体版,得到了台湾读者的热烈欢迎。为了跟上技术发展的步伐,作者花费了6个月时间做准备,6个月时间进行写作,汇集了国内顶尖软件调试论坛(看雪论坛)的众多密界一流好手,以本书第一版为基础,更新了第一版的大部分内容,最后完成了本书的第二版《加密与解密》。这本500多页的图书,几乎囊括了Windows下软件保护的绝大多数内容,从基本的跟踪调试到深层的拆解脱壳、从浅显的分析注册到商用的软件保护,其跨度之广、内容之深,国内至今尚无同类出版物能与之比肩。内容导读第二版是在一版基础上写成的,删除了第一版中的过时内容,补充了许多新技术。全书有一半的内容与第一版不同,结构更加合理。补充和加强了Windows与Unicode、代码逆向分析、IDA详细操作、SoftICE符号调试技术、OllDbg操作、密码学算法应用、VB的Pcode跟踪、增加PE文件的功能、SEH技术、脱壳技术等。什么是API?什么是Unicode?什么是逆向分析?Winodws9x与Windows2000/XP上的加解密究竟有什么不同?只有了解这些基础知识,在加密与解密过程中才能有的放矢地处理各种问题。本书的基础篇(第1章"基础知识"和第2章"代码分析技术")将系统地解答这些问题。在进行软件解密的过程中,一个首要问题是对被解密的软件进行分析,这部分就是静态分析与动态分析技术。本书以极大的篇幅讲述了这两种分析技巧,包括逆向工程必备工具IDA的详细操作,最新SoftICE和OllyDbg的操作等。这些内容可以在第3章"静态分析技术"与第4章"动态分析技术"中找到。一些软件作者对软件保护方案的策划与实施很不以为然,他们往往自以为保护在解密者眼中不堪一击。希望本部分能让这些软件作者了解一些软件攻击的方法,以便更好地保护自己的作品。在这个年代,研究加解密不掌握点密码学的知识是不可思意的。第二版详细讲解了MD5,SHA,CRC,RSA,ElGamal等算法在软件保护方面的应用,并且光盘上提供了实例的源码!这些内容可以在第5章"软件保护及其弱点"与第6章"加密算法"中找到。现在所使用的语言无非是两种:一种是解释执行的语言,另一种就是编译后才能够执行的语言。解释语言的最大弱点之一就是能被反编译,因此其保护的重点应放在如何防止反编译上。这些内容可以在第7章"反编译语言"中找到。PE是Windows上可执行文件的格式,熟知PE文件将有助于对操作系统的深刻理解。如果你知道EXE和DLL里面的奥秘,就成为一名知识更加渊博的程序员。本书用大量篇幅,图文并貌地详细讲解了PE格式(第8章"PE文件格式")。在掌握PE格式后,就可随心所意地对PE文件做"手术",进行二次开发,如增加菜单、按钮等功能。这部分将带你走进另一个计算机的世界里去(第9章"增加PE文件功能")。SEH的出现已非一日,但有关SEH的知识资料却不是很多。SEH不仅可以简化程序的错误处理,使程序更加健壮,还被广泛应用于反跟踪和加密中。本书从解密角度讲述了SEH的机理,同时讲述了其他各种反跟踪技术,如Anti-Debug、花指令等。软件作者可以将这些技术应用到自己的软件中去,以加强软件的反跟踪能力(第10章"反跟踪技术")。现在,越来越多的软件都采用了加壳保护。当在软件分析和汉化过程中,脱壳是必不可少的一步。第11章"加壳与脱壳"详细介绍了各种壳的脱壳技巧,读者可以在自己的软件中运用这些壳中的先进反跟踪技术。第12章"补丁技术"介绍了文件补丁和内存补丁技术,同时重点讲解了SMC技术在补丁方面的应用。学习补丁是一件很有意思的事情。商用软件保护技术实际就是对商业软件加密的技术,真正有价值的商业软件一般都会采用这些技术来保护。第13章"商用软件保护技术"讲解了常见的商业保护技术,如软件狗,Vbox,SalesAgent,Flexlm等保护,而且对这些保护的优缺点进行了分析。对读者的要求本书适合以下读者。对软件加密与解密感兴趣的读者对软件保护感兴趣的软件开发人员对逆向工程感兴趣的读者对调试技术感兴趣的读者使用本书需要具备以下知识。汇编基础知识。此类书籍市面上很多,如《IBMPC汇编语言程序设计》等。应了解C语言。了解C语言的某些知识是有帮助的,但不是必须了解。Win32编程。不管研究加密与解密,还是编程,都必须了解Win32编程。Win32编程就是API方式的Windows程序设计,学习WindowsAPI能使您更深入地了解Windows工作方式。此类书籍有CharlesPetzold所著的《Windows程序设计》,该书堪称经典之作,它以C语言为讲解平台。另一本书是罗云彬所编著的《Windows环境下32位汇编语言程序设计》,它以Win32汇编为讲解平台。到此为止,作者将不再假设您已经具有任何加解密的经验了。致谢感谢我的母校同济大学,她的"同舟共济、自强不息"的同济精神一直指导着我的工作和学习!感谢电子工业出版社计算机事业部对本书的大力支持!同时也要感谢那些共同参与第一版组稿的软件调试论坛的众多密界一流好手,是他们的参与才让此书得以完成。这次的第二版改动较大,参考引用了如下朋友在第一版中参与的文章:1.Blowfish(http://www.shieldsoftware.com/)参与的"软件保护技术"、"Anti-Debug"、"JAVA程序反编译";2.DREAMtHEATE参与的"Windows消息机制";3.DDXia[CCG]参与的"远程调试技术","补丁技术";4.Passion参与的"FileMon的使用"、"TimeLOCK保护";5.Ljtt参与的"花指令";6.Arbiter参与的"FrogsICE使用简介"、"CRC原理篇";7.Ajj(http://ajj.126.com/)参与的"IceDump和NticeDump的使用";8.Fisheep(fisheep@sohu.com)参与的"VBOX4.3"、"SalesAgent保护技术"、"FlexGen工具用法"、"利用FlexLmSDK解密"、"浮点指令小结";9.吴朝相(http://www.souxin.com/)参与的"常用断点设置技巧"及"认识壳";10.mr.wei参与的"DeDe用法";11.邹丹(http://www.zoudan.com)的论文"关于Windows95下的可执行文件的加密研究";12.TiANWEi(http://winice.yeah.net)参与的"SoftICE指令手册"。在第二版的编写过程中特别感谢:1.Hume(http://humeasm.yeah.net/)提供的"指令优化一文";2.老罗的缤纷天地(http://www.luocong.com/)提供的"CRC32实践篇"与"奇妙的Base64编码"两篇文章及实例;3.夜月提供"Blowfish算法解密"一文;4.娃娃(王凌迪)参与的"MD5算法"资料;5.Blowfish的"ReVirgin使用指南","挫败隐藏在SEHhandler中的保护"。同时也要感谢SunBird,Hying,Spring,pll621,Ajj,小楼,Ljtt,Arbiter,Aming,Cooljiang,洋白菜,WinDos2K,小牧童等软件调试论坛的众多朋友的支持和帮助!论坛网友的一言一行都已融进了本书的文字里,实在无法一一列举。特别感谢CCG团体给与的技术支持!关于配套光盘本书所有实例及源码均在配套光盘里提供,大部分实例是使用MicrosoftVisualC++6.0开发和测试的。由于版权问题,配套光盘仅提供书中提到的免费软件或共享软件。如果从学习角度需要使用那些有版权的软件,建议用搜索引擎查找(如www.google.com)。光盘提供的软件经过多方面检查测试,绝无病毒。但一些加解密工具采用了某些病毒技术,因此部分代码与某些病毒的特征码类似,会造成查毒软件的误报。请勿将光盘的文件做成虚拟光驱,并跟踪调试虚拟光驱上的实例,以免出现一些无法解释的错误。建议将文件拷贝到硬盘,并去除只读属性再调试。反馈信息我们非常希望能够了解读者对本书的看法。如果有什么问题或有自己的调试实战故事,欢迎发到作者主页的论坛里,我乐意回答朋友们提出的任何合理的问题,因为当我努力回答这些问题时,也会从中获益匪浅。