对可执行文件进行保护的方法和装置与流程

文档序号:11134481
对可执行文件进行保护的方法和装置与制造工艺

本发明涉及信息安全技术领域,特别涉及一种对可执行文件进行保护的方法和装置。



背景技术:

在信息安全领域中,软件作为一种宝贵的财富,软件的安全性越来越受到单位、企业和个人的关注。软件作为一种特殊的产品,由于其数字化的特征,从问世起就一直遭受盗版的困扰。盗版的存在不仅给软件开发者造成了巨大的损失,也极大的阻碍了整个软件行业的发展。

目前对于软件中代码的保护主要是基于应用层的软件保护技术和基于硬件的保护方法。

常见的应用层的保护软件有VMProtect虚拟机保护软件等各种混淆器,对这种保护软件的保护方式的分析完全可以在应用层进行,目前已经有各种破解插件可以利用,因此这种软件保护技术的抗分析性较差。

基于硬件的保护方法主要是从程序文件中提取部分代码到硬件保护装置中,这样软件的一部分代码在计算机中执行,另外一部分在保护装置中模拟执行。基于硬件的保护方法可以移植的代码指令有限,受限于硬件的保护装置的空间限制,移植的代码的数量也有限。



技术实现要素:

有鉴于此,本发明的一个目的在于提供一种对可执行文件的有效保护手段,以进一步提高软件的安全性。

为此,本发明提供了一种对可执行文件进行保护的方法,其包括:在运行可执行文件时,所述可执行文件中的预定代码段的执行过程中的至少部分过程不在应用层执行而是在驱动层进行模拟执行。

作为优选,所述可执行文件中预定位置处包括与实现所述预定代码段的指令中的至少部分指令的功能对应的驱动层指令。

作为优选,所述预定位置为所述可执行文件中的预定数组或预定行。

作为优选,所述至少部分指令中每条指令对应至少一条所述驱动层指令。

作为优选,在所述可执行文件中,所述至少部分指令被替换为包括与所述驱动层指令的调用相关的指令和/或函数在内的第一代码段。

作为优选,在运行所述可执行文件时,应用层将所述驱动层指令发送至驱动层,并从驱动层接收相应的执行结果。

作为优选,通过以下步骤确定所述预定代码段:分析所述可执行文件中的多个函数,根据如下条件在所述多个函数中确定目标函数:对于实现所述目标函数的指令中的至少部分指令,存在功能对应的驱动层指令;将至少一个所述目标函数对应的代码段确定为所述预定代码段。

作为优选,通过以下步骤确定所述预定代码段:分析所述可执行文件中的多个函数,在所述多个函数中将具有参数和返回值的函数确定为目标函数:将至少一个所述目标函数对应的代码段确定为所述预定代码段。

作为优选,通过以下步骤确定所述预定代码段:分析所述可执行文件中的多个函数,在所述多个函数中将具有同一类型的参数和返回值的函数确定为目标函数:将至少一个所述目标函数对应的代码段确定为所述预定代码段。

本发明同时提供了一种对可执行文件进行保护的装置,包括:应用程序端,其配置为运行可执行文件;驱动层模拟器,其配置为在可执行文件运行时,对所述可执行文件中的预定代码段的执行过程中的至少部分过程进行模拟执行,其中,所述至少部分过程不在应用程序端执行。

作为优选,所述装置还包括:处理单元,其配置为将与实现所述预定代码段的指令中的至少部分指令的功能对应的驱动层指令写入所述可执行文件中预定位置处。

作为优选,所述处理单元配置为将所述驱动层指令写入所述可执行文件中的预定数组或预定行处。

作为优选,所述处理单元配置为,对于所述至少部分指令的每条指令,在所述预定位置写入至少一条所述驱动层指令。

作为优选,所述处理单元进一步配置为将所述可执行文件中的所述至少部分指令替换为包括与所述驱动层指令的调用相关的指令和/或函数在内的第一代码段。

作为优选,所述处理单元进一步配置为在所述可执行文件运行时将所述驱动层指令发送至所述驱动层模拟器,并从所述驱动层模拟器接收相应的执行结果。

作为优选,所述装置还包括分析单元,其配置为分析所述可执行文件中的多个函数,并将所述多个函数中的至少一个目标函数对应的代码段确定为所述预定代码段,其中,所述分析单元配置为根据如下条件确定所述目标函数:对于实现所述目标函数的指令中的至少部分指令,存在功能对应的驱动层指令。

