综述
当今软件发行商面临的一个最大问题是如何防止软件被非授权使用,而不影响合法用户正常购买与使用软件。
软件盗版,或者称为软件剽窃,是指在互联网上找到的许多逆向工程的信息,可为所有人提供简单易用的工具或攻略。
一个众所周知的事实是,许多国家有版权保护的法律用于软件领域,但法律实施与遵守的程度不同,一些国家因此滋生了大量的软件侵权行为。
软件盗版正在成为一个日益严重并广泛传播的问题,跟踪发现盗版行为非常困难,防范并阻止盗版甚至更加困难。盗版不仅会给软件发行商造成收入上的损失,还会给合法的付费用户带来负面影响,他们最终不得不承担软件非法使用带来的成本。那些积极采取措施保护软件的开发商,是在正确的轨道上,但他们无法完全防止越来越多的威胁他们应用安全性的黑客攻击。一个常见的误解是,一旦应用被保护并分发,就是绝对安全的,可以完全杜绝盗版与知识产权(IP)的剽窃。
对软件开发商而言,与许可提供商或者硬件保护制造商合作,经常升级并改进安全级别是非常重要的。将创新的保护与安全措施嵌入软件,作为产品生命手气的一部分,非常有助于防患于未然。
本文介绍并分析各种用于保护软件、防止盗版与知识产权剽窃方面的机制,这些都是圣天诺外壳(Sentinel Envelope)的部分功能。
工作原理
圣天诺外壳作为一个整体提供强大的知识产权保护,通过文件加密、代码混淆、系统级反调试、外盒加密、代码植入(AppOnChip)等许多高级功能防止逆向工程。每个功能都会考虑多种入侵、破解的技术,从而使黑客破解软件变得极度复杂与耗时,从而保证软件代码在经过各个环节到达用户的过程中是足够的安全。
反调试与反跟踪方法
正常情况下,软件开发者在开发过程中会使用代码调试工具(debugger)检查代码缺陷、跟踪问题。但是,黑客也使用同样的调试工具,试图非法获得软件的访问,探测、跟踪插入的保护代码,最终目的是篡改、停止或移除保护代码。
圣天诺外壳一个强有力的功能是代码调试检测机制,即不断地在后台检测活动的调试器。通过发出一些误导指令与假的信息,外壳可以成功地让调试器“误入歧途”,从而保护程序的主要工作。
另外,外壳可以容易地识别调试器,帮助软件开发商区分“敌友”。外壳还提供检测是否有反跟踪工具已经启用,如有需要,终止被保护的应用程序运行。
因为黑客与开发者使用同样的调试工具,圣天诺外壳必须能够正确分辨是真实开发者还是试图破解的黑客。通过显示一条类似检测到调试工具、停止加载应用的消息,可以实现这一功能。开发者可以关掉调试器以加载并运行应用程序。但是,如果应用程序已经加载并运行却发现调试器在工作,这显然就是黑客试图破解软件的行为,这种情况下应用将停止运行。
保护安全弱点
用任何打包机制保护的应用,都有安全弱点,那就是应用程序与保护代码之间的接缝处。这个一旦被移除,带有许可的保护锁与应用程序之间的联系将被切断,从而使应用程序完全失去保护。因此,这一点就成了大多数黑客发起攻击的目标。他们研究被保护的文件,分析保护代码以及这些代码如何与保护锁联系。一旦理解了这些代码,发现了其位置,他们就可以做以下的事情:
- 特定应用相关的破解 – 断开特定应用文件的保护连接。
- 通用破解 – 如果其他文件采用完全相同的保护方法,并反复出现,就可以很容易断开所有这些文件的保护连接。因此,使被保护的文件与保护层代码之间的接缝处变得难以分辨与跟踪就显得非常必要。圣天诺外壳一个非常强大的功能是可以设置多重障碍,保护这个连接处不被断开。我们支持多层的保护代码,在保护过程中到应用程序上。这些保护层就像火车车厢一样,一层后面接着一层。每一次保护过程,加到应用程序上的各个保护层的顺序都不相同。

