保护.net软件安全的方法和设备的制作方法

文档序号:6400969阅读:138来源:国知局
专利名称:保护.net软件安全的方法和设备的制作方法
技术领域
本发明涉及计算机及通信技术领域,具体涉及一种保护.NET软件安全的方法和设备,加强对可执行文件与本地动态链接库文件之间的接口的安全保护,防止被破坏。
背景技术
很多.NET软件都包含一些可执行程序(托管代码的.exe文件)和本地动态链接库文件(如.dll等格式的文件)。软件在运行时可执行程序调用动态库中导出的接口以执行只有本地代码才能实现的功能。由于它们之间是动态链接,因此导出接口是通过函数名称和函数原形(签名)相关的机制来实现,每一个导出函数都有一个对应的本地(PInvoke)方法,在.NET托管代码中通过调用本地方法来调用对应的导出函数。由于.NET可执行程序和动态链接库之间的接口是以函数名称和签名来实现的,而目前的代码保护主要都是单纯保护.NET可执行程序,或者单纯保护动态链接库中的本地代码,对它们之间的接口的保护很少涉及,这些接口暴露出来的信息很可能被破解者用来探测和发现软件的逻辑和流程,从而对软件造成破坏。

发明内容
为了解决上述技术问题,本发明所要解决的技术问题是提供一能对软件的可执行程序和动态链接库之间的导出接口进行保护,提高.NET软件安全性的方法和系统。为了解决上述技术问题,本发明提供了一种保护.NET软件安全的方法,包括如下步骤:查找步骤:从所述.NET软件中的动态链接库文件中查找出所有导出函数并建立导出函数表;核对步骤:如果所述.NET软件中的可执行文件中有对本地方法的调用,则核对所述调用所对应的导出函数的名称是否在上述导出函数表中,如在,则将所述本地方法的相关参数存储于所述导出函数表中,如果所述.NET软件中的可执行文件中没有所述对本地方法的调用,则执行下述替换步骤;改写步骤:生成派遣代码片段,替换所述可执行文件中的对所述本地方法的调用的代码,并返回所述核对步骤,其中所述派遣代码片段用于调用统一导出函数:替换步骤:生成所述统一导出函数,并将所述动态链接库文件中的所有导出函数的名称替换为所述统一导出函数的名称,所述统一导出函数用于跳转到原导出函数。作为优选,在所述查找步骤中:为每个导出函数分配一个索引值以建立所述导出函数表,并将导出函数的名称与索引值对应存储,所述导出函数表以数据库的表的形式或者以文件的形式存储。作为优选,在所述核对步骤中:如果核对所述调用所对应的导出函数的名称不在所述导出函数表中,则继续查找所述.NET软件中的可执行文件中的下一个对本地方法的调用。
作为优选,在所述核对步骤中:所述本地方法的相关参数包括签名、返回值和参数类型,其中,根据可执行文件的.NET元数据表中所记录的所述本地方法的签名获得该本地方法的返回值和参数类型。作为优选,在所述改写步骤中:所述派遣代码片段将所述统一导出函数所代替的原导出函数在所述导出函数表中的索引值及所传入的参数封装为一个字节数组作为所述统一导出函数的参数。作为优选,在所述替换步骤中:所述统一导出函数从其参数中提取出原导出函数的索引值和原导出函数的参数,然后跳转到原导出函数。作为优选,在所述替换步骤之后,执行属性修改步骤:将所述动态链接库文件中的原导出函数的属性修改为不可导出。作为优选,在所述改写步骤中,还包括将所述字节数组加密的步骤。作为优选,在所述查找步骤或所述核对步骤中还包括对所述导出函数表加密的步骤。作为优选,所述动态链接库文件包括.dll格式的文件,所述可执行文件包括.exe格式的文件。本发明还提供了一种保护.NET软件安全的设备,包括:查找模块,用于从所述.NET软件中的动态链接库文件中查找出所有导出函数并建立导出函数表;核对模块,在确认所述.NET软件中的可执行文件中有对本地方法的调用时,所述核对模块核对所述调用所对应的导出函数的名称是否在上述导出函数表中,如在,则将所述本地方法的相关参数存储于所述导出函数表中;改写模块,用于生成派遣代码片段,替换所述可执行文件中的对所述本地方法的调用的代码,其中所述派遣代码片段用于调用统一导出函数:替换模块,当所述核对模块确认所述.NET软件中的可执行文件中没有所述对本地方法的调用时,所述替换模块生成所述统一导出函数,并将所述动态链接库文件中的所有导出函数的名称替换为所述统一导出函数的名称,所述统一导出函数用于跳转到原导出函数。作为优选,所述保护.NET软件安全的设备还包括加密模块,用于对所述统一导出函数的参数进行加密。本发明的有益效果在于:本发明的保护.NET软件安全的方法及系统,通过在动态链接库中插入一个统一导出函数,并将动态链接库中导出函数替换为统一导出函数名称,将可执行文件中调用本地方法代码的部分替换为调用统一函数,将要调用的导出函数的索引值和传入的参数封装为一个字节数组,作为统一导出函数的参数调用,使得软件的接口暴露出的只有统一导出函数,因此根据本发明提供的方法,可以提高软件反编译和调试的难度,增强软件的安全性。