作为优选,所述装置还包括分析单元,其配置为分析所述可执行文件中的多个函数,并将所述多个函数中的至少一个目标函数对应的代码段确定为所述预定代码段,其中,所述分析单元配置为将具有参数和返回值的函数确定为所述目标函数。

作为优选,所述装置还包括分析单元,其配置为分析所述可执行文件中的多个函数,并将所述多个函数中的至少一个目标函数对应的代码段确定为所述预定代码段,其中,所述分析单元配置为将具有同一类型的参数和返回值的函数确定为所述目标函数。

本发明在对可执行文件进行保护时,将部分代码或指令的执行过程转移至驱动层模拟执行,这样对软件中代码或指令的保护的对抗从应用层转移到驱动层,进一步增加了调试难度,从而达到了保护软件的目的。

附图说明

图1为本发明的对可执行文件进行保护的方法的一个实施例的示意性流程图;

图2为本发明的对可执行文件进行保护的方法的另一个实施例的部分示意性流程图;

图3为本发明的对可执行文件进行保护的方法的又一个实施例的部分示意性流程图;

图4为本发明的对可执行文件进行保护的方法的再一个实施例的部分示意性流程图;

图5为本发明的对可执行文件进行保护的装置的一个实施例的示意性框图;

图6为本发明的对可执行文件进行保护的装置的另一个实施例的示意性框图;

图7为本发明的对可执行文件进行保护的装置的又一个实施例的示意性框图。

具体实施方式

下面参照附图对本发明的具体实施方式进行详细说明。本发明的对可执行文件进行保护的方法可以支持例如.NET可执行文件以及由C/C++编译生成的32位或者64位的可执行文件等。

图1为本发明的对可执行文件进行保护的方法的一个实施例的示意性流程图。如图1所示,本实施例的方法包括以下步骤:运行可执行文件;在运行至所述可执行文件的预定代码段时,将预定代码段的执行过程中的至少一部分过程不在应用层执行而是在驱动层进行模拟执行;继续运行所述可执行文件。

预定代码段为可执行文件中待保护的代码段,其可包括代码或指令。预定代码段可由用户自行分析确定,也可以由客户端软件自动分析确定,或者由客户端软件对可执行文件进行分析后向用户提供能够进行保护的多个代码段以供用户选定,用户根据实际需要从中选定所需进行保护的代码段作为预定代码段。

在可执行文件常规运行时,所有的代码或指令均在应用层执行。本发明的创新之处在于,将可执行文件中预定代码段的至少部分执行过程不在应用层执行,而是转移至驱动层进行模拟执行,驱动层在模拟执行后可将执行结果返回给应用层,如此可将可执行文件中的预定执行过程“隐藏”在驱动层执行,要想破解可执行文件中预定代码的内容将变得十分困难。

本发明实施例的方法在运行可执行文件时,将可执行文件的预定代码段(部分代码或指令)的至少部分执行过程转移至驱动层进行模拟执行,这样对软件中预定代码或指令的保护的对抗从应用层转移到驱动层,进一步增加了调试难度,能够同时应对应用层保护软件抗分析性差的问题和硬件保护方法容易受限的问题。应当理解的是,可执行文件中可以包括多个上述的预定代码段,从而在运行到每个预定代码段处时均执行上述过程。

在本发明一个实施例中,可将与可执行文件中预定代码段的指令中的至少部分指令的功能对应的驱动层指令写入可执行文件中的预定位置处。在该实施例中,预定代码段可对应于与其实现相关的多个指令(或代码),可将与其中的部分指令的功能对应的驱动层指令写入可执行文件中预定位置处,该预定位置可以是该部分指令原先所在行或其他行,或者也可以是可执行文件中的预定数组处,例如一个新增的全局数组。

在本发明另一个实施例中,对于用于实现预定代码段的指令中的至少部分指令中的每条指令,可能通过一条驱动层指令就能实现其功能,也可能通过两条驱动层指令实现其功能。这里需要说明的是,驱动层指令可包括多种类型,对于某一类型的驱动层指令,可能一条驱动层指令的功能就能够对应实现预定代码段的部分指令中的一条指令,而对于另一类型的驱动层指令,可能需要两条驱动层指令的功能才能对应实现预定代码段的部分指令中的一条指令,具体对应关系由所选用的驱动层指令的类型而确定。

