http://www.qtcn.org/bbs/read-htm-tid-58725.html
2015年2月17日(周二)发布
开源应用的精神是开放的,鼓励人们在契约精神下对应用进行调整、修改和进一步的开发。而商业应用或设备有时则被期望是封闭的,并可以防止被修改。Qt采用双重法律授权模式,其提供的商业授权模式,非常适合用来设计封闭的应用和设备,并可以对其形成多种保护。虽然黑客无孔不入,但我们可以使基于Qt的应用或设备变得难于被攻击。
在这篇博文中,我把保护您的应用的方式分成三类:法律保障、程序应用保护和外部保护。我把重点放在一些可以加大逆向工程难度的方法上,而不是使二进制文件完全免于被篡改或拷贝。如果您希望系统得到全面的保障,需要采用多种方式,使逆向工程的难度加大。
法律保障
虽然开源授权模式使基于Qt的应用和设备不得不对黑客和恶作剧开放,Qt的商业授权模式则可以帮助其避免此类行为。Qt的商业授权模式可以提供的重要法律保障手段之一就是禁止修改和逆向工程----并采取各种方法来阻止这些行为。通常,一些应用或设备的最终用户许可协议会规定禁止逆向工程。但实际上,对于开源授权协议下创建的Qt应用或设备,创建者是无权禁止对其进行的逆向工程或修改的,无论是在最终用户许可协议中规定,还是试图加大难度均不可以。除了法律保障,Qt的商业授权模式还可以帮助您采用技术手段来保护您的应用或设备。
程序应用保护
由于采用Qt商业授权模式可以从法律上禁止修改和逆向工程,创建者也就可以顺理成章地采取措施来阻止这些行为。静态链接是最简单的保护方法之一,因为它可以防止应用使用的Qt二进制文件被修改,也可以使逆向工程的难度加大。使用静态链接时,应用和Qt类库合并到同一个二进制代码中。与使用动态链接的应用相比,黑客需要采取更加困难和耗时的方法来修改系统的行为。
在使用静态链接时,另一个进一步防止逆向工程的措施是把符号名从二进制文件中剥离。根据您使用的编译器,这项措施可以针对发布版本自动完成,也可以作为静态链接二进制的额外步骤来完成。例如,MSVC自动从静态链接的Windows发布二进制文件中删除符号名。在Linux和Mac系统上,这个步骤则可以通过strip命令来完成。一旦符号表从静态链接的二进制文件中被删除,逆向工程就可以很好地被防止。这些步骤简单易行,并且不需要修改Qt应用源代码。因此,使用静态链接并删除符号可被视为对二进制文件进行模糊处理,以及增加逆向工程难度的最有效方法。
如果需要使用动态链接,只要将动态链接的Qt类库改为新的版本(通过用libinfix更改类库名,如将libQt5Core改为stgElse),就能起到一定的防护作用。另一种方法是用配置选项更改所用的命名空间–qtnamespace。命名空间的Qt将所有类放入一个定义的命名空间,例如,QString被称为someNewName::Qstring。除了使用libinfix和命名空间,也可以为Qt应用使用通用的c++混淆器。对动态链接类库采取的这些措施所获得的保护效果通常不及使用静态链接的效果。当考虑模糊处理的程度时,应该注意,无论对多少代码进行模糊处理,最终仍有可能发生逆向工程。
对于Qt Quick应用,如果希望保护应用的QML部分,建议使用Qt Quick Compiler。虽然应用逻辑(通常是最需要保护的部分)通常是用c++编写的,并总被编译成二进制代码,但进一步保护应用的QML部分是一种很好的措施。Qt QuickCompiler将QML编译为二进制文件,并防止读取应用的QML部分。Qt QuickCompiler的另一个好处是可以提高应用的性能,尤其是在启动时刻。
外部保护
因为Qt应用就像运行在您的目标操作系统和硬件上的其它二进制文件一样,所以您可以采取所有通用的手段来保护您的环境。操作系统可以给应用加上数字签名,就像通过应用商店销售的应用一样。还有许多不同的产品可为应用程序二进制文件提供保护,而这些产品通常也对Qt应用有效。
对于嵌入式设备,由于黑客难以进入和修改物理设备中嵌入的软件,所以即使没有用到任何特别的安全硬件,其也能够受到一定程度的保护。最有效的保护是让硬件包含功能,以防止被修改的二进制文件运行(无论是在设备硬件还是例如USB加密狗的外部设备中)。在某些情况下,也可以利用另一个系统,通过网络链接提供防篡改保护。静态链接和模糊处理二进制文件使逆向工程变得困难,但只有目标硬件和操作系统的外部保护机制才能提供全面的保护。应当注意的是,与其它防止用户变更或修改Qt类库的措施一样,利用外部保护通常也需要使用Qt商业授权协议。在涉及到是否应该允许用户运行修改过的应用时,LGPLv2.1版授权协议的规定有些含糊,但这似乎是有意为之。LGPLv3授权协议中则明确规定,用户在被允许修改开源类库的同时,必须能够运行作为系统一部分的被修改的类库,并且必须提供实现这些修改所需的工具。
总结
如果希望创建封闭的应用或设备,应该采用Qt商业授权协议。只有使用商业授权协议,您才可以利用多种方式增加对Qt应用或设备的功能进行修改的难度:
- 使用Qt商业授权协议,即可以在最终用户许可协议中禁止逆向工程并可以在法律保护下采取相应措施预防此种行为的发生。
- 防止修改和逆向工程的简便方法是使用静态链接代替动态链接,并把Qt嵌入与您的应用的二进制文件,以防止更改Qt类库。
- 使用静态链接时,必须使用发布版本,并在必要时手动删除符号,然后再分发二进制文件。
- 如果需要使用动态链接,只需通过用不同的类库名构建Qt(使用libinfix并更改所用的命名空间),就可以在一定程度上防止逆向工程。这主要是防止用户能够轻易更改动态链接的Qt类库。但通过静态链接防止逆向工程效果会好得多。
- 使用Qt QuickCompiler将QML编译为二进制文件,并防止读取应用的Qt Quick部分,是进一步保护您的应用的有效方法。
- 不需要提供修改设备中嵌入软件的可能性,可以利用硬件和操作系统的功能来防止修改系统软件。
如果您想了解更多关于保护您的应用的方法,请随时联系我们。我们可以通过技术和法律授权方式,帮您实现对应用的保护。