软件加密与解密前言
好了,现在来说说为什么要看这本书,谁在用隐蔽软件,这本书会讲些什么。
为什么要看这本书?
与传统的安全研究不同,隐蔽软件不关心如何防止计算机被计算机病毒入侵。它关心的是计算机病毒的作者如何阻止别人分析病毒!同样,我们也不关心软件是否存在安全漏洞。我们关心的是如何在程序中偷偷添加一些只有在程序被篡改时才会执行的代码。在密码学领域,加密数据的安全性取决于加密密钥的保密性,而我们现在研究的正是如何隐藏密钥。软件工程中有很多软件度量技术来保证一个好的程序结构。这本书将使用同样的技术使程序变得复杂和难以阅读。本书描述的很多技术都是基于编译器优化技术开发的算法,但编译器优化的目的是让编译器生成的程序尽可能小,尽可能快。然而,使用本书中介绍的一些技术会使生成的程序变得很大,执行起来很慢。最后,传统的数字水印和隐写术试图将待隐藏的信息隐藏在图像、音频、视频甚至纯文本文件中,而隐写软件则将待隐藏的信息隐藏在计算机代码中。
那么,为什么要读这本书呢?为什么要了解一种无法防止电脑被病毒或蠕虫攻击的安全技术?为什么要学一门只会让代码变大,执行速度变慢的编译优化技术?为什么要把精力花在违反密码学基本前提(即密钥不能被攻击者获取)的密码学分支上?
答案是,传统的计算机安全和密码学的研究成果有时无法解决实际工作中遇到的、急需解决的安全问题。例如,这本书将展示如何使用软件水印技术来防止软件盗版。软件水印是嵌入在程序中的唯一标识(类似于信用卡的卡号或版权声明)。通过这种识别,程序的副本与您(程序的作者)或客户相关联。如果你在市场上发现了自己软件的盗版光盘,你可以通过盗版软件提取的水印,追踪到从你这里购买这个盗版软件的主人的家伙。在提供给合作伙伴时,您还可以在新开发游戏的测试版中添加数字水印。如果你觉得有人泄露了你的代码,你可以(从很多合伙人中)找到肇事者,把他告上法庭。
再比如新版本的程序中加入了新的算法。当然,你不希望竞争对手得到这个算法,并将其添加到他们的软件中。这时候你就可以把程序搞乱,让它尽可能复杂,让竞争对手的逆向分析软件效率低下。而如果你真的怀疑有人抄袭了你的代码,这本书也会教你如何使用软件“胎记”来证明你的怀疑。
比如你的程序包含了一些未知的代码,你想确定没有这些代码程序就不能正常运行。比如你肯定不希望黑客修改程序中的软件许可验证码,或者数字版权管理系统中可以用来解密mp3文件的密钥。第七章将讨论各种防篡改技术,以确保被篡改的程序停止正常运行。
听说你把密钥放在可执行文件里了?多么糟糕的主意!以往的经验告诉我们,任何类似的“秘密,也就是安全”的做法,最终都会以失败告终,无论如何在程序中隐藏密钥,都逃不出顽强的逆向分析师的手掌心。当然,必须承认你的做法还是对的。本书介绍的所有技巧都不能保证软件永远免于黑客攻击。不需要保证什么东西永远保密,程序永远不被篡改,代码永远不被抄袭。除非在这个研究领域有重大突破,否则我们所能期待的就是拖延对方的进攻。我们的目标是让攻击者的攻击速度慢到足以让他觉得攻击你的软件非常痛苦或者代价很大,从而放弃攻击。可能是攻击者耐心的花了很长时间来突破你的防御,但这时候你已经从这个软件赚够了钱,或者你已经使用了更新版本的代码(这时候他得到的东西就一文不值了)。
比如你是付费频道的运营商,用户可以通过机顶盒收看你提供的电视节目。每个机顶盒都有标签——分配给每个用户的唯一ID存储在代码的某个位置,这样你就可以根据用户的付费决定是允许还是拒绝特定用户观看频道中的节目。但现在一个黑客团伙发现并反汇编了这段代码,找到了计算用户ID的算法,并在网上低价向网友出售修改用户ID的方法。这时候你该怎么办?你可能想到过用防篡改的智能卡,但是这个东西并没有看起来那么难破解,这个会在第11章中解释。或者您可能会想到混淆代码,使其更难分析。或者可以使用防篡改技术,让程序一被修改就自动停止运行。更有可能的是,您将混合使用上述技术来保护您的代码。但是尽管使用了所有的技术,你仍然要知道并接受这样一个事实,你的代码仍然可能被破解,秘密仍然会被泄露(在这种情况下,机顶盒中的用户ID仍然会被篡改)。这是怎么发生的?这只是因为“不公开就安全”的想法从根本上是有缺陷的。但是既然这本书介绍的所有技术都不能给你一个“完美而长久的安全保障”,那为什么还要用这些技术,还要买这样一本书呢?答案很简单。代码抵御黑客攻击的时间越长,订阅该频道的客户就越多,机顶盒升级的周期也就越长,所以你赚的钱和存的钱就越多。
就这么简单。
谁会使用秘密软件?
许多知名公司都对秘密软件感兴趣。事实上,很难真正知道这项技术在实践中的使用程度(因为大多数公司对如何保护他们的代码绝对守口如瓶),但我们仍然可以根据他们的专利申请和所有权来猜测他们对隐藏软件的兴趣。微软拥有许多软件水印、代码混乱和软件“胎记”,并成功创办了一家公司。苹果有一项关于代码混淆的专利,很可能是用来保护其iTune软件的。Convera是英特尔公司的一家独立企业,专注于应用于数字版权管理的代码防篡改技术[27,268-270]。从加拿大北方电信分离出来的斗篷公司也是这一领域最成功的企业之一。该公司有一项专利叫做“白盒加密”[67,68,182],将加密算法和密钥隐藏在程序代码中。5438年6月+2007年2月,斗篷公司被主要从事付费电视业务的荷兰公司爱迪德以7250万美元收购。即使是相对后来者的太阳微系统,也在代码混淆领域提交了一些专利申请。
Skype的VoIP客户端也使用类似于Arxan[24]、Intel [27]和[89]的代码混淆和防篡改技术,这些技术将在本书中提到,用于反向工程加固。对于Skype来说,保护其客户端的完整性无疑是极其重要的,因为一旦有人成功解析其客户端软件,分析出Skype所使用的网络协议,黑客就可以编写出廉价的程序,可以与Skype软件正常通信(在这种情况下,人们就不必使用Skype)。因此,保持网络协议的私有性将有助于Skype拥有庞大的用户群,这很可能是易贝在2005年以26亿美元收购Skype的原因。事实上,隐蔽软件技术的使用也为Skype赢得了足够的时间成为VoIP技术的领导者。即使此时对Skype协议进行了分析(就像黑客所做的那样,详见7.2.4节),黑客也不可能想出一款类似的软件,能够撼动Skype的市场地位。
学术研究者从不同的角度研究了隐蔽软件技术。一些有编译器和编程语言研究背景的研究人员,比如我们,自然会加入这方面的研究,因为大部分涉及代码转换的算法都会涉及到静态分析,这是编译优化技术的研究人员所熟悉的。虽然在过去,大多数密码学家不屑于研究“隐私即安全”的问题,但最近一些密码学家已经开始将密码学相关技术应用到软件水印中,并发现了代码混淆技术的局限性。来自多媒体水印、计算机安全和软件工程的研究人员也发表了许多关于隐蔽软件的文章。不幸的是,由于缺乏专门的出版物和学术会议(供研究人员相互交流),该领域的研究进展被大大推迟。事实上,为了让这些研究成果被传统的学术会议和期刊所接受,研究人员一直在努力,并且还在努力。目前已发表隐蔽软件研究成果的学术会议有ACM关于POPL(编程语言原理)的研讨会、信息隐藏研讨会、IEEE软件工程研讨会、高级密码学会议(CRYPTO)、ISC(信息安全会议)等关于数字版权管理的学术会议。随着隐蔽软件领域的研究越来越成为学术研究的主流,我们有望出现专门研究隐蔽软件的期刊、座谈会甚至研讨会,但遗憾的是这一切至今都没有实现。
军方也在秘密软件上花费了大量精力(和纳税人的钱)。比如库索特公司拥有的软件水印算法专利[95]就属于世界第九大国防工程承包商法国泰雷兹集团。以下是从最新(2006年)美军招标文件[303]中引用的一段关于AT(防篡改)技术研究的话。
目前,所有美军项目执行部门(PEO)和项目经理(PM)在设计和实施相关系统时,都必须使用军方和国防部制定的AT策略。嵌入式软件是现代武器系统的核心,是最需要保护的技术之一。AT技术可以有效保证这些技术不会被其他国家(人)在逆向工程中分析利用。在没有at技术保护的情况下,很容易对标准编译器编译生成的代码进行逆向分析。逆向工程分析师在分析软件时,会用到很多工具,比如调试器、反编译程序和反汇编程序,也会用到各种静态和动态的分析技术。使用AT技术的目的是让逆向工程变得更加困难,从而防止美国的技术优势被其他国家窃取。在未来,有必要为陆军的PEO和预防性维护提供更有用、有效和多样化的自动测试工具集...开发AT技术的目的是提供一个可以抵抗逆向工程分析的高强度外壳,最大限度的延缓敌人对受保护软件的攻击。这样,美国就有机会保持其在高科技领域的优势,或者减缓其武器技术的泄露。最终美军可以继续保持技术优势,从而保证军备上的绝对优势。
这份招标文件来自美军的导弹与太空计划(设计部),重点是实时嵌入式系统的保护。我们有理由相信,这份招标文件的原因是美军担心向敌人发射的导弹因种种原因落地后不会爆炸,从而让敌人有机会接触到嵌入导弹的控制软件,引导导弹飞越目标。
以下是美国国防部[115]的另一段话。
主动软件保护(SPI)是国防部的职责之一,它必须开发和部署相关的保护技术,以确保包含国防武器系统关键信息的计算机程序的安全。SPI提供了一种全新的安全保护方式,它不保护计算机或网络的安全(像传统的安全技术一样),只是加强了计算机程序本身的安全性。这种新方法可以显著提高国防部的信息安全。SPI的应用非常广泛,从桌面到超级计算机的所有程序都可以通过SPI技术得到保护。是完整的一层,是“纵深防御”的范例。SPI技术是对网络防火墙、物理安全等传统安全技术的补充,但其实现并不依赖于这些传统安全设备。现在,SPI技术已经部署在选定的HPC中心、超过150个国防部门和其他由商业公司建设和维护的军事基地中。SPI技术的广泛部署将有效增强美国和美国国防部对关键应用技术的保护。
上面这段话说明了什么?说明美国国防部不仅关心导弹是否会落入敌方领土,还关心运行在自己的安全系数和性能都很高的计算机中心的软件的安全性。事实上,窃密和反窃密是反间谍机构和情报部门之间永恒的主题。例如,战斗机上的一个程序需要更新。这个时候我们很有可能用笔记本电脑连接这个战斗机进行更新操作。但是如果这台笔记本电脑不小心丢失了,或者只是像电影中经常出现的那样被其他政府以某种方式控制了,会发生什么?对方会立即拿相关代码进行逆向工程分析,并利用分析结果改进其战斗机上使用的软件。更有甚者,对方会悄悄给你的软件加一个特洛伊马,让飞机在某个时间从天上掉下来。如果不能绝对保证上述场景是100%不可能的,那么隐蔽软件至少可以作为最后一道防线(至少事后也可以追究责任)。例如,飞机上的软件可以用有权访问相关软件的人的ID制作指纹签名。如果有一天,这些代码在其他国家的战斗机上被发现,我们可以立即逆向分析这些代码,进一步计算出谁是泄密的元凶。
什么?我听到你说,我为什么要对如何在政府和商业巨头之间保护他们的秘密感兴趣?如果黑客破解了这些软件,也只是通过自己的劳动获得了一些微薄的利益。话虽如此,但这些防护技术带来的好处最终还是要大于它们给商业巨头带来的好处。原因是对你来说,法律保护措施(如专利、商标、版权)只有在你有足够的财力去法院起诉对方的情况下才会起作用。换句话说,即使你认为一个大公司通过破解你的代码剽窃了一个有巨大“钱”的创意,你也不可能通过那场马拉松式的诉讼去法院起诉微软,除非你有足够的资金实力在这场金融竞争中生存下来。本书讨论的保护技术(如代码混淆和防篡改)价格低廉,易于使用,中小企业和商业巨头均可使用。而如果此时起诉这家大公司,还可以利用水印或软件“胎记”等技术,在法庭上当场展示代码抄袭的真实证据。
最后不得不简单提一下另一类极其擅长使用隐藏软件的人——坏人。该病毒的作者已经能够非常成功地利用代码混淆技术对病毒代码进行伪装,从而逃避杀毒软件的检测。值得一提的是,当人们使用这些技术(如保护DVD、游戏和有线电视)时,往往会被黑客破解,但当黑客使用这些技术(如构建恶意软件)时,人们就很难对抗了。
这本书的内容
隐蔽软件研究的目的是发明一种算法,能够尽可能的延缓对手(逆向工程分析)的进度,同时尽可能的减少因为使用这种技术而在程序执行中增加的计算开销。同时还需要发明一种评测技术,这样才能说“在程序中使用算法A后,黑客攻破新程序比原程序多花费T个单位,新程序的性能开销为0”,或者至少应该说“与算法B相比,算法A保护的代码更难被攻破”。特别需要强调的是,对隐蔽软件的研究还处于起步阶段。虽然我们会在书中给你介绍所有相关的保护算法和评测算法,但是这门艺术的现状还是不太理想(到时候你不能太失望)。
在本书中,我们试图将当前所有关于隐藏软件的研究成果进行整理,系统地介绍给读者。我们力求每章涵盖一种技术,并描述这种技术的应用领域和目前可用的算法。1章会给出隐蔽软件领域的一些基本概念;第2章以对抗性演示模式介绍了黑客在逆向分析软件中常用的工具和技巧,然后介绍了如何根据这些工具和技巧来防范黑客的攻击;第3章详细描述了黑客和软件保护者用来分析计算机程序的技术;第四章、第五章和第六章分别介绍了代码混淆的相关算法。第七章介绍了防篡改技术的相关算法;第八章和第九章分别介绍了与水印相关的算法。第10章介绍软件“胎记”相关算法;第11章描述了基于硬件设备的软件保护技术。
如果你是一个企业管理者,只对隐藏软件的研究现状以及这些技术如何应用到你的项目中感兴趣,那么只需阅读第1章和第2章。如果你是有编译器设计背景的研究人员,建议跳到第三章开始阅读。但是下面的章节最好按顺序读。这是因为...呃比如代码混淆章节介绍的知识会用到介绍水印技术的章节。当然,在写这本书的过程中,我们还是尽量让每一章都独立,所以(如果你有一些背景知识的话)偶尔跳过一两章也不错。如果你是一名工程师,想利用相关技术来加强你的软件,强烈建议你仔细阅读第三章的所有内容,如果可能的话,还应该做一些编译原理的教材,来弥补“程序静态分析”的知识。然后就可以跳到自己感兴趣的章节,随意阅读。如果你是大学生,把这本书当成课程教材来读,那就一页一页的读,期末别忘了复习。
我希望这本书能做两件事。首先,我希望向各位读者证明,在代码混淆、软件水印、软件“胎记”和防篡改方面有大量精彩的想法,值得你花时间去学习,这些技术也可以用来保护软件。其次,我希望这本书能够收集目前该领域所有有用的信息,从而为隐蔽软件的深入研究提供一个良好的起点。
克里斯蒂安·科尔伯格和贾斯维尔·纳格拉
2009年2月2日(土拨鼠日)
附言其实写这本书还有第三个目的。如果,在阅读这本书的过程中,你突然顿悟,想出了一个绝妙的主意,进而激发了你投身于隐藏软件研究的雄心,那么,亲爱的读者们,我的第三个目标实现了。请告诉我们你的新算法,我们会将它添加到本书的下一版中!