在本发明一个实施例中,可将实现上述预定代码段的指令中的上述部分指令替换为包括与驱动层指令的调用相关的指令和/或函数在内的第一代码段。如此可将与预定代码段的执行相关的指令中的至少部分指令完全隐藏,并且在可执行文件运行时,通过与驱动层指令的调用相关的指令和/或函数来对驱动层指令进行调度,能够例如将驱动层指令从应用层发送至驱动层,并从驱动层接收返回的执行结果,从而在将上述的部分指令隐藏的同时能够确保可执行文件的顺利执行。

图2为本发明的对可执行文件进行保护的方法的另一个实施例的部分示意性流程图。

如图2所示,本发明的对可执行文件进行保护的方法的另一个实施例中在运行可执行文件前,包括:分析所述可执行文件中的多个函数,根据如下条件在所述多个函数中确定目标函数:对于实现所述目标函数的指令中的至少部分指令,存在功能对应的驱动层指令;将至少一个所述目标函数对应的代码段确定为所述预定代码段。

在本发明的实施例中,首先对可执行文件中的多个函数进行分析,在多个函数中确定目标函数。目标函数的确定条件为,实现该目标函数的指令中的至少部分指令有驱动层指令的功能与之对应,即确定包括了能够在驱动层模拟的指令的函数为目标函数,再将该目标函数对应的代码段确定为待保护的预定代码段。在确定了预定代码段后,可执行文件的运行过程与图1所示相同。

图3为本发明的对可执行文件进行保护的方法的又一个实施例的部分示意性流程图。

如图3所示,本发明的对可执行文件进行保护的方法的又一个实施例中在运行可执行文件之前,包括:分析可执行文件中的多个函数;在多个函数中将具有参数和返回值的函数确定为目标函数:将至少一个所述目标函数对应的代码段确定为所述预定代码段。

在本发明的实施例中,首先对可执行文件中的多个函数进行分析,在多个函数中确定目标函数。目标函数的确定条件为,该目标函数具有参数、对参数的处理过程以及返回值,返回值即对参数的处理结果。即,确定了具备参数和返回值的函数为目标函数,再将该目标函数对应的代码段确定为待保护的预定代码段。在确定了预定代码段后,可执行文件的运行过程与图1所示相同。

图4为本发明的对可执行文件进行保护的方法的再一个实施例的部分示意性流程图。

如图4所示,本发明的对可执行文件进行保护的方法的又一个实施例中在运行可执行文件之前,包括:分析可执行文件中的多个函数,在所述多个函数中将具有同一类型的参数和返回值的函数确定为目标函数:将至少一个所述目标函数对应的代码段确定为所述预定代码段。

在本发明的实施例中,首先对可执行文件中的多个函数进行分析,在多个函数中确定目标函数。目标函数的确定条件为,该目标函数具有参数、对参数的处理过程以及返回值,返回值即对参数的处理结果,并且参数和返回值为同一类型。即,确定了具备相同类型的参数和返回值的函数为目标函数,再将该目标函数对应的代码段确定为待保护的预定代码段。在确定了预定代码段后,可执行文件的运行过程与图1所示相同。

下面结合一个示例性的.NET可执行文件来说明本发明实施例对可执行文件进行保护的方法的实现过程,该实施例以保护安装有微软Windows XP32位操作系统的系统环境为例,该示例性的.NET可执行文件具体如下所示:

在所给出的示例性的.NET可执行文件中包含Program类,Program中包含.ctor、Main、test_add、test_sub和test_mul等函数(或方法)。其中.ctor函数和Main函数中的返回值为void类型,两者参数个数为0;test_add函数、test_sub函数和test_mul函数均包含2个int类型的参数,其对参数进行操作后得到的返回值也为int类型。经过分析,确定test_add函数、test_sub函数和test_mul函数可以在驱动层进行模拟。

下面以IL指令为例对实现test_add函数的指令进行说明:

{

IL_0000:nop

IL_0001:ldarg.0

IL_0002:ldarg.1

IL_0003:add

IL_0004:stloc.0

IL_0005:br.s IL_0007

IL_0007:ldloc.0

IL_0008:ret

}

上述用于实现test_add函数的IL指令中可以在驱动层模拟的指令为:

IL_0001:ldarg.0

IL_0002:ldarg.1

IL_0003:add

IL_0004:stloc.0

