一种利用软件保护装置实现自动代码移植的方法

文档序号:6373133阅读:155来源:国知局
专利名称:一种利用软件保护装置实现自动代码移植的方法
技术领域
本发明涉及计算机安全领域,特别涉及一种实现自动代码移植的软件保护方法。
背景技术
在软件保护领域经常使用代码移植的方式对软件进行保护。通常的做法是软件开发者选择软件中若干被保护的代码段,按照这些代码段的逻辑编写软件保护装置内部的代码以实现同样的功能,然后将软件中被保护的代码段移除。在计算机执行到被保护的代码时启动软件保护装置并传递参数给软件保护装置,由软件保护装置来执行这段代码,软件保护装置运行完毕后返回执行结果,然后计算机接着被保护代码段之后继续运行。这样便隐藏了软件的部分代码逻辑,实现了对软件的保护。 软件保护装置是一种插在计算机上的软硬件结合的用于保护软件的加密设备。一般包含几十字节到几十K字节的非易失性存储空间可供读写。现代的软件保护装置内部还集成了单片机,软件开发者可以通过编程接口与软件保护装置通信,还可以在软件保护装置内运行自己编写的程序。本发明所要用到的软件保护装置就是其内部集成了单片机的软件保护装置。这种保护方式需要软件开发者自己编写软件保护装置内的代码,并且需要修改被保护软件的源代码以添加访问软件保护装置的代码。而且这种保护方法必须修改软件的源代码,对于已编译好的软件则不能使用这种方式进行保护。

发明内容
本发明的目的在于提供一种简单的方式实现类似上述代码移植方式的保护方法,对于已编译好的软件同样可以轻松实现代码移植,而不需要修改软件的源代码并重新编译。本发明通过处理在计算机中运行的与被保护软件相关联的的工具软件与能够执行计算机指令的软件保护装置配合自动完成被保护软件的代码移植。所述工具软件的功能包括
A.分析被保护软件的汇编代码,找出若干段适合移植的代码段并拷贝到所述软件保护装置内。关于分析被保护软件汇编代码的方式可以分为两种方式
(I)由工具软件自动分析被保护软件的全部代码段,找出若干适合移植的代码段。所谓的自动分析是相对于第(2)种方式而言的,第(2)种方式需要手动在软件中添加开始和结束标记,工具软件根据开始和结束标记来确定要保护的代码段。而此种方式的自动分析是指工具软件直接处理已编译好的被保护软件,从被保护软件中随机抽取若干段代码段作为被保护的代码段,将其提取出来放入软件保护装置中。(2)在被保护软件的源代码中添加一些标记,例如使用字符串begin和end来标记被保护代码段的起始和终止位置,工具软件通过查找这些标记来定位被保护代码段。所谓适合移植的代码段是指这段代码中的汇编指令都是软件保护装置能够执行的指令。所谓软件保护装置能够执行的指令是指在软件保护装置中能够模拟执行的计算机指令,例如对寄存器操作的指令、对堆栈操作的指令。而软件保护装置中不能模拟执行的计算机指令是指以软件保护装置这种有限的资源无法模拟出其执行效果的指令,例如对计算机端口操作的指令。B.把被保护软件中拷贝出去的代码打乱以隐藏逻辑。关于打乱拷贝到软件保护装置中的代码段的方式可以有多种,例如可以全部填充无操作指令NOP或其他指令,或者以一段随机数填充;
C.在被保护软件中插入一段访问软件保护装置的代码段,当被保护软件运行到被移植的代码段时自动跳转到这段访问软件保护装置的代码,通过这段代码使软件保护装置开始执行被移植的代码。关于这段访问软件保护 装置的代码段,其主要功能包括三部分
(1)在开始执行被移植代码段时把当前计算机的运行环境,即各寄存器数据和堆栈数据发送到软件保护装置,以便软件保护装置使用这些数据模拟当前的运行环境;
(2)在软件保护装置执行这段被移植的代码时如果需要访问计算机内的一些资源,例如内存或端口,由这段访问软件保护装置的代码段来配合软件保护装置进行操作;
(3)当软件保护装置执行完这段被移植的代码时,由这段访问软件保护装置的代码段来获取软件保护装置发送回来的各寄存器数据和堆栈数据,并且使用这些数据设置计算机对应的各寄存器和堆栈,恢复计算机的运行环境,最后跳转到被移植代码段之后继续运行。此外,所述能够执行计算机指令的软件保护装置,其中具有模拟寄存器,用于模拟与所述软件保护装置配合工作的计算机中寄存器的状态,所述软件保护装置还具有1/0单元,用于在所述软件保护装置中模拟所述计算机对所述计算机中内存的读写,以及在所述计算机与所述软件保护装置交换计算机运行状态时,与所述计算机交互所有的状态数据;指令解析单元,用于解析所述软件保护装置当前正在模拟执行的CPU指令;控制单元,用于判断所述当前正在模拟执行的CPU指令是否能在所述软件保护装置内执行;指令执行单元,用于模拟所述当前正在模拟执行的CPU指令的功能,改变所述软件保护装置中所述模拟寄存器的内容。此外,所述计算机中包括工具软件单元,用于与所述软件保护装置中的I/o模块通信,控制所述计算机中的寄存器、内存或端口以执行所述CPU指令;并且所述配合单元与所述软件保护装置中的所述I/o单元配合工作,实现所述软件保护装置与所述计算机之间的运行状态的交互。根据本发明的一个实施方式,其结构如图3所示。该软件保护装置已在本申请人已提交的发明专利申请(申请号为2012100110616. 8)中进行了详细描述,本发明将其全文引入作为本发明说明书内容的一部分。由于本发明主要涉及方法的改进,因此对于该软件保护装置的具体硬件结构和工作原理不再赘述。这种软件保护方式实现了软件代码的移植,隐藏了被保护软件的部分逻辑,而且软件与软件保护装置之间的输入与输出只是一些寄存器内容和堆栈数据,而这些内容是随着执行到这段代码时的初始环境的变化而变化的,所以很难通过分析输入与输出的关系来猜出被移植代码的逻辑。并且这种软件保护方法的整个操作过程非常简单,对使用者的技术要求会大大降低。根据本发明,提供一种通过软件保护装置与计算机配合实现自动代码移植的软件保护方法,
所述计算机中具有工具软件单元,所述工具软件单元用于分析被保护软件的汇编代码,找出移植代码段并拷贝到所述软件保护装置中,并且所述工具软件单元还用于把所述移植代码段打乱以及在所述被保护软件中插入一段访问所述软件保护装置的访问代码段;
所述方法包括
步骤I:所述工具软件单元对所述被保护软件进行处理;
步骤2 :所述计算机运行到所述移植代码段时,保存当前各寄存器的内容;
步骤3 :跳转到所述访问代码段,启动所述软件保护装置以执行所述移植代码段; 步骤4 :在软件保护装置中执行所述移植代码段;在所述软件保护装置开始执行所述移植代码段时,所述计算机中所述访问代码段开始循环检测所述软件保护装置发送回来的消息。根据本发明的一个方面,在步骤4中,如果需要配合完成访问所述计算机的其他资源,则将结果发送回所述软件保护装置,然后继续检测消息;
如果是所述软件保护装置已执行完所述移植代码段,则由所述计算机接收所述软件保护装置发送回来的寄存器和堆栈数据,并根据所述寄存器和堆栈数据设置所述计算机对应的各寄存器和堆栈,恢复运行环境。根据本发明的一个方面,所述分析被保护软件汇编代码的方式分为两种由所述工具软件单元自动分析被保护软件的全部代码段,找出所述移植代码段;或者在被保护软件的源代码中添加标记,由所述工具软件单元通过查找所述标记来定位所述被保护代码段。根据本发明的一个方面,所述移植代码段中的汇编指令都是所述软件保护装置能够执行的指令。