这种在每次加壳过程中动态安排保护层顺序的方法,可以确保每个被保护文件的唯一性。即使原文件完全相同,加壳后的文件也不相同,外壳代码中的最后一条指令到应用代码中的第一条指令的转接也不相同。对于每个被保护的应用,源代码开始执行的位置是不同的,这使得外壳与应用程序的连接处变得几乎无法跟踪。分析、理解不同保护层以及它们在保护文件内的顺序,对于破解另外一次加壳得到的保护文件,没有任何帮助。为了使断开外壳与应用的连接变得更加困难,每次加壳产生的保护层不仅顺序不同,层数也不相同。还有,每个保护层采用的加密方式也不相同。而且,在应用运行时,每层使用随机的秘钥对下一层进行解密。
难以理解吗?还有更复杂的。每个保护层的代码还要使用误导操作代码进行混淆,这些误导代码穿插在有效代码之间。这种方法极大地增加了代码分析的难度,从而使得用反汇编工具分析保护机制或获得源代码变成几乎不可能的任务。

检测到破解尝试时改变行为
圣天诺外壳针对调试器的另一项技术叫做“行为变化”。带有许可的保护锁有一段高级的代码,其利用了了一个事实,即操作系统与跟踪器在运行应用程序时行为不同。当一个破解尝试被检测到时(如使用一致性检查),软件的响应行为被延迟,从而断开了“原因”与“结果”之间的逻辑联系。延迟的响应混淆了破解尝试与软件的相反响应直接的真实逻辑联系,从而迷惑破解者。这样的改变程序功能的行为在检测到破解尝试时非常有效的。
私有API
大多数软件保护提供商提给所有客户提供的都是同样的API库,一旦安全入侵发生,这样的库就会成为单点故障。金雅拓提供了更加安全的解决方案 —— 软件开发商特有的API库。
这些私有API在金雅拓的服务器上编译并定制化,可以完全屏蔽隔离黑客的窥视与攻击。私有API可以保证每个开发商获得的都是一个结构不同的库,集成在他们的应用里。作为这个过程的一部分,
针对每个开发商定制不同的私有API都会增加独特的白盒加密秘钥,最后还会使用重度混淆和保护技术。通用攻击对这种方式产生的库几乎无能为力。通常情况下,破解者不可能通过利用一个开发商API库的完全问题,去破解其他开发商的库,从而获取商业利益。圣天诺外壳将下载到开发者机器上的私有API,在保护时插入应用代码。外壳运行时用这些加密的、开发商特有的API对被保护的应用进行合法访问。
无需修改源代码就能访问保护锁
圣天诺外壳的巧妙之处在于只应用于编译后的文件,完全不需要修改应用的源代码。到保护锁的调用被加到应用程序外层的保护代码(外壳运行时)周期性地执行。
白盒加密
金雅拓是业界使用白盒加密技术全面加密通信通道的先驱。白盒加密可以有效防止攻击装理解被保护的应用于保护锁直接的通信内容。基于白盒加密的安全通信通道利用开发商特有的组件保证通道秘钥不能从被保护的二进制代码中解析出来,无论是用动态的还是静态的方法。

