购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2软件保护方案设计

2.1构架设计

本文设计的软件保护方案以二进制文件或者源代码作为输入,以经过部分代码加密的可执行文件作为输出,整个构架分为以下几个模块:文件预处理模块、代码分块模块、哨兵插入模块、文件生成模块和代码加密模块。

文件预处理模块:针对不同的输入文件,文件预处理模块执行不同的功能。当输入文件为高级语言编写的源代码时,在源码层面对其进行分析,定位关键代码 [11~13] ;当输入文件是二进制文件时,对其进行反汇编处理,调试运行程序,定位关键代码。

代码分块模块:将代码以基本块为单位进行划分并做出标记。标记后的关键代码基本块集为IB={IB 1 ,IB 2 ,…,IB n }。然后在剩余的代码中随机选择一定数量的基本块,标记为一般基本块集OB={OB 1 ,OB 2 ,…,OB n }。

哨兵插入模块:根据第二节内容构造哨兵代码,并将其插入文件中。在插入时,首先根据静态分析得到的控制流图找到加密基本块由程序起点到程序终点的路径,然后在程序路径的前必经点和后必经点中插入哨兵代码。根据输入文件的不同,哨兵插入的方式也略有不同。当输入源文件时,可以直接进行插入。当输入是二进制文件的反汇编程序时,文章采用跳转的方式插入哨兵。即在前后必经点位置插入无条件跳转指令,跳转至程序的空闲地址写入哨兵代码,在代码末尾跳回前后必经点位置,避免重写二进制文件的问题。

文件生成模块:将基本块划分完毕做好标记并插入哨兵的文件进行汇编和链接生成可执行文件。

代码加密模块:对生成的可执行文件进行处理。使用十六进制工具打开文件,定位分块的关键代码,对于针对IB和OB中的每一个基本块产生一个对应的密钥,组成密钥集K={K I1 ,K I2 ,…,K I n ,K O1 ,K O2 ,…,K O n },并将密钥写入加密锁中。利用对应密钥加密每一块基本块代码。

整个保护构架如图2所示。

图2基于代码加密的软件防护构架

2.2安全性分析

当防护工作完成后,软件处于静态时,加密后的基本块处于加密状态,当攻击者对代码进行反汇编时,反汇编器不能识别加密部分代码,反汇编出现错误。而且并非所有乱码部分都是关键代码,攻击者无法对其进行判断。当攻击者对软件进行动态调试时,由于会有加密锁存在性检测,在没有加密锁的情况下会直接结束程序。即便攻击者篡改程序控制流,跳过检测机制,同样无法正确执行加密后的代码,导致程序异常并退出。由于解密密钥并不存在于代码中,攻击者即便找到执行加解密功能的哨兵,也无法对代码进行解密,而在没有密钥的情况时,分析加密代码的难度相当于破解SM4算法,也就是说,攻击者在没有加密锁的情况下,很难得到加密代码的明文,该防护构架可以有效地对抗静态和动态分析。

当攻击者得到加密锁,由于软件采用分块加密,以基本块为单位,解密执行完一块代码后对其进行加密处理再解密下一块代码块。攻击者如果想得到全部代码,需要反复对程序进行动态跟踪,通过对此内存dump才能得到全部的代码明文。这将消耗攻击者大量的事件和精力,同时也给软件使用人员充足的时间对软件进行更新换代或者做出其他应对措施。

2.3应用实例

本节对于指挥信息系统中某测试系统软件进行保护处理,说明整个保护过程。以源代码文件作为输入,方便起见,只对于系统软件的端口扫描配置项进行处理。

首先输入系统软件源文件使用软件执行差异比对,通过运行软件分别执行端口扫描功能和不执行端口扫描功能,对代码执行对比,定位执行此功能的核心函数DoScanPort_TCP()、DoScanPort_UDP()和Scan()等函数,并在其函数的前后添加begindecrypt和enddecrypt,将其中内容作为明文并添加解密和再加密的函数Decrypt(ptr,size,k)、Encrypt(ptr,size,k)。当程序编译好之后对明文M的内容进行加密处理。并在其前后添加汇编代码_asm inc eax和_asm dec eax,由于这两行汇编代码的机器码是40h和48h,便于寻找定位 [17] ,此段代码变为

当文件编译完成,使用十六进制工具打开文件,搜索_asm inc eax和_asm dec eax所代表的数据4048,从而定位待加密代码。之后运行十六进制加密工具对文件进行加密处理,如图3所示。

图3使用加密工具加密代码块

按照这种方式对划分的基本块分别进行加密,插入哨兵对代码进行加解密,并依次记录下相应的基本块标记和代码块密钥写入加密锁中,完成保护过程。 Udhoc6MBs1ALpt4I7lE4YOacWtmA8rvVPupCJYd8+OdWGtwB01xwHbNTGOrSZ7Ei

点击中间区域
呼出菜单
上一章
目录
下一章
×