图I是所述工具软件处理被保护软件时的流程 图2是以本发明提出的方式保护后的软件在运行时的流程 图3是本发明所涉及的软件保护装置和计算机的结构示意图。
具体实施例方式下面以在32位x86处理器上对Windows的PE文件进行保护为例并参照附图对本发明进一步详细描述。本例中使用到的能执行计算机指令的软件保护装置所支持的计算机指令为32位x86的通用指令集,即General Purpose Instructions。图I是计算机上运行的工具软件在处理被保护软件时的流程图,其步骤如下 步骤101,查找被保护软件中的代码段,此实施例采用的方式是查找软件中的起始和终
止标记来确定要移植的代码段;
步骤102,把查找到的代码段发送到软件保护装置,在软件保护装置中以数据文件的形式将其存储起来;
步骤103,将访问软件保护装置的代码插入到被保护软件中。这段代码的作用包括
(I)在开始执行被移植代码段时把计算机各寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI,状态寄存器EFLAGS和指令寄存器EIP,以及六个段寄存器CS、DS、SS、ES、FS和GS的当前内容以及部分堆栈的数据发送到软件保护装置(2)循环检测软件保护装置发送到计算机的消息,如果消息类型为软件保护装置要访问计算机的内存或端口等资源,则由这段代码负责完成访问并将操作结果发送回软件保护装置。操作结果是指,如果是读操作则将读取的内容发送到软件保护装置,如果是写操作则将写入是否成功返回给软件保护装置
(3)如果消息类型为软件保护装置已经完成了对移植 代码段的执行,则由这段代码接受软件保护装置发给计算机的上述所有寄存器以及部分堆栈数据,并使用这些数据设置计算机的当前运行状态。步骤104,修改被保护软件中移植到软件保护装置中的代码段以隐藏逻辑。具体的修改方式可以有多种,这里采用填充NOP指令的方式,即在前几个字节改为保存各寄存器数据的指令,然后再添加一条跳转指令,挑战到访问软件保护装置的代码段,剩余部分都以NOP指令填充。按照图I所示的步骤处理完被保护软件后,在计算机运行到软件的被移植代码时的步骤如图2所示,具体步骤如下
步骤201,首先保存当前各寄存器的内容,由于软件保护装置只执行32位x86的通用指令集,所以需要的寄存器为通用寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI,状态寄存器EFLAGS和指令寄存器EIP,以及六个段寄存器CS、DS、SS、ES、FS和GS,保存方式为将寄存器数据压栈,指令寄存器EIP不能直接压栈,可以采用其他方式保存到堆栈。根据本发明的一个具体实施方式
,例如,将被保护代码段的第一条指令改为函数调用指令Call,Call指令自动将下一条指令的EIP压栈,在Call指令所调用的函数内可以将栈中的EIP取出,减去Call指令所占用的字节数即是Call指令的内存地址,再将其压栈即可实现保存被保护代码段第一条指令的EIP。步骤202,跳转到访问软件保护装置的代码段,开始启动软件保护装置以执行被移植的代码;
步骤203,在软件保护装置中执行移植代码时需要仿照计算机当前的运行环境初始化各相应寄存器的内容和堆栈数据,所以首先要由访问软件保护装置的代码段把这些数据发送给软件保护装置。关于发送到软件保护装置的堆栈数据的大小可以固定一个值,例如发送IK的堆栈数据到软件保护装置,如果软件保护装置在执行移植代码时需要访问到这IK之外的堆栈或者要访问其他内存则可以通过这段访问软件保护装置的代码段配合完成。根据本发明的一个具体实施例,其方式为循环检测软件保护装置发送到计算机的消息,如果消息类型为软件保护装置要访问计算机的内存或端口等资源,则由这段代码负责完成访问并将操作结果发送回软件保护装置。操作结果是指,如果是读操作则将读取的内容发送到软件保护装置,如果是写操作则将写入是否成功返回给软件保护装置。步骤204,在启动软件保护装置开始执行移植到其内部的代码时,访问软件保护装置的代码就开始循环检测软件保护装置发送回来的消息。如果软件保护装置需要访问计算机的其他资源,例如内存、端口等,则由这段访问软件保护装置的代码段来配合其完成,再把由访问软件保护装置的代码段配合软件保护装置执行的结果(gj,具体包括如果是读操作则是指读取的数据内容,如果是写操作则是指写入是否成功)发送回软件保护装置,然后继续检测消息。如图2中步骤205、206和207所示。
如果是软件保护装置执行完了移植的代码,则接收软件保护装置发送回来的寄存器和堆栈数据,并将这些数据设置计算机对应的各寄存器和堆栈,恢复运行环境,然后继续向下执行。如图2中步骤208和209所示。
权利要求
1.一种通过软件保护装置与计算机配合实现自动代码移植的软件保护方法,其特征在于: 所述计算机中具有工具软件单元,所述工具软件单元用于分析被保护软件的汇编代码,找出移植代码段并拷贝到所述软件保护装置中,并且所述工具软件单元还用于把所述移植代码段打乱以及在所述被保护软件中插入一段访问所述软件保护装置的访问代码段; 所述方法包括 步骤I:所述工具软件单元对所述被保护软件进行处理; 步骤2 :所述计算机运行到所述移植代码段时,保存当前各寄存器的内容; 步骤3 :跳转到所述访问代码段,启动所述软件保护装置以执行所述移植代码段; 步骤4 :在软件保护装置中执行所述移植代码段;在所述软件保护装置开始执行所述移植代码段时,所述计算机中所述访问代码段开始循环检测所述软件保护装置发送回来的消息。
2.根据权利要求I的方法,其特征在于,在步骤4中,如果需要配合完成访问所述计算机的其他资源,则将结果发送回所述软件保护装置,然后继续检测消息; 如果是所述软件保护装置已执行完所述移植代码段,则由所述计算机接收所述软件保护装置发送回来的寄存器和堆栈数据,并根据所述寄存器和堆栈数据设置所述计算机对应的各寄存器和堆栈,恢复运行环境。
3.根据权利要求1、2的方法,其特征在于,所述分析被保护软件汇编代码的方式分为两种由所述工具软件单元自动分析被保护软件的全部代码段,找出所述移植代码段;或者在被保护软件的源代码中添加标记,由所述工具软件单元通过查找所述标记来定位所述被保护代码段。
4.根据权利要求1-3的方法,其特征在于,所述移植代码段中的汇编指令都是所述软件保护装置能够执行的指令。
全文摘要
本发明涉及一种实现自动代码移植的软件保护方法。通过计算机中的工具软件将被保护软件中的部分汇编代码移植到所述软件保护装置中,在被保护软件运行到被移植的代码时将计算机当前的运行环境,即CPU的各寄存器和一段堆栈的数据发送到所述软件保护装置内,由所述软件保护装置运行被移植的代码,运行完后再将最终的运行环境发送回计算机,由计算机继续向下执行。
文档编号G06F9/44GK102799434SQ20121023940
公开日2012年11月28日 申请日期2012年7月12日 优先权日2012年7月12日
发明者不公告发明人 申请人:北京深思洛克软件技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1