一种基于二进制程序的安全加固系统设计和实现

时间:2022-07-18 08:29:42

一种基于二进制程序的安全加固系统设计和实现

【 摘 要 】 随着软件加固技术的发展,如何以最小的开销换来最安全的保护,逐渐成为二进制程序安全加固技术的研究重点。论文通过分析各种安全加固技术,提出一种新的二进制程序安全加固系统,能够加大静态分析的难度,有效地阻碍对程序的动态分析。最后,通过实验证明本加固系统具有通用性、稳定性和有效性。

【 关键词 】 软件保护;二进制程序的安全加固;PE文件

【 Abstract 】 As the development of software reinforcement technology, how to minimize the cost in exchange of the most secure protection gradually becomes a hot topic in binary security reinforcement researches. In this paper, we analyze various security reinforcement technologies and propose a novel binaries’ security reinforcement system, which could increase the difficulty of static analysis attack and effectively impede dynamic analysis attack. Experiment results show that the reinforcement system performs satisfactory in versatility, stability and effectiveness.

【 Keywords 】 software protection;binaries’ security reinforcement;pe file

1 引言

近年来,随着反汇编、反编译和逆向分析等技术的发展,针对软件的破解、篡改和盗版等现象也层出不穷。为了保障软件的安全,对二进制程序安全加固技术的研究已经成为软件安全领域的一个重要分支。

在实际应用中,软件厂商们往往会采用多种加固技术进行软件保护,如PE文件压缩技术、PE文件代码段加密技术、PE文件代码段反汇编后的代码混淆技术以及Shellcode多态变形技术等。这些技术具有较高的通用性,但由此产生的代价也不容忽视,如何以最小的开销换来最安全的保护,成为二进制程序安全加固技术的研究重点。

本文通过分析各种安全加固技术,提出一种新的二进制程序安全加固系统,能够把任意PE文件转换为Shellcode,并代替Windows系统对PE文件进行加载,同时保证不增大PE文件的体积。最后通过实验证明,经本系统加固后的二进制程序体积没有大的变化,并且加固后恶意代码能够逃过主流杀毒软件的查杀,以此证明加固后的二进制程序不但能加大静态分析的难度,还能有效地阻碍对程序的动态分析。

2 常见的软件安全加固技术

软件安全加固技术是随着软件逆向分析技术的发展而发展的。根据软件攻击者的攻击目的和方法不同,软件加固技术也有不同的侧重点和目标。需要指出的是,我们不能将所有的加固技术全都一起应用于软件保护中,这是因为使用不同的安全加固技术一般都会带来额外的开销。简要分析常见的六种加固技术。

(1)加壳与脱壳:加壳的目的是加密或压缩EXE文件的代码段,在程序运行时,先由解密或者解压程序对代码段进行处理,然后程序正常运行。这些加密或压缩功能的机制称为加壳,对应的解密和解压机制称为脱壳。加壳后的代码段能够有效防止反汇编,但攻击者可以通过对脱壳程序的逆向分析,从而破解软件的壳。

(2)多态变形技术:多态变形是由多态和变形两种技术的结合,主要是对解密代码进行变形,使每次生成的解密程序呈现不同状态特征,同时也能对源程序进行简单的变换。显然,多态变形也是加密技术的一种,按照壳的定义,多态变形技术应属于壳的范畴。这种加密技术使得经过变形的解密程序都具有不同特征,所以是一种特殊的壳。常用的多态变形引擎有BPE32 Clet、ADMmuate、Jempiscodes、Tapion等。

(3)代码混淆技术:指在保持源程序语义不变的情况下,通过对源程序中的数据、布局和控制流程等进行变换,使得变换后的程序在功能上与源程序相同或相近。代码混淆对代码的变形除了上述多态变形技术所采用的变形方法外,还对程序的控制流程进行了变换,让程序变得的更加难懂,进而加大逆向分析的难度。

