频道栏目
读书频道 > 安全 > 软件加密与解密
1.4.1 代码混淆的应用
2012-08-25 16:07:41     我来说两句
收藏   我要投稿

本文所属图书 > 软件加密与解密

本书介绍了如何利用混淆、水印和防篡改等技术,来保护软件免受盗版、篡改和恶意逆向工程的危害,主要内容包括攻击者和防御者用来分析程序的各种主流方法,如何使用代码混淆技术使程序更难以被分析和理解,如何在...  立即去当当网订购
下面来看看代码混淆技术能用在软件保护的哪些领域中。

1.(防止)软件被恶意逆向分析
这是第一种情况,Doris开发了一个含有某个极具价值的商业秘密(这个秘密可能是一个精妙的算法,也可能是一个高超的设计)的程序。而Axel则是Doris的商业竞争对手,他想把这个秘密搞到手,并把它集成到自己的软件中去,重新包装后再卖给他的客户Carol。如图1-13所示。



图 1-13
当谈论代码混淆技术时,大多数人首先想到的可能就是这种情况。但是,正如下面将会讲到的,代码混淆技术的应用远不止于此。我们假定(虽然我们不会去严格地证明这一假定),只要有足够的时间和资源,Axel总能成功地逆向分析出任何一个程序。换而言之,没有哪个隐含在程序中的秘密能够永远不被发现。Doris的目标只是使用代码混淆技术尽量延长Axel破解所需的时间,同时又不使由此增加的性能开销大到自己承受不了的地步。一般而言,只要代码被混淆得足够复杂,Axel就会放弃攻击,说“算了,我还是自己去研究一下这个该死的算法吧!这样大概还比较快些。”而Drois在混淆代码时一般也会考虑效率问题,即Doris要选择正确的混淆算法(或者混淆算法的组合),对最重要的代码进行混淆,以保证混淆后的代码不会慢到(或大到)客户无法忍受的地步。

2. 数字版权保护

在这种情况下,Doris是个开发多媒体播放器的软件工程师。这个播放器只能播放一种被称为“cryptolope”的加密多媒体(图片或者音视频)文件。由于多媒体文件是以加密形式存在的,所以在播放它之前必须有一个密钥把它解密出来。如图1-14所示。


图 1-14
由于客户肯定希望能“随时随地”观赏到他购买的图片或者音视频文件——播放器很可能会在一些没有网络的地方(比如在飞机上)被使用,所以Doris只能把密钥存储在客户的计算机上,更准确地说是藏在播放器中。当然除了密钥之外,解密的算法也一定要在播放器中实现的。此外,播放器中还需要有一个解码器,它的作用是把解密后的多媒体文件解码成你能听见或者看见的模拟信号[1]。这样一个播放器的整个解码过程如图1-15所示。



图 1-15
你大概已经注意到,这一过程中Axel有3个攻击点。他可以去寻找密钥(如果这个密钥是个通用密钥的话,Axel甚至可以解密所有用于这种播放器的多媒体文件,而且如果解密后的多媒体文件中不再含有专门用以识别Axel的签名,Axel还可以在网上把它们卖掉),也可以去获取解密后的数字多媒体信号,甚至他也可以截取解码后输出的效果并不理想的模拟信号。这类软件中可能存在很多薄弱环节。首先,Doris可能毫无理由地会相信Axel不是很熟悉程序中使用的解密算法。所以,除非实现解密算法的代码已然经过了混淆处理,否则攻击者就能通过模式匹配的方法[2],一下子找到用来实施解密的代码以及解密时所用的密钥。Axel也可以使用动态分析的方法进行攻击。比如,加解密算法中一般都含有一些比较特别的操作模式(比如不断地执行含有大量异或操作的循环),要是不进行代码混淆的话,攻击者可以很容易地通过trace发现解密算法。密钥本身也是一个薄弱环节。密钥通常都是一个很长的非常随机的字节串,这些东西放在正常的程序里显得很扎眼。所以Axel只要对整个程序进行一次搜索,通过寻找那些看上去随机得离谱的东西就能把密钥找出来。而那些用到这些字节串的代码很可能就是解密代码。一旦Axel找到了解密代码,他就能很快找出解密后的多媒体文件是在哪里生成的,以及它们是如何被传递给解码器的。接下来,Axel只要往程序中插入一小段代码,把解密的结果写到他指定的文件里去就大功告成了。从这个案例中,Doris所得到的教训是:她必须要对自己的代码进行混淆处理,这样Axel就不能仅仅依靠模式匹配这种小伎俩轻易地找出解密器和解码器的位置以及两者之间传递数据的通道了。另外Doris还必须在代码中使用防篡改技术,以防止Axel在程序中加入新的代码。最后,Doris除了要混淆静态的代码之外,还必须对程序的动态行为及数据(比如密钥)进行混淆。干完了这一切之后,她还是必须要明白,这些保护措施都只不过是权宜之计,只要有足够的时间,Axel还是能攻破她设置的防线。所以她还必须事先想好软件被破解之后该如何应对。

3. 网上自动询价机器人

Doris往互联网上发送了一个网上自动询价机器人(Mobile Agent),这个机器人会依次向所有网上商城询问某个CD的价格,然后告诉Doris哪个店开的价最便宜[3]。当然,坏蛋Axel现在也在网上开了家小店。不用问,他现在想的就是如何擦掉询价机器人中的记录,让自己的价格(当然这个价格是比较贵的)变成网上最低价。如图1-16所示。



