作者:Christian Collberg, Shawna McAlearney, Jasvir Nagra 2009 12 7

译者:刘晓日

Christian Collberg与Jasvir Nagra一同讨论软件开发中各种防护措施的优缺点,来帮助大家选择最适合的方式来保护知识产权不被侵犯。

作为代码极客应该知道保护知识产权(IP)-这样不好吧,简称为IP,差点儿就翻译成IP地址了-的重要性,保护他们不被非法复制、修改,或者被反编译。但是在同等的性能和努力下,哪种方法才是最适合特定项目的呢?Christian Collberg和Jasvir Nagra在Surreptitious Software: Obfuscation, Watermarking, and Tamperproofing for Software Protection一书中分享了工具和技术帮助你打败那些干坏事儿的家伙。Shawna McAlearney还让他们分享一些他们的心得,这样大家就不用一个人在痛苦中学习了。保护代码安全已经变成了攻击者攻破代码保护和开发人员捍卫自己劳动成果之间“斗争”的代名词。你能做的就是不让你的程序变成攻击者感兴趣的目标。当然还不能降低用户体验,也不能让程序备份变的很困难。正如作者所说的那样:如果开发人员屏蔽用户认为合理的操作,他们反而更愿意去破解程序或者使用非法版本的程序。

很多开发人员将全部精力投入在效率和尽可能少bug的代码上,却很少去保护他们。然而,个人的知识产权是非常值得花精力去保护的。内部威胁是保护措施首要考虑的一项,它的动机可能来自于商业目的,阴谋破坏或者报复等。局内人通常可以合法的访问到代码,并且可以长期进行破坏。

了解攻防最佳实践有助于在项目中做出正确的抉择。表单加密,水印,模糊算法,哪个才会是最适合的呢?下面是Christian Collberg和Jasvir Nagra对他们认为最健壮的4个方法优缺点的介绍:

静态水印算法(Static watermarking algorithms )是将作者的名字会嵌入到组成程序的字节中,这种方式很高效,而且也不影响程序的执行。但是水印很容易就可以通过在程序中插入Nop指令(No Operation Performed)来删除,进行语义保留指令重排,甚至通过对程序加密,在内存中解密程序执行前加入桩(Stub)。

在硬件中嵌入解密密钥,可以很好的抵御软件方面的攻击,但是如果密钥需要从存储它的位置传到CPU中进行解密,那么就无法躲过硬件攻击。一旦这个密钥被破解,密钥就可以随便地共享出来,以用来破解软件。

通过校验程序加载到内存中部分的篡改校验方式可以有效地防止攻击者修改在指定硬件上运行的程序。但是如果硬件允许攻击者陷阱访问加载程序的内存区域,他就可以有效地并且不知不觉地修改程序,同时可以重定向任何自检代码去读取本身的原始副本。

使用指纹识别代码(fingerprint code)或者为程序的不同拷贝使用不同的模糊算法来增加难度,不让攻击者使用一种攻击方法就可破解程序的全部拷贝。然而,攻击者会发现任何两个程序的副本都是使用两种不同的方式进行加密,也会知道关于底层解密程序相关的东西。所有必要的识别必须通过指纹识别,并且减少攻击者可见代码数量,不让他们知道应该去攻击什么。

Christian Collberg与Jasvir Nagra告诉我们,当开始对代码采取保护措施时,时刻将如下几条铭记于心,这样基本上你就可以通往成功的道路。

  • 仔细权衡选择那种保护代码的方式,因为他们会影响效率。
  • 选择隐式的软件保护代码。保护代码应该尽量融合到其他代码中,而不应该凸显出来,告诉攻击者,可以攻击这里。
  • 选择多种防护算法。这样攻击者攻破一个程序,不至于对另外受保护的程序产生影响。不过要注意,使用多种防护算法同样会影响性能。
  • 记住,只要攻击者坚持不懈,并拥有超群的技术,那么所有保护措施都是徒劳。

原文链接:http://www.informit.com/articles/article.aspx?p=1411505

本文参加 Translate Geeks to Chinese 翻译活动