(4)防篡改技术:通过软件或硬件措施防止程序被非法修改的软件保护技术的统称,属于软件保护领域中的主动防御范畴。防篡改技术有两项任务:一是检测软件采用的安全加固技术是否被破解,软件本身是否被修改,通常采用计算校验的方法以及检验一些变量值是否改变来确认程序是否被正常执行;二是当发现程序被篡改或者被调试时制定应对措施。

(5)虚拟机保护技术:指将代码翻译为机器和人都无法识别的一串伪代码字节流,即本地代码虚拟化,在具体执行时再对这些伪代码进行翻译,逐步还原为原始代码并执行的技术。虚拟机用作软件保护的时候,把软件的底层指令(例如汇编指令)翻译成另外一种虚拟机指令,软件执行的时候部分运算在虚拟机中执行。由于虚拟机的复杂度可以很高,指令集可以自定义也可以利用或参考现有的各种成熟指令集,逆向工程需要先看懂虚拟机的大体结构以及虚拟指令集,才有可能弄明白被虚拟化后代码行为。在复杂的虚拟机和软件之间紧耦合的情况下,逆向工程会变得非常困难。

(6)软件水印:软件水印(Software WaterMarking)是数字水印技术在软件保护领域的应用和发展,是数字水印技术的分支。软件水印可分为静态水印和动态水印。静态水印被嵌入在程序代码或者数据当中,一般放在安装模块部分或者指令代码和调试信息的符号中。动态水印技术把水印存放在程序执行状态中,可用于证明程序是否经过了混淆变形处理。

3 基于二进制程序的加固系统方案

3.1 加固原理

PE 文件是Microsoft Portable Executable File Format的简称,即可移植可执行文件格式,是Windows系统下最常用的文件组织形式。Windows下的可执行文件EXE以及动态链接库文件dll都属于PE文件。PE文件经过Windows系统的正常加载,通过反汇编代码很容易逆向分析出PE文件的行为。若仿照Windows的加载程序,将源文件转化成机器码直接在内存中执行,可以增大逆向分析的难度。为了保证加固后源文件的体积不发生较大变化,必须对源文件进行压缩;压缩后的PE文件在加载时,首先进行解压;将压缩后的PE文件和PE文件的加载函数进行封装成Shellcode,再对Shellcode进行多态变形,保证每次生成的解密函数具有不同特征,最后生成新的PE文件。

3.2 框架构成

根据二进制程序加固系统的工作原理,我们将系统的总体结构划分为两部分,系统组成结构如图1所示。第一部分执行PE文件的加载功能,即PE文件执行模块,主要负责解压PE文件和动态加载PE文件等工作,是新的PE文件的主要组成部分。第二部分执行PE文件的压缩、多态变形和组装功能,并生成新的PE文件,进而实现PE文件的加固。主要包含压缩模块、Shellcode组装模块、Shellcode多态变形模块以及PE文件生成模块。压缩模块的对PE文件进行压缩;Shellcode组装模块将经过压缩的PE文件、PE文件执行模块、以及标识符等字符串进行组装,形成Shellcode;多态变形模块对Shellcode进行变形加密,并将解密代码整合到Shellcode中,设置入口点;最后,PE文件生成模块根据变形后Shellcode生成新的PE文件。

第一部分在加固后的PE文件运行时执行,不依赖于第二部分。第二部分将第一部分作为数据进行封装,对PE文件进行加固。 本系统由压缩模块、多态变形模块、Shellcode组装模块、PE文件生成模块、和PE文件执行模块组成。目的是对源PE文件进行压缩变形,并构造成新的PE文件,流程分级步骤:(1)压缩模块负责对原始PE文件进行压缩,目的是减小原始PE文件的体积,同时也起到一定的混淆作用;压缩后的源PE文件和PE文件执行模块(如API初始化模块、解压缩模块等)通过Shellcode组装模块,成可直接在内存中执行的Shellcode代码;(2)多态变形模块主要对生成的Shellcode进行多态变形,本系统的多态变形模块主要采用了Tapion多态变形引擎;(3)PE文件生成模块主要功能是把变形后的Shellcode和解密代码进行封装,生成新的PE文件。