图 1-16
但对于Axel来说,光做到这一点还不够[4],要是在机器人在离开他的站点之后(当然这时Axel的报价已经被改成网上最低价了),再去访问的其他站点中还有比他更低的报价的话,他还是白忙一场!所以Axel还要修改机器人的代码,使其离开他的站点之后就再也不会去修改网上最低价了。只有这样他才能保证在Doris那里,最低价一定是他的。

在这里我们当然也要建议Doris对机器人进行混淆处理(就像在许多其他情况中一样)[165],以缓解攻击。通常在这种情况下Axel可能没有足够的资源(毕竟他可能要同时处理多个并发的请求)来对机器人进行逆向分析并修改它的代码。而且,如果机器人在Axel的站点中逗留时间过长的话[5],仅此一点也足以引起Doris的怀疑。此外,Doris还可以用不同的混淆技术分别对不同的机器人进行处理,这样即使Axel之前分析过Doris的机器人,也只能再次从头开始,而不能利用之前的经验加速分析/修改这一过程。

4. 网格计算

Doris要运行一个程序P,但是她的计算能力不够,所以购买了Axel的超级计算机上一些CPU时间以运行P。这一过程中,她必须把程序P以及为了运行P必须输入的数据发送到Axel这边,然后再从Axel这里读取计算结果,如图1-17所示。现在问题来了:如果P、输入的数据以及计算结果中的一个或者多个需要保密,Doris该怎么办?



图 1-17
Doris要担心的还不光是这些,她还要担心Axel是否会修改她的程序。如果不能确认P在Axel的机器上的完整性,Doris也就无法确认Axel返回给她的结果是否有效。

要想保证输入输出数据不被偷窥,Doris可以加密输入和输出,还要把P改造成能直接处理加密输入,产生加密输出的形式。这基本上都是非对称式加解密所研究的问题,但是这种方法实现起来效率实在太低,基本无法在实践运用。

加密这条道走不通的话,Doris还可以使用本书中介绍的方法——对代码进行混淆以保证算法不被剽窃,在程序中使用防篡改技术以保证其完整性。而要保持输入和输出的机密性,只要使用类似在数字版权管理系统中使用的方法就可以了(在这类应用中,代码混淆和防篡改技术是用来保护实现加解密操作的代码的)。
网格计算中实现软件保护相对而言是比较困难的。因为除了要考虑算法和数据的保密性及代码的完整性之外,最重要的是必须要考虑添加保护技术之后程序的性能!毕竟Doris把P交给Axel运行的初衷就是利用Axel的超级硬件使程序跑得更快些。如果应用保护技术会引起程序性能的大幅下降,我想Doris是无论如何都高兴不起来的。

5. 系统变形

代码混淆技术也能被用于操作系统防病毒这个方向[74,75]。基本思路是:Doris可以使用代码混淆技术随机化她的代码,使得每一段代码都不一样,这样恶意软件就无法定位或者利用已知的安全漏洞来攻击Drois的系统了。比如在移动设备上,对于同一个系统(如图1-18中的P),我们可以把它处理成多个发布版本(如图1-18中的P1、P2、P3):要是每个版本的代码都被混淆成完全不同的样子的话,那么除非Axel的病毒变得极其聪明,否则它就休想感染所有的系统。



图 1-18
这就是所谓的“系统变形”。当然,病毒的作者们也使用这一技术来实现病毒免杀,而且还取得了不小的成功。下一节将讨论这一点。


[1]所谓模拟信号是指相对连续的信号,这里模拟信号就是指播放器产生的图像、声音。因为这些信号基本上都是连续变化的。下同,不再赘注。
[2]比如使用IDA FLAIR(这个工具的原理就是模式匹配)就能很方便地识别出很多常用的加解密算法,要是你的解密器中很不幸地使用了这些算法中的一种……,顺便说一句,要做到这一点攻击者甚至不必熟悉加密算法的实现细节!
[3]背景知识:所谓的Mobile Agent是指这么个东西:本质上说,Mobile Agent是一个exe文件,Doris可以设置它去网上10个站点询价。当Doris把它发送到第一个站点去之后,它就会在第一个站点的这个计算机上执行,进行一些操作(比如询价)。如果该站点的报价比之前得到的最低价还要低,就把这个价格记为最低价并记录该卖家的信息,否则就什么也不做。操作结束之后,这个Agent就会自动把自己打包发送到第二站去,并在那台计算机上继续执行……最后它会回到Doris那里,告诉Doris网上最低价是多少,以及这个最低价出现在哪里。因此,在这里我把Mobile Agent意译为网上自动询价机器人。对于读者您,您必须要明白的是:这个Mobile Agent实际上是一个会“飞”到你的计算机上来执行,然后“飞”走的,带有秘密数据的(这里就是网上最低价)可执行文件。明白了这一点之后,读下面的内容时您才不会觉得一头雾水。
[4]Axel:做个坏蛋我容易吗?!
[5]c#_ftnref5" name="_ftn5" title="">毕竟机器人自动完成询价只要花很短的一段时间就够了。
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.4 代码混淆
下一篇:1.4.2 混淆技术概述
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站