当用户选定Program类中的test_add函数为目标函数时,将与上述四条IL指令的功能对应的驱动层指令(在本实施例中也称为自定义指令)保存到可执行文件中的预定位置处。这里给出所采用的驱动层指令的两个例子。

驱动层指令的第一个例子可以包括:

vm_read_mem //读取第一个参数

vm_push_imm //将参数入栈

vm_read_mem //读取第二个参数

vm_push_imm //将参熟入栈

vm_add //相加

vm_pop //弹出栈顶垃圾数据

vm_write_mem //将结果保存

驱动层指令的第二个例子可以包括:

vm_get_context(相当于第一个例子中的vm_read_mem,vm_push_imm两条指令)

vm_get_context

vm_add

vm_set_context(相当于第一个例子中的vm_pop,vm_write_mem两条指令)

然后将上述的四条IL指令,即:

IL_0001:ldarg.0

IL_0002:ldarg.1

IL_0003:add

IL_0004:stloc.0

替换成包括了与驱动层指令的调用相关的代码、指令和/或函数在内的以下代码段:

System.Byte[]ab=new System.Byte[size];

System.Init(ab,...);//初始化自定义指令二进制编码

object[]ao=new object[3];

ao[0]=arg.0;(arg.0--loc.0)//准备loc.0

ao[1]=arg.1;(arg.1--loc.1)//准备loc.1

ao[2]=loc.0;(loc.0--loc.2)//准备loc.2

call_driver_stub(ao,ab);

loc.0=ao[2];//将loc.2回写到原方法的局部变量loc.0

在本实施例中,上面的代码段中的ab中包含了自定义指令的二进制编码。

下面对经过写入驱动层指令和包括了与驱动层指令的调用相关的代码、指令和/或函数在内的代码段后的可执行文件的执行过程进行具体说明。

经安全处理后的.NET可执行文件执行到test_add函数的IL指令中上述替换的代码段(即原先的上述四条指令位置处)时,通过System.Init(ab,...)设置ab中的自定义指令二进制编码,应用层通过ao[0]=arg.0和ao[1]=arg.1设置了test_add函数的两个参数的信息,通过ao[2]=loc.0指明在ao[2]中存储要返回的结果,通过call_driver_stub函数调用驱动层模拟器。

驱动层模拟器接收到应用层传递的信息后,通过执行vm_read_mem指令取得第一个参数的信息,通过vm_push_imm指令将第一个参数值压入虚拟机堆栈;通过执行vm_read_mem指令取得第二个参数的信息,通过vm_push_imm指令将第二个参数值压入虚拟机堆栈;通过vm_add指令将堆栈中的两个参数相加,并将结果入栈和标志寄存器入栈,通过vm_pop指令将标志寄存器弹出,通过vm_write_mem指令将结果保存在ao[2]地址处。

应用层通过指令loc.0=ao[2]获得了执行的结果,即得到了test_add函数对应的返回值,至此,完成了一次应用层和驱动层的交互,可执行文件继续执行后续的指令和/代码。

下面对当用户需要对上述示例性的.NET可执行文件中的test_sub函数在驱动层进行模拟时的处理过程进行说明。

对于test_sub方法,对应的IL指令为

{

IL_0000:nop

IL_0001:ldarg.0

IL_0002:ldarg.1

IL_0003:sub

IL_0004:stloc.0

IL_0005:br.s IL_0007

IL_0007:ldloc.0

IL_0008:ret

}

上述用于实现test_sub函数的IL指令中可以在驱动层模拟的指令为:

IL_0001:ldarg.0

IL_0002:ldarg.1

IL_0003:sub

IL_0004:stloc.0

当用户选定Program类中的test_sub函数为目标函数时,将与上述四条IL指令的功能对应的驱动层指令保存到可执行文件中的预定位置处。这里对test_sub函数的上述四条IL指令采用的驱动层指令可以是:

vm_read_mem //读取第一个参数

vm_push_imm //将参数入栈

vm_read_mem //读取第二个参数

vm_push_imm //将参熟入栈

vm_sub //相减

vm_pop //弹出栈顶垃圾数据

vm_write_mem //将结果保存

然后将上述的四条IL指令,即:

IL_0001:ldarg.0

IL_0002:ldarg.1

IL_0003:sub

IL_0004:stloc.0

替换成包括了与驱动层指令的调用相关的代码、指令和/或函数在内的以下代码段:

System.Byte[]ab=new System.Byte[size];

System.Init(ab,...);//初始化自定义指令二进制编码