3.3 模块功能

系统一共包含五个模块,PE文件压缩模块、Shellcode组装模块、多态变形模块、PE文件生成模块和PE文件执行模块。系统各模块的数据流图如图3所示。

(1)PE文件压缩模块:采用了微软的FCI/FDI库对EXE文件进行压缩。FCI(File Compression Interface)和FDI(File Decompression Interface)是由微软提供的用于对文件进行压缩和解压缩的通用库和接口,其在Windows 7、WinNT、Win2000、WinXP等各Windows版本的操作系统下都提供了接口,具有通用性,性能上可以满足我们对文件压缩的要求。

(2)Shellcode组装模块:将经过压缩的源PE文件(.cab文件)、PE文件执行模块代码、以及各标识符(主要用于PE加载时的函数定位)等字符串按照一定的规则进行组装,形成Shellcode。

(3)多态变形模块:采用tapion作为多态变形引擎,对Shellcode进行多态变形。经过多态变形引擎的变形,能让每次生成的解密程序都具有不同的特征。首先,对原始Shellcode进行加密,加密采用多态异或的方法,即每次生成不同的随机数对Shellcode主体部分进行异或。其次,对解密代码进行多态变形保护,让每次生成的解密代码具有不同的特征;最后,是把这解密代码和加密后的shellcode进行整合,设置入口点,生成新的Shellcode。

(4)PE文件生成模块:系统目标是对PE文件进行安全加固,所以最终还要把变形后的Shellcode,重新生成PE文件。采用编译器进行组装,将Shellcode写入C或C++源文件中字符串变量中,然后采用独立的编译器对此C或C++源文件进行编译链接,最后生成新的PE文件。

(5)PE文件执行模块:能够在内存中直接执行,主要负责PE文件的解压缩和动态加载。其包含三个子模块,API初始化模块、PE文件解压模块和PE文件加载模块。

API初始化模块:为了编写具有通用性的Shellcode,Shellcode在其进程空间中调用某些API函数, 所以需要动态定位这些Windows系统自带的API函数。API函数存放在一些动态链接库中,而定位API函数主要用到GetProcAddress和LoadLibraryA这两个函数。其中,LoadLibrary函数用于动态装载dll文件,GetProcAddress函数用于从被装载的dll文件中获取API函数的地址。GetProcAddress和LoadLibraryA这两个函数的地址都存放在kernel32.dll模块的导出表中。所以在查找这两个函数的地址之前,必须先定位kernel32.dll的地址。定位kernel32.dll,进而获取GetProcAddress和LoadLibraryA地址。

PE文件解压模块:EXE壳运行之后,先对被压缩的PE文件进行解压,解压程序必须先于PE文件的动态加载模块获得控制权,待解压完成后将控制权交回PE文件加载模块,由模块内的加载程序对解压后的源PE文件进行加载。采用Windows提供的FDI接口对EXE文件进行解压。

PE文件加载模块:源PE文件被压缩后,作为一部分存放在Shellcode中,Shellcode经过多态变形之后,被存放到新的PE文件里,即新的PE文件的代码段中嵌套着源PE文件。为了加载代码段中的源PE文件,需要在Shellcode中添加PE文件加载模块,代替操作系统动态加载源PE文件。

4 性能分析

本安全加固系统应具备几种功能:(1)能对二进制可执行程序进行安全加固,要求经过安全加固后的二进制可执行程序能够在各操作系统下正常运行,体积没有大的变化,且能加大逆向分析的难度;(2)能实现对以二进制可执行程序进行压缩和解压,经过压缩和解压之后程序能正常运行;(3)PE文件加载模块能够实现对PE文件进行动态加载,且此PE文件加载模块能在不同的宿主程序中对宿主程序进行加载,应该有较好的通用性;(4)采用的多态变形模块能够对Shellcode进行多态变形,使重新生成的PE文件具备多种不同的形态。

4.1 测试过程

为了验证本安全加固系统的性能,实验环境如表1所示。