代码植入
作为圣天诺外壳最安全的的特征之一,代码植入(AppOnChip)可以将圣天诺硬件保护锁与应用紧密绑定,从而提供目前最为安全的软件保护方案。该功能是一个完全自动化的过程,软件提供商可以从一个列表里选择哪些函数要加载到保护锁里运行。当然,函数的代码只有与AppOnChip功能兼容,才能出现在列表里。这个安全功能使得AppOnChip称为业界最为安全的软件许可实现。另外,AppOnChip功能可以用于保护32位于64位的本地二进制代码(EXE与DLL文件)。AppOnChip的特色与优势包括更强的安全性、易于实现、最大的许可灵活性、最终用户透明以及没有运行负担。
原始入口点保护
原始入口点(OEP)保护是指应用启动的地址,操作系统从这个地址引导应用程序运行。为了破解应用,黑客必须得定位这个地址,移除打包代码,然后试图从原始入口点启动应用程序。
与其他打包工具不同,圣天诺外壳从缺省位置将应用的原始入口点移除,并将其打散放到外壳的运行时代码。黑客试图从打散的代码块中发现重构原始入口点将变得几乎不可能,因为代码块的大小与位置是随机的。
方法级保护
圣天诺外壳通过方法级保护,实现对.NET与Java可执行代码的保护。当.NET与Java程序被选中保护时,外壳将自动决定那些方法时可以加密的。这进一步确保知识产权的安全性,从而提供对任何应用最佳的保护方法。
导入地址表移除
另外一种防止破解的方式是移除被保护应用程序中指向外部DLL函数地址的导入地址表。在应用程序打包过程中移除导入地址表,将其打散放在外壳代码中,使其在硬盘或内存中消失。这意味着每个调入地址操作都被外壳保护并进行内部处理。
此外,每次导入操作解析出的内存位置不同,混淆代码也不同,黑客不得不单独分析理解每次导入操作以获取每一块拼图。对于普通的打包器,黑客可以分析、区分导入地址表的每一个表项。圣天诺外壳则不同,黑客无法使用导入地址表,无法遍历每个表项,因此他们对是否完成破解任务毫无把握。这里最重要的是,圣天诺外壳利用不同的手段隐藏了导入表,导致后面的破解行为失败,从而最终使得“成功破解”几乎完全不可行。
程序代码与外壳代码强绑定
对多数打包器而言,原始应用程序代码与打包器代码是没有绑定的。圣天诺外壳强化了外壳与被保护应用直接的虚拟连接,在保护阶段分析应用代码流程,在此基础上与应用流程深度集成。这种难以分辨的集成方式可以有效防止被外壳攻击装移除。
隐藏字节
内存镜像与克隆是常用的技术,在一些环境下,可以被黑客利用窥视原始应用程序代码。这是黑客破解保护应用的第一步,也是任何成功的反黑客技术的关键所在。
隐藏字节的概念指的是加强被保护应用于外壳代码直接的联系,具体方法是从原始代码的不同位置选择一些随机的字节块,打散并随机地植入外壳代码。这些“隐藏”的字节块在执行被保护应用原始代码时,在新的随机的位置执行。这种机制通过模糊化原始应用代码的结束位置与外壳代码的开始位置,加强了应用代码与外壳代码的关联程度。
代码与符号混淆
混淆是一个将有意义的字符串变成任意一串字符与数字的过程。使用圣天诺外壳,软件开发商能够将混淆用作防止逆向工程的安全措施。缺省情况下,被保护的.NET代码里的所有符号都要被混淆,这是保护过程的一部分。另外,开发商可以选择混淆全部代码还是部分方法。既然代码混淆可能使应用程序的性能变慢,因此在保护时缺省是不选的。开发商可以对指定某个方法做代码混淆。
NI公司LabVIEW应用的保护
圣天诺外壳还可以用来保护国家一起公司(NI)的运行在cRIO-9030或cRIO-9067设备上的 LabVIEW应用(RTEXE)应用。这些嵌入式设备运行NI公司的Linux实时操作系统。支持的用户端设备包括基于LabVIEW 2014/2015的cRIO-903x与cRIO-906x,运行外壳工具的开发商平台包括Windows 7 32/64位以及Windows 10 32/64位。
结论
通过加密部分或整个应用程序文件,圣天诺外壳可以满足不同开发商各种层面的安全方面的需求。安全需要付出一些代价,而且不能保证百分之百的可靠。因此,合理评估应用的安全需求、保护带来的价值以及一些负面影响是非常重要的。通过积极防御窃取商业机密与专有技术的不正当竞争,开发商可以提高自己的竞争优势。外壳技术结合文件加密与代码混淆,对软件提供最强大的保护,从而保护开发商的知识产权。圣天诺外壳不仅提供超强安全性的同时,还非常简单易用,是一个开箱即用的工具。开发商无需花费时间和努力从头开发,而是专注于自己的核心竞争力。