《软件加密与解密》试读:译者序

译 者 序 《无隐录》上说:“道与艺,具有正眼。得此而后工力有所施,否则毕世滑茫茫耳!” 。那么软件保护和破解的正眼又在哪里呢?按我的经验,刚学会使用调试器和反汇编器破开了一两个软件的“破解者”是最骄傲的。可不是嘛!你看那些原本不可一世的软件都败在了自己手下,这感觉……可是当他玩得越来越深入,就会遇到越来越多的反击措施。有些反击措施纯粹就是要把你玩死——程序中有时会充满成千上万个防逆向工程的“小把戏”(比如花指令),搞定一两个可能是轻而易举的事,但是在整个破解过程中你也许会遇到几千甚至几万个这样的小把戏!于是愉悦的心情变得沮丧,你不断地重复劳动着,一遍一遍又一遍……直到自己完全崩溃!也许你更聪明些,在彻底崩溃之前,会去“看雪”、“第八个男人”之类的软件保护技术网站逛一逛,下载一些脚本工具,运行一下,就能把这些小把戏统统搞定了。但是如果仅仅满足于这样一个状况,那么你终究只是一个脚本小子(script kid),修不成正果!真正的“黑客”或者“破解者”应该去追寻这些工具是怎么编写出来的,为什么它能工作得这么高效,为什么它就能自动地将程序中的那些恼人的东东全都识别出来,一一搞定,还不出错!如果你有志于这方面的探索,这本书就是不错的参考手册。书中详细地介绍了如何将数学和计算机科学中的一些原理、方法和技巧应用在程序破解中,它将使你功力大增。套用Exploiting Software: How to break code上的一句话:“攻击计算机系统是一个科学过程,就好像一门艺术。事实上,相比其他随心所欲的游戏,挥舞着‘科学方法’这把利器的攻击者占了游戏的上风。” 如果你是个软件工程师,想要保护你的软件免遭破解,这些技巧是必不可少的。为什么呢?因为诸如如何自动理解程序的这些技术对于在软件中加入保护措施也是必不可少的。你一定不想因为添加软件保护措施而给程序引入新的bug,因此使用语义保留的代码转换技术非常必要。如何做到语义保留呢?只有使用“编译原理”中的数据流分析和控制流分析技术,自动理解程序才能做到这一点。而在设计一个同态加密算法 时,你又可以使用近世代数中同态域转换来达到目的。 本书的英文名是Surreptitious Software, surreptitious一词的意思是“保密的,隐瞒的”,所以surreptitious software的意思就是“隐蔽软件”。 本书本质上算是一本教科书,这既是它的优点也是它的缺点。说优点,是因为它巨细无靡地概述了这门学科的全貌,每章都给出了一些思考题,供读者进一步思考。对于有经验的读者,这将大大加深其理论视野,帮助提高其自身功力。说缺点,是因为软件的保护和破解技术是一门实践性很强的艺术,如果读者没有丰富的实践经验就容易陷入空谈的境地,变成“理论家”。由于本书实际上是本教科书,基本上满足于对各种软件保护/破解技术的理论描述,缺少对各种平台下具体分析工具的介绍和案例支撑,因此没有破解经验的读者从中能够得到的收获就相对比较少了。本书假设读者已经拥有了一定的软件保护/破解经验,如果读者没有这方面的经验,可以先阅读一些基础教程,然后再来阅读本书,这样收获会更大些。这就好比小学生不能直接看大学的教材,但是当他长大以后读完高中课程,达到了一定水平,大学教材就是不得不读的。又正如《无隐录》所说:“夫枪难事也,纵得正眼,而造艺(诣)之高下,存乎工力之深浅,秘之 何为?” 有网友戏称:“术语这个玩意儿虽然能让同行之间说话更简洁,但是它最大的作用还是糊弄外行。”的确,译文中术语翻译的好坏也会影响到整本书是否易于理解。对于书中术语的翻译,我采用了如下原则。 对于那些有多个中文译名的术语,我选用其中最易于理解的。比如单词dominate,“龙书”(《编译原理(原书第2版)》,机械工业出版社,2009年1月)中将其译为“支配结点”,“鲸书”(《高级编译器设计与实现》,机械工业出版社,2005年7月)中将其译为“必经结点”。我认为术语“必经结点”(控制流流到结点A之前必然经过的结点)比较好,因为你能很方便地根据这个名称(望文)猜出它的作用(生义),而不需要任何编译原理方面的知识积累,所以在本书中我将单词dominate译为“必经结点”。 对于那些已有对应中文译名的术语,如果我认为中文译名不恰当,会给出我的译法并详述理由。比如第8章中的Planted Plane Cubic Trees,国内有些文献中译为“平面环路树”[比如《基于PPCT和基数k的动态图混合编码方案》(《计算机工程与应用》,2010,46(25))],但是为什么这么译呢?特别是其中的“环路”实在是莫名其妙!难道就是因为cubic和circuit有点像?我给出的译名是“根延伸的平面三叉树”。其中,“根延伸的”(Planted)是指在二叉树的根结点上还延伸了一个结点,作为整棵树的根结点(书中附图中最高的结点是整棵树的根结点,而次高的结点是二叉树的根结点);“平面”则是指这是一张平面图;而“三叉”(Cubic)则来自于这种图的基础图(亦称无向图)版本——在将这种图转换成无向图之后,每个结点(除了根结点和叶子结点)都正好只有3条边,所以称为“三叉”。(详见8.10.4节) 对于那些没有标准中文译名的术语,我尽量给出中文译名。比如Mobile Agent,我根据实际情况将其意译为“网上自动询价机器人”,方便读者理解(详见1.4.1节的第三小节)。 另外,对于极少的单词,我选择不将它翻译出来。比如trace,我就没有把它翻译出来,尽管翻译出来并没有错,但是我认为这类单词是非常常用的术语,在各种工具中也经常使用,最好还是不要翻译。 在翻译过程中,我也发现原书中存在一些错误。如图3-41,作者可能是为了说明函数起始指令(prologue)的重要性,让某条跳转指令多跳了一个字节,于是整个反汇编的结果就出现了一些问题,作者认为这是没有prologue指令给反汇编带来的问题,但是实际上这个解释实在是有些牵强——因为作者分析的程序原本就错了,根本不能正常执行!在翻译过程中遇到这类问题,我都是本着忠实于原文的精神,将原文原封不动地译出,然后再添加注说明我的观点供读者参考。 此外,书中还存在一些“低级”错误,比如将代码清单中的“int”打成了“in0”,这类问题可能是作者在书中加入的水印(因为作者在书中已经声明了这一点,而且在本书的电子版中我也发现作者对各行的行距进行了微调),也有可能是印刷错误,对于这类错误,我直接予以修正了。 原文中有些地方存有歧义,比如算法7.1中的单词dominate,你既可以把它理解成“某些结点的必经结点”,也可以把它理解成“在某些结点之前”。究竟应该怎样理解呢?对于这类情况,我都会去阅读相应的参考文献(因为参考文献的论述更为详细),做出判断。如这个例子中,通过阅读参考文献[59],我确认后一种理解才是正解。 最后,在这本书中,Tamperproofing技术还包括一部分反调试、反模拟技术。但是为了整本书的逻辑连贯性,我还是将原文“Tamperproofing”直译为“防篡改技术”,但这一名称并不足以囊括其所指代的所有技术内容。请读者在阅读时注意。 我衷心地感谢人民邮电出版社图灵公司对本书出版所给予的大力支持,由于李松峰老师、傅志红老师的指导和大力推动,我才能完成本书的翻译工作。 在本书的翻译过程中,team509的wooshi等人提出了宝贵意见,特在此表示感谢。 还有,我要感谢我的爱妻,没有她在这段时间里对我的容忍,并挑起了家中所有的重担,我也不会用这么多时间完成本书的翻译。 本书阅读和翻译起来相对比较吃力,这是因为:一来作为一本准教科书,这本书的学究气比较重一点,措辞比较晦涩;二来本书涉猎了数论、图论、编译原理、通信技术等多门学科,穿插使用了这些学科中的术语和符号,使得翻译的难度也大了不少。再加上翻译时间仓促,书中存在错误在所难免,敬请读者不吝指正。 崔孝晨 2011年5月

>软件加密与解密

软件加密与解密
作者: [美] Christian Collberg, [美] Jasvir Nagra
原作名: Surreptitious Software:Obfuscation,
isbn: 7115270759
书名: 软件加密与解密
页数: 601
译者: 崔孝晨
定价: 99.00元
出版社: 人民邮电出版社
装帧: 平装
出版年: 2012-5-3