系统操作步骤:(1)选择需要具有代表性的软件(包括常用软件和恶意软件),记录下软件的体积大小;(2)用本安全加固系统对各软件进行变形,记录下变形后的体积大小,并检查这些变形后的软件的能否正常运行。

选择变形配置,其中garbage_size表示垃圾指令系数,取值范围为0~5或者R。0~5表示插入的垃圾指令的规模,0表示无垃圾指令插入,R表示垃圾指令系数随机产生。do_jumps选项表示插入垃圾指令时是否夹带指令跳转;选择需要安全加固的PE文件和需要生成的新的PE文件名;点击开始按钮,变形完成后会弹出提示消息框,在当前目录即可看到最终生成的Shellcode文件和.c文件;调用vs2010自带的编译器对.c文件进行编译,最终生成新的PE文件。

(3)用系统中安装的杀毒软件对变形后的恶意软件进行主动检测查杀,记录检测结果。

4.2 测试结果

对本安全加固系统的测试主要分为两项,第一项主要针对系统性能上的验证,主要包括加固前后程序体积变化对比,以及加固后的程序在各操作系统下是否能正常运行。测试结果如表2所示。

通常情况下,杀毒软件采用静态和动态分析结合的方法对恶意软件进行分析,为了验证此加固系统的有效性,将一些容易被杀毒软件查杀的恶意代码进行加固,若加固后杀毒软件不再提示为恶意软件,即杀毒软件无法分析出恶意软件的行为,则说明加固是有效的。测试结果如表3所示。

表2说明,经过本系统加固后的二进制程序,在各操作系统下软件都能正常运行,且其体积没有较大变化,说明此安全加固系统有较好的通用性和稳定性。表3说明,加固后恶意代码可以逃过主流杀毒软件的查杀,加固后的二进制程序不但能加大静态分析的难度,还能有效地阻碍对程序的动态分析,说明本系统能有效的对软件进行安全加固。

5 结束语

针对现有安全加固技术存在的不足,本文设计并实现了一种新的二进制程序的安全加固系统。随后选取目前流行的操作系统和杀毒软件,对本系统的通用性、稳定性和有效性进行验证。结果表明,本系统能有效地隐藏二进制程序静态特征,阻碍对程序的动态分析,以及加固前后体积没有较大变化。所以,本系统所采用的技术、设计思路和实现方法为后续二进制程序安全加固技术提供了理论基础。随着技术的发展,一些更智能的主动防御系统对程序进行动态分析时,仍有可能判断出解密后程序的入口点,进而分析程序行为。所以,在后续工作中,需要进一步研究解密程序的变形技术和对抗调试器的技术。

参考文献

[1] 田硕,梁洪亮.二进制程序安全缺陷静态分析方法的研究综述[J].计算机科学,2009(7).

[2] 黄晖,陆余良,夏阳.基于动态符号执行的二进制程序缺陷发现系统[J].计算机应用研究, 2013(9).

[3] 吴庆波, 颜跃进, 张亚军, 吴泉源.一种基于虚拟机的驱动程序加固技术[J].计算机工程与科学, 2010(11).

[4] 杨明,黄刘生.一种采用嵌套虚拟机的软件保护方案[J].小型微型计算机系统,2011(2).

作者简介:

韩煜(1982-),男,辽宁海城人,北京邮电大学,硕士,公安部第一研究所,工程师;主要研究方向和关注领域:信息安全技术。

张济国(1980-),男,北京人,英国贝尔法斯特女王大学,硕士,公安部第一研究所,工程师;主要研究方向和关注领域:通信技术。

张冬芳(1980-),女,河北人,北京邮电大学,博士,公安部第一研究所,工程师;主要研究方向和关注领域:信息安全密码技术。

李海涛(1980-),男,辽宁人,北京邮电大学,博士,公安部第一研究所,工程师;主要研究方向和关注领域:信息安全攻防技术。

上一篇:一种用于信息系统安全等级保护的定级技术 下一篇:基于隐马尔可夫模型的滑窗宽度可变异常检测