object[]ao=new object[3];

ao[0]=arg.0;(arg.0--loc.0)//准备loc.0

ao[1]=arg.1;(arg.1--loc.1)//准备loc.1

ao[2]=loc.0;(loc.0--loc.2)//准备loc.2

call_driver_stub(ao,ab);

loc.0=ao[2];//将loc.2回写到原方法的局部变量loc.0

在对test_sub函数的部分指令进行驱动层模拟的实施例中,应用层与驱动层之间的互动与对test_add函数的部分指令进行驱动层模拟的实施例类似,在此不再赘述。

本发明实施例同时提供了一种用于对可执行文件进行保护的装置,下面参照图5-7进行说明。

图5为本发明的对可执行文件进行保护的装置的一个实施例的示意性框图。

如图5所示,本发明实施例的对可执行文件进行保护的装置包括:

应用程序端,其配置为运行可执行文件;

驱动层模拟器,其配置为在可执行文件运行时,对所述可执行文件中的预定代码段的执行过程中的至少部分过程进行模拟执行,其中,所述至少部分过程不在应用程序端执行。

本发明实施例的装置在应用程序端运行可执行文件时,将可执行文件的预定代码段(部分代码或指令)的至少部分执行过程从应用程序端转移至驱动层模拟器进行模拟执行,这样对软件中预定代码或指令的保护的对抗从应用层转移到驱动层,进一步增加了调试难度,能够同时应对应用层保护软件抗分析性差的问题和硬件保护方法容易受限的问题。应当理解的是,可执行文件中可以包括多个上述的预定代码段,从而在运行到每个预定代码段处时均执行上述过程。

图6为本发明的对可执行文件进行保护的装置的另一个实施例的示意性框图。

在本发明一个实施例中,如图6所示,装置还可以包括处理单元,其可以配置为将与实现预定代码段的指令中的至少部分指令的功能对应的驱动层指令写入可执行文件中预定位置处。在该实施例中,预定代码段可对应于与其实现相关的多个指令(或代码),处理单元可将与其中的部分指令的功能对应的驱动层指令写入可执行文件中预定位置处。该预定位置可以是该部分指令原先所在行或其他行,或者也可以是可执行文件中的预定数组处,例如一个新增的全局数组。

在本发明一个实施例中,图6所示的处理单元还可以配置为,对于实现预定代码段的指令中的至少部分指令中的每条指令,在可执行文件中的预定位置写入至少一条驱动层指令。在本发明实施例中,对于用于实现预定代码段的指令中的至少部分指令中的每条指令,可能通过一条驱动层指令就能实现其功能,也可能通过两条驱动层指令实现其功能,具体由所选用的驱动层指令的类型而确定。

在本发明另一个实施例中,图6所示的处理单元可以进一步配置为将实现可执行文件中预定代码段的指令中的至少部分指令替换为包括与驱动层指令的调用相关的指令和/或函数在内的第一代码段。如此可将与预定代码段的执行相关的指令中的至少部分指令完全隐藏,并且在可执行文件运行时,通过与驱动层指令的调用相关的指令和/或函数来对驱动层指令进行调度,能够由处理单元使得驱动层指令从应用程序端发送至驱动层模拟器,并使得应用程序端从驱动层模拟器接收返回的相应执行结果,从而在将上述的部分指令隐藏的同时能够确保可执行文件的顺利执行。

图7为本发明的对可执行文件进行保护的装置的又一个实施例的示意性框图。

在本发明一个实施例中,如图7所示,装置还包括分析单元,其配置为分析所述可执行文件中的多个函数,并将多个函数中的至少一个目标函数对应的代码段确定为预定代码段。分析单元可配置为基于不同的条件来确定目标函数。例如,分析单元可配置为根据如下条件确定所述目标函数:对于实现所述目标函数的指令中的至少部分指令,存在功能对应的驱动层指令。或者,分析单元可配置为将具有参数和返回值的函数确定为目标函数。另外,分析单元还可以配置为将具有同一类型的参数和返回值的函数确定为目标函数。

本发明在对可执行文件进行保护时,将部分代码或指令的执行过程转移至驱动层模拟执行,这样对软件中代码或指令的保护的对抗从应用层转移到驱动层,进一步增加了调试难度,从而达到了保护软件的目的。

当然,以上所述是本发明的部分实施方式,应当指出,对于本技术领域的技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为落入本发明的保护范围。

再多了解一些
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1