李璇 李林鹏 李理
摘要
从软件保护角度出发,研究对可执行文件进行加密与压缩操作,仅在载入内存后才对其进行解密操作,能够很好地保护软件信息。提供多种软件保护方案,兼顾用户体验与其实用性、安全性。既对软件进行加密保护措施,又不影响其使用。
关键词
软件保护;加壳技术;软件水印
中图分类号: G633.6 文献标识码: A
DOI:10.19694/j.cnki.issn2095-2457.2020.04.83
0 引言
随着应用软件提供的服务越来越普及,各种恶意软件往往附加在正常软件上恶意传播,危害信息安全;另一方面,为了保护软件不随意被他人“借鉴”,必须对软件中的核心算法和机密数据进行保护。那么研究软件加壳技术实现反调试、反附加等功能,从而增加破解难度,阻碍逆向分析,实现软件保护是相当有必要的。
就目前的破解技术来看,单一的软件保护技术已经无法抵挡破解技术的攻击,因此我们需要进行多种技术的糅合。目前最常用的保护技术是加壳,有加密壳和压缩壳等,但最常用的还是两者结合起来。此外,还有代码虚拟技术,通过构造一个虚拟机,产生一些模拟代码来模拟被保护代码的执行,产生出与保护代码相同的结果,这样就很大程度上阻止了源代码的泄露。这种代码虚拟技术几乎是目前最好的保护技术,但其复杂程度与开发难度相当高。
1 软件加壳系统的总体设计
软件加壳系统主要包括三个部分,即Shell部分、加壳部分和水印部分。下面将具体介绍他们的结构与相关技术。
1.1 Shell部分设计
Shell需要先于源程序获取控制权,Shell可以修改源可执行文件的组织结构,从而能更早控制该程序,对加密后的原程序进行解密,且不影响源程序代码的正常运行。Shell的作用是模拟操作系统装载PE文件,在这个过程中,额外添加解密、解压缩等步骤的过程。所以在运行被保护程序时,实际是先运行了Shell部分的程序代码。
Shell部分获取了程序控制权后,需要将加密后的部分依次解密、解压缩,确保其在内存中可以被操作系统识别并执行,在Shell部分处理完毕后,再将程序控制权转给源程序,继续执行源程序部分的代码。
1.2 加壳部分设计
加壳部分主要对PE文件进行操作,对各区段结构内容进行压缩混淆,增加静态分析难度。加壳确保被保护软件在计算机上存储时是加密状态的,虽然加壳不能完全防止静态分析,但是可以对其进行混淆。静态分析加壳后的程序时,不能直接获取被保护软件的总体结构与具体函数等信息。这样就可以提高被保护程序的安全性。
但是加壳后的程序需要先进行解密与解压操作,才可正常使用。因此采用的加密与压缩算法就需要根据实际情况来选择,有的软件需求强度高一些的算法,这样就会使运行时等候时间变长;有的软件对启动速度有要求,就可以选择加密流程较为简单的算法,即起到了一定的保护作用,又不影响程序的正常启动。在本程序中,也提供了多种加密与压缩算法可供选择。
进行加壳操作时,需要先判断其是否是PE文件。若是,就使用PE解析器对其进行解析,方便后续操作。程序中的一些特殊数据,如TLS(Thread Local Storage)、数字证书信息等,在运行的时候是不会被加载进入内存的,因此在加壳时,需要隔离这部分数据,使后续加密压缩时不影响数据。接下来需要对IAT进行处理,首先需要破坏源程序的IAT和重定位表,将其换一个形式存储。由于修复IAT和重定位表是脱壳时的重要步骤,因此对于IAT和重定位表,破坏得越彻底,脱壳难度就越大。对于源程序的各个区段,对其进行加密压缩操作,可以选择不同的加密算法和壓缩算法。随后需要对资源段中的数据进行处理,将如图标版本信息等特殊数据隔离,其他资源段的数据进行压缩。待各区段处理完毕后,将所有区段进行融合,进行统一处理,这样就减少了区块间隙的个数,进一步缩小文件体积。最后,将shell引导段写入PE文件,以保shell代码在源程序之前运行。
1.3 水印部分总体设计
水印部分采用动态水印技术。动态水印技术主要分为执行状态水印、数据结构水印和复活节彩蛋水印。
执行状态水印对内存地址走向进行编码生成水印,有时也会根据指令执行顺序来生成水印,通过控制地址和操作码顺序的统计特性来执行水印检测。实施起来较为困难。数据结构水印通过输入特定信息激发程序将水印信息隐藏在诸如堆、栈或者全局变量域的程序状态中当所有信息都输入完成之后,通过检测程序变量的当前值来进行水印提取。但是这种水印无法承受迷乱变换的攻击。复活节彩蛋水印不需要检测,通过可以显示版权信息的输入产生输出。但水印隐蔽性较差,可以通过调试软件轻松跟踪和删除。
综合上述三种动态水印技术,本系统选择将水印嵌入到函数中。通过想要加入的版权信息生成等长的数据,将数据与原代码中的常量结合,只有给定一定输入,水印信息才能被产生并计算出来。由于这种水印是随着程序的运行才产生的,能承受各种变形攻击。并且,在源程序函数数量较多时,很难定位到该水印函数,即使被发现了,如果试图修改,程序性能也会受到影响。
水印算法分为水印信息处理、水印分割、构造水印函数、水印嵌入和水印提取五个部分。
设计水印信息包括软件指纹、软件所有者、发行方信息、授权方信息、时间戳、备注。由于信息不等长,不便于之后对数据的处理,所以需要对水印信息进行一些提前处理,将其变为等长的数据。由此想到可以计算信息的MD5摘要值后嵌入程序。
2 软件加壳技术的应用
2.1 游戏产业的应用
在当前的计算机游戏产业中,盗版程序或一些外挂程序将在游戏发布后的几天或几周内出现。玩家希望可以尽快地体验新的游戏玩法,这使得游戏的大部分线上收入是在游戏上市后的较短时间内获得的。如果盗版游戏很快出现,就会严重影响游戏的收入。同时外挂插件程序会影响游戏的公平性,导致外挂泛滥、玩家流失。因此,游戏的开发商们为了自身收益与玩家的体验,总是在游戏中应用软件保护技术。
2.2 软件注册的应用
如果程序的价值很高,且主要销售途径是向公司销售。公司盗版的损失远大于个人盗版。如果公司购买了一份软件,却能让100人同时使用,就大大影响了软件收入。因此需要软件保护技术,来阻止对软件的恶意破解行为,使其只能按正规形式购买软件并使用。这样就有效地保护了开发者的合法权益。
2.3 电子授权技术
电子授权技术是基于软件的加密方式,分为序列号和软件许可两种。该方法的优点是不需要硬件设备,就可以实现软件的电子发行。缺点是受网络限制较大,如果没有网络,就需要手动计算相关信息,再获取序列号导入系统。
软件加密行业的发展与软件行业的发展是密不可分的。大的发展环境下,提供软件产品的方式已经从线下转为线上。因此,软件加密技术也要向着线上发展。就目前的情况而言,加密锁技术的发展空间较小,基于硬件的不便利性使其将会渐渐被电子授权方式所取代。
电子授权技术正在从序列号方式转向软件许可的方式,认证方法也从手动验证变为自动验证。提出的授权管理概念,使电子授权技术发展为授权认证、授权管理和信息统计的综合平台,软件开发商的授权信息化能力有了很大的提高。
3 结语
本系统使用C语言编写,内联汇编代码,在Windows 10操作系統下运行。提供软件加壳功能,对可执行文件进行加密与压缩操作,仅在载入内存后才对其进行解密操作,能够很好地保护软件信息。同时添加了软件水印与软件指纹技术,使被保护程序带有软件所有者身份信息与软件开发授权信息等,进一步保障软件所有者版权。
参考文献
[1]段钢.加密与解密第四版[M].北京:电子工业出版社,2018.
[2]范洁.软件特征和软件水印在软件保护中的应用研究[J].计算机应用与软件,2018.
[3]李志飞.一种基于安全注册码的加密软件设计[J].中国科技信息,2018.
[4]许金超.基于内存操作的动态软件水印算法[J].通信学报,2017.
[5]林小华.基于加密和即时解密的软件保护分析[J].自动化与仪器仪表,2016.