图1为现有技术的.NET软件的结构框图。图2为采用本发明的实施例的保护.NET软件安全的方法保护的.NET软件的结构框图。图3为本发明的一个实施例的保护.NET软件安全的方法的流程图。图4为本发明的另一个实施例的保护.NET软件安全的方法的流程。图5为本发明的又一个实施例的保护.NET软件安全的设备的结构框图。
具体实施例方式下面结合附图和具体实施例对本发明作进一步详细描述,但不作为对本发明的限定。本实施例中,受保护的软件为某.NET软件A的结构如图1所示,软件A由.NET可执行程序a.exe和动态链接库文件b.dll组成,其中a.exe文件中存在两处本地(PInvoke)方法调用;b.dll中导出两个函数int funAbs (int)和int funMul (int, int),分别完成特定的功能,即完成取绝对值和乘法运算的功能。本发明所提供的保护.NET软件安全的方法,包括如下步骤:查找步骤:从所述.NET软件中的动态链接库文件中查找出所有导出函数并建立导出函数表;核对步骤:如果所述.NET软件中的可执行文件中有对本地方法的调用,则核对所述调用所对应的导出函数的名称是否在上述导出函数表中,如在,则将所述本地方法的相关参数存储于所述导出函数表中,如果所述.NET软件中的可执行文件中没有所述对本地方法的调用,则执行下述替换步骤;改写步骤:生成派遣代码片段,替换所述可执行文件中的对所述本地方法的调用的代码,并返回所述核对步骤,其中所述派遣代码片段用于调用统一导出函数:替换步骤:生成所述统一导出函数,并将所述动态链接库文件中的所有导出函数的名称替换为所述统一导出函数的名称,所述统一导出函数用于跳转到原导出函数。具体地,请参考图3所示的流程图并参考图2所示的框图详细说明发明的保护.NET软件安全的方法的一个实施方式的详细工作过程。如图3所示,本发明的保护.NET软件安全的方法一种实施方式,包括如下步骤:S1:枚举所述.NET软件中的动态链接库文件,如果找到动态链接库文件则执行S2,如果该软件中无动态链接库文件,则结束;如果软件中没有动态链接库文件,则不需要进行接口保护,这是显然的。如果软件中包括动态链接库文件,就采用本发明的方法进行保护。S2:查找动态链接库文件中所有导出函数,为每个导出函数分配一个索引建立导出函数表,并将导出函数的名称与索引对应存储,然后执行S3。在S2步骤中,建立了导出函数表,在软件执行阶段,通过从该导出函数表中按照导出函数的索引值找到相应的导出函数,还原到本来的导出函数。S3:在图3所示的具体实施例的流程图中,步骤S3被细分成两个步骤:S31:枚举所述.NET软件中的可执行文件,并查找其中一个所述可执行文件中是否有对本地方法的调用,查找完毕时,执行步骤S32的判断步骤,S32如果有对本地方法的调用,则执行步骤S4,如果无对本地方法的调用,执行步骤S7。此步骤中,如果可执行文件中无本地方法调用,显然也不必再进行下面的步骤。
S4:检查要调用的本地方法所对应的导出函数的名称是否在步骤S2中的导出函数表中,如果在,执行步骤S5,否则执行步骤S3,以继续查找下一个对本地方法的调用。S5:根据可执行文件.NET元数据表中所记录的所述本地方法的签名获得该本地方法的返回值和参数类型,并将本地方法的相关参数,包括签名、返回值和参数类型对应地存储于步骤S2中的导出函数表中,然后执行S6。通过步骤S4和S5,使得可执行文件中记录的所述本地方法与动态链接库文件中的导出函数一一对应,并以数据库的表的形式或者以文件的形式存储,可插入动态链接库中。S6:生成派遣代码片段,替换所述可执行文件中的对本地方法的调用的代码,所述派遣代码片段的功能是调用统一导出函数,并将所述统一导出函数所代替的原导出函数在所述导出函数表中的索引及所传入的参数封装为一个字节数组作为所述统一导出函数的参数,在步骤S6完成之后,返回执行步骤S3,以继续查找下一个对本地方法的调用。通过步骤S6,使可执行文件中的对本地方法的调用的代码被取消,派遣代码片段的功能是调用统一导出函数,该统一导出函数为统一的名称,统一导出函数的参数是字节数组,从其名称和参数上看不出其逻辑结构,也无从破解。S7:生成统一的统一导出函数,并将所述动态链接库文件中的所有导出函数的名称替换为所述统一导出函数的名称,所述统一导出函数的功能是从其参数中提取出原导出函数的索引和原导出函数的参数,然后跳转到原导出函数。步骤S7和步骤S6是对应设置的,在动态链接库文件中只保存统一的统一导出函数,原有的导出函数的名称全部被取代,破解者从动态链接库文件和可执行文件中均找不到导出函数的名称和实际参数,无从猜测其逻辑结构,从而增加了软件反编译和调试的难度,增强软件的安全性。动态链接库文件和可执行文件中之间通过导出函数的索引值联系。如图3所示,为进一步增加其安全性,在步骤S7之后,执行步骤S8:将所述动态链接库文件中的原导出函数修改为不可导出。在图3所示的实施例中,在步骤S8之后,增加步骤S9:判断动态链接库文件是否查找完毕的步骤,如果查找完毕,就结束,如果动态链接库文件还未查找完毕,则继续查找,并对回到步骤S2,对下一个动态链接库文件执行同样的步骤。为了增强软件的安全性,作为优选,在步骤S6中还包括将所述字节数组加密的步骤。在步骤S2或S5中还包括对所述导出函数表加密的步骤。通过加密,增强软件被破解的难度,即使第三方恶意软件找到了所要保护软件的导出函数表,也无从下手。以下结合图1、图2和图3,详细说明采用发明的保护.NET软件安全的方法进行保护后的.NET软件的详细运行过程。如图1所示,该.NET软件中,可执行文件a.exe中存在两处本地方法调用,其功能是分别调用从动态链接库文件b.dll中导出两个函数funAbs(int),和funMul (int, int),以执行求绝对值和乘法的功能。显然,取绝对值的函数包括一个参数,其数据类型为int,乘法函数包括两个int参数。在动态链接库文件b.dll中包括两个导出函数,分别用于导出函数int funAbs (int)和int funMul (int, int),分别完成特定的功能(取绝对值和乘法)。如图2所示,采用本发明的保护.NET软件安全的方法的进行保护后,图1所示的.NET程序中的可执行文件a.exe文件中对本地方法调用的代码被一段派遣代码代替,该派遣代码的功能是调用统一导出函数,并将所述统一导出函数所代替的原导出函数在所述导出函数表中的索引及所传入的参数封装为一个字节数组作为所述统一导出函数的参数。在本地动态链接库文件b.dll中,增加有导出函数表,导出函数表的形式如表I所示,为每个导出的函数分配一个索引值,并与本地方法对应。每个索引值对应于相应的本地方法的签名和返回值,即表I还可以再增加两列,分别存储每个索引值对应于相应的本地方法的签名和返回值。表I导出函数表
权利要求
1.一种保护.NET软件安全的方法,其特征在于,包括如下步骤: 查找步骤:从所述.NET软件中的动态链接库文件中查找出所有导出函数并建立导出函数表; 核对步骤:如果所述.NET软件中的可执行文件中有对本地方法的调用,则核对所述调用所对应的导出函数的名称是否在上述导出函数表中,如在,则将所述本地方法的相关参数存储于所述导出函数表中,如果所述.NET软件中的可执行文件中没有所述对本地方法的调用,则执行下述替换步骤; 改写步骤:生成派遣代码片段,替换所述可执行文件中的对所述本地方法的调用的代码,并返回所述核对步骤,其中所述派遣代码片段用于调用统一导出函数: 替换步骤:生成所述统一导出函数,并将所述动态链接库文件中的所有导出函数的名称替换为所述统一导出函数的名称,所述统一导出函数用于跳转到原导出函数。
2.如权利要求1所述的保护·.NET软件安全的方法,其特征在于,在所述查找步骤中: 为每个导出函数分配一个索引值以建立所述导出函数表,并将导出函数的名称与索引值对应存储,所述导出函数表以数据库的表的形式或者以文件的形式存储。
3.如权利要求1所述的保护.NET软件安全的方法,其特征在于,在所述核对步骤中: 如果核对所述调用所对应的导出函数的名称不在所述导出函数表中,则继续查找所述.NET软件中的可执行文件中的下一个对本地方法的调用。
4.如权利要求1所述的保护.NET软件安全的方法,其特征在于,在所述核对步骤中: 所述本地方法的相关参数包括签名、返回值和参数类型,其中,根据可执行文件的.NET元数据表中所记录的所述本地方法的签名获得该本地方法的返回值和参数类型。
5.如权利要求1所述的保护.NET软件安全的方法,其特征在于,在所述改写步骤中: 所述派遣代码片段将所述统一导出函数所代替的原导出函数在所述导出函数表中的索引值及所传入的参数封装为一个字节数组作为所述统一导出函数的参数。
6.如权利要求1所述的保护.NET软件安全的方法,其特征在于,在所述替换步骤中: 所述统一导出函数从其参数中提取出原导出函数的索引值和原导出函数的参数,然后跳转到原导出函数。
7.如权利要求1所述的保护.NET软件安全的方法,其特征在于, 在所述替换步骤之后,执行属性修改步骤:将所述动态链接库文件中的原导出函数的属性修改为不可导出。
8.如权利要求5所述的保护.NET软件安全的方法,其特征在于,在所述改写步骤中,还包括将所述字节数组加密的步骤。
9.如权利要求2或3所述的保护.NET软件安全的方法,其特征在于,在所述查找步骤或所述核对步骤中还包括对所述导出函数表加密的步骤。
10.如权利要求1所述的保护.NET软件安全的方法,其特征在于,所述动态链接库文件包括.dll格式的文件,所述可执行文件包括.exe格式的文件。
11.一种保护.NET软件安全的设备,其特征在于,包括: 查找模块,用于从所述.NET软件中的动态链接库文件中查找出所有导出函数并建立导出函数表; 核对模块,在确认所述.NET软件中的可执行文件中有对本地方法的调用时,所述核对模块核对所述调用所对应的导出函数的名称是否在上述导出函数表中,如在,则将所述本地方法的相关参数存储于所述导出函数表中; 改写模块,用于生成派遣代码片段,替换所述可执行文件中的对所述本地方法的调用的代码,其中所述派遣代码片段用于调用统一导出函数: 替换模块,当所述核对模块确认所述.NET软件中的可执行文件中没有所述对本地方法的调用时,所述替换模块生成所述统一导出函数,并将所述动态链接库文件中的所有导出函数的名称替换为所述统一导出函数的名称,所述统一导出函数用于跳转到原导出函数。
12.如权利要求11所述的保护.NET软件安全的设备,其特征在于,还包括加密模块,用于对所述统一导出函数的 参数进行加密。
全文摘要
本发明公开了一种保护.NET软件安全的方法,包括如下步骤查找步骤从软件中的动态链接库文件中查找出所有导出函数并建立导出函数表;核对步骤核对调用所对应的导出函数的名称是否在上述导出函数表中,如在,则将本地方法的相关参数存储于导出函数表中,如果没有对本地方法的调用,则执行替换步骤;改写步骤生成派遣代码片段,替换可执行文件中的对本地方法的调用的代码替换步骤生成统一导出函数,并将所有导出函数的名称替换为统一导出函数的名称,统一导出函数用于跳转到原导出函数。本发明的保护.NET软件安全的方法及系统使软件的接口暴露出的只有统一导出函数,可提高软件反编译和调试的难度,增强软件的安全性。
文档编号G06F21/14GK103186730SQ20131010025
公开日2013年7月3日 申请日期2013年3月26日 优先权日2013年3月26日
发明者孙吉平, 韩勇 申请人:北京深思数盾科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1