基于执行顺序和单点逻辑的源代码加固方法及装置与流程

文档序号:15386916发布日期:2018-09-08 00:40阅读:131来源:国知局

本申请涉及软件安全技术领域,尤其涉及一种基于执行顺序和单点逻辑的源代码加固方法及装置。



背景技术:

现如今,移动互联网、物联网、车联网等技术高速发展,终端的数量越来越多,终端中安装的应用程序也越来越多,这给人们的工作和生活带来了极大的便利。应用程序运行过程中会产生一些重要的信息,这引起了攻击者的极大兴趣,使得这些重要信息存在被泄露的风险。

目前,攻击者常使用反汇编、反编译等静态分析工具,对应用程序的源代码进行逆向分析破解,获得应用程序的执行逻辑,从而非法窃取、非法篡改应用程序运行过程中产生的重要信息。

针对上述风险,现有技术常通过对应用程序的源代码进行混淆,提高源代码的防逆向分析能力,降低应用程序运行过程中产生的重要信息被泄露的风险。但是,现有的控制流平坦化等源代码混淆方法依然存在被破解的风险,源代码的防逆向分析能力还有待提高。



技术实现要素:

本申请实施例提供一种基于执行顺序和单点逻辑的源代码加固方法及装置,以提高源代码的防逆向分析能力。

第一方面,提供了一种基于执行顺序和单点逻辑的源代码加固方法,所述方法包括:

基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块;

基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表,所述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的第二源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址;

将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;

使用不透明谓词对所述第一源代码的函数中的条件变量进行模糊处理,得到所述加固后的第二源代码。

第二方面,提供了一种基于执行顺序和单点逻辑的源代码加固装置,包括:

代码块拆分模块,用于基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块;

跳转表建立模块,用于基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表,所述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的第二源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址;

第一加固模块,用于将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;

第二加固模块,用于使用不透明谓词对所述第一源代码的函数中的条件变量进行模糊处理,得到所述加固后的第二源代码。

第三方面,本申请实施例还提供了一种电子设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如第一方面所述的方法的步骤。

第四方面,本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面所述的方法的步骤。

本申请实施例采用的上述至少一个技术方案,可以基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块;基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表,所述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的第二源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址;将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;使用不透明谓词对所述第一源代码的函数中的条件变量进行模糊处理,得到所述加固后的第二源代码。由于一方面,通过跳转表中的代码块标记实现了原始源代码的代码块之间的跳转逻辑,因此可以隐藏原始源代码的执行顺序;另一方面,利用不透明谓词对源代码中的条件变量进行了模糊处理,因此可以增大加固后的源代码的破解难度,进而可以提高源代码的防逆向分析能力。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1为本申请实施例提供的一种基于执行顺序和单点逻辑的源代码加固方法的一种具体实现方式的流程示意图;

图2为图1所示的实施例中的步骤103的一种详细流程示意图;

图3为本申请实施例提供的一种基于执行顺序和单点逻辑的源代码加固装置的一种具体实现方式的结构示意图;

图4为图3所示的实施例中的模块303的一种详细结构示意图;

图5为本申请实施例提供的电子设备的结构示意图。

具体实施方式

为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

为了提高源代码的防逆向分析能力,本申请实施例提供了一种基于执行顺序和单点逻辑的源代码加固方法和装置,下面分别进行说明。

需要说明的是,实施本申请实施例提供的一种基于执行顺序和单点逻辑的源代码加固方法及装置的执行主体,可以是客户端,也可以是服务器,本申请实施例对实施上述方法及装置的具体实施主体不做限定。

下面先对本申请实施例提供的一种基于执行顺序和单点逻辑的源代码加固方法进行说明。

如图1所示,本申请实施例提供的一种基于执行顺序和单点逻辑的源代码加固方法,可以包括如下步骤:

步骤101、基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块。

上述应用程序,可以是需要保护的目标应用程序。

代码块,可以理解为是源代码中能够顺序执行的一段代码,以跳转逻辑开始并以跳转逻辑结束,通常由一个花括号“{}”括起来。

例如:

当然,在一些情况下,代码块也可以不由花括号括起来。

更为具体的,代码块可以是原始源代码中跳转语句对应的代码段,例如上述例子中的if语句与else语句分别对应的代码块1和代码块2。

其中,跳转语句可以包括:循环语句、条件语句、返回语句和结束语句等语句中的任一种。循环语句例如可以包括:while、do-while、for、for/in等语句。条件语句例如可以包括:if/else、switch/case等语句。返回语句例如可以是return语句。结束语句例如可以是break语句。此外,跳转语句还可以包括goto、continue等语句。

可以理解,上述循环语句、条件语句、返回语句和结束语句等语句仅是对跳转语句的举例说明,并不构成对本申请实施例的限定。

步骤102、基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表。

上述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址。

在沿用上述步骤101中所举的例子的情况下,例如,可以将数组address_array[3]={代码块1的地址,代码块2的地址,代码块3的地址}作为跳转表进行保存,也即将数组元素“address_array[0]”与“代码块1的地址”的对应关系,数组元素“address_array[1]”与“代码块2的地址”的对应关系,以及数组元素“address_array[2]”与“代码块3的地址”的对应关系保存至跳转表中。相应的,数组元素“address_array[0]”可以作为访问“代码块1”在内存中的地址的第一代码块标记,数组元素“address_array[1]”可以作为访问“代码块2”在内存中的地址的第一代码块标记,以此类推,本说明书不再详述。

步骤103、将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成所述加固后的源代码。

在一种具体实施方式中,如图2所示,上述步骤103可以包括:

子步骤201、确定第一代码块在所述原始源代码中的初始位置。

第一代码块,可以是需要隐藏或混淆其在原始源代码中的执行顺序的目标代码块。

可以理解,在本申请实施例中,需要隐藏或混淆其执行顺序的第一代码块的数量可以一个也可以是多个,本申请实施例对此不做限定。

子步骤202、在所述原始源代码的第一位置插入所述第一代码块。

第一位置是与所述初始位置不同的位置,也就是说可以在与上述初始位置不同的任一位置插入所述第一代码块。

假设原始源代码为:

在将上述原始源代码中的“代码块1”和“代码块2”均作为第一代码块时,上述初始位置即为“代码块1”和“代码块2”在上述原始源代码中的位置。

则,在与上述初始位置不同的第二位置插入第一代码块后的源代码可以为:

子步骤203、将位于所述初始位置的所述第一代码块替换为第一预设代码。

第一预设代码可以包括:第一预设跳转语句和第一代码块标记;其中,第一预设跳转语句用于访问第一代码块标记,且第一预设跳转语句包括但不限于goto语句。第一代码块标记用于访问所述第一代码块对应的地址,以执行所述第一代码块。

沿用子步骤202中所举的例子可知,假设代码块1和代码块2对应的第一代码块标记分别为:address_array[0]、address_array[1],第一预设跳转语句为goto语句,则在执行完子步骤203后,得到的源代码可以为:

子步骤204、确定第二代码块,所述第二代码块为所述原始源代码在编译或运行时,执行完所述第一代码块后需要执行的下一代码块。

例如,在当原始源代码为子步骤101中所述的源代码时,假设第一代码块为代码块1和代码块2,那么,执行完第一代码块后需要执行的下一代码块为代码块3,也即第二代码块为代码块3。

子步骤205、在插入所述第一位置的第一代码块的结尾插入第二预设代码。

上述第二预设代码可以包括:第二预设跳转语句和第二代码块标记;其中,所述第二预设跳转语句用于访问所述第二代码块标记,且第二预设语句包括但不限于goto语句,例如第二预设语句可以事先定义的跳转函数,等等。第二代码块标记用于访问所述第二代码块对应的地址,以执行所述第二代码块。

例如,沿用子步骤203中所举的例子,可以在插入原始源代码中的“代码块1”和“代码块2”的结尾分别插入第二预设代码——gotoaddress_array[2],以在执行完代码块1或代码块2后执行代码块3,保证加固后的源代码在实际运行时的正确执行顺序。插入后的源代码为:

需要说明的是,图2所示的实施例仅列出了上述步骤103的一种具体实施方式,在实际实现时,本领域技术人员还可以基于本申请的发明构思采用其他具体实施方式来实现,本申请实施例对此不做限定。

步骤104、使用不透明谓词对所述第一源代码的函数中的条件变量进行模糊处理,得到所述加固后的第二源代码。

在一种具体实施方式中,上述步骤104可以包括:确定所述第一源代码的函数中的第一条件变量;在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;利用所述第二条件变量替换所述第一条件变量。

其中,第一条件变量可以理解为是第一源代码的函数中条件语句对应的变量。条件语句包括但不限于if语句、do-while语句和switch-case语句,等等。

更为具体的,第一条件变量可以是第一源代码中位于函数的分支跳转节点处的条件变量。分支跳转节点可以是if、ifelse、switch等分支语句所在的节点,相应的,第一条件变量即为分支语句中的变量。

例如,对于执行完上述步骤103后得到的加固后的第一源代码,可以确定出第一源代码的函数中的条件变量为“condition”。

不透明谓词,可以是当且仅当一个谓词在程序上确定点的输出在混淆前就确定时,称该谓词是不透明的。

具体而言,在本申请实施例中,不透明谓词可以为值恒定的函数表达式。当不透明谓词为恒为真的函数表达式时,在第一条件变量中添加不透明谓词之后,对第一条件变量的值不会造成任何影响。

更为具体的,不透明谓词可以为恒为真或恒为假的数学公式,例如:x(x+1)%2==0。其中,“==”表示恒等于,“%”表示求余数。该表达式中,x与x+1必然一个为奇数,另一个为偶数,因此x(x+1)必然为偶数,x(x+1)%2的值也必然为0。因此,表达式“x(x+1)%2==0”恒为真。

相应的,使用不透明谓词对上例中的第一源代码的条件变量“condition”进行模糊替换后的第二源代码可以为:

可选地,在上述步骤104中,所述在所述第一条件变量中添加至少一个不透明谓词可以包括:在所述第一条件变量之前或之后添加所述至少一个不透明谓词,并利用预设符号分隔所述第一条件变量和所述不透明谓词。

沿用上述举例,不透明谓词为表达式“x(x+1)%2==0”,预设符号为“+”,第一条件变量为“x”。那么,在第一条件变量之后添加不透明谓词,可得到下述源代码:

if(condition+x(x+1)%2==0){

}

更为具体的,在上述步骤104中,所述在所述第一条件变量中添加至少一个不透明谓词可以包括:利用预设规则将所述第一条件变量分割为多个字符段;在所述多个字符段之间添加所述至少一个不透明谓词。

在本实施例中,由于添加了不透明谓词,使得第二条件变量“condition+x(x+1)%2==0”相较于原始的第一条件变量“condition”而言复杂度更高,因此在很大程度上增加了源代码的反编译难度,加固了源代码。

当然,还可在第一条件变量中添加多个不透明谓词,以更加提高第一条件变量的复杂度。例如,分别在第一条件变量之前和第二条件变量之后添加不透明谓词“x(x+1)%2==0”,并用预设符号“+”分隔第一条件变量和不透明谓词,得到第二条件变量:x(x+1)%2+condition+x(x+1)%2==0。

在一个实施例中,可利用预设规则将第一条件变量分割为多个字符段,进而在多个字符段之间添加至少一个不透明谓词。

例如,第一条件变量为“xy”,预设规则为:将每两个变量分割开。那么,利用该预设规则可将第一条件变量“xy”分割为字符段“x”和“y”。假设不透明谓词为表达式“x(x+1)%2==0”,那么在分割后得到的字符段之间添加不透明谓词的结果即为x*x(x+1)%2==0*y,其中,“*”为用于分隔变量和不透明谓词的预设符号。

本实施例中,当第一条件变量被分割为三个或三个以上的字符段时,每两个字符段之间所添加的不透明谓词可相同、也可不同。

由本实施例可看出,由于不透明谓词被添加在了分割后的第一条件变量中,使得第二条件变量“x*x(x+1)%2==0*y”相较于原始的第一条件变量“xy”而言复杂度更高,因此在很大程度上增加了源代码的反编译难度,加固了源代码。

需要说明的是,在上述步骤104中,被模糊处理的条件变量可以是一个也可以是多个,本申请实施例对此不做限定。

本申请实施例提供的一种基于执行顺序和单点逻辑的源代码加固方法,由于一方面,通过跳转表中的代码块标记实现了原始源代码的代码块之间的跳转逻辑,因此可以隐藏原始源代码的执行顺序;另一方面,利用不透明谓词对源代码中的条件变量进行了模糊处理,因此可以增大加固后的源代码的破解难度,进而可以提高源代码的防逆向分析能力。

可选地,在另一实施例中,本申请实施例提供的一种基于代码执行顺序的源代码加固方法,还可以包括:对所述第一预设代码和/或所述第二预设代码进行加密。

例如,可以用乱码将所述第一预设代码和/或所述第二预设代码进行替换,以实现对所述第一预设代码和/或所述第二预设代码的加密。当然还可以采用其他方式对第一预设代码和/或第二预设代码进行加密,本申请实施例对此不做限定。

可以理解,在本申请实施例中,对第一预设代码和/或所述第二预设代码进行加密,可以更好地隐藏源代码中代码块的正确执行顺序,提高破解加固后的源代码的难度,进一步提升加固后的源代码的防逆向分析能力。

可选地,在又一实施例中,本申请实施例提供的一种基于代码执行顺序的源代码加固方法,还可以包括:对所述跳转表进行加密。

对跳转表的加密可以采用现有的加密算法进行加密,本申请实施例对此不做限定。

同样可以理解,在本申请实施例中,对反映代码块正确执行顺序的跳转表进行加密,可以更好地隐藏源代码中代码块的正确执行顺序,使得静态分析攻击者即使拿到了源代码,因无法获得跳转表中保存的正确执行顺序,而无法获知源代码的真实业务逻辑,进一步提升了源代码的防逆向分析能力。

可选地,在上述任一实施例的基础上,本申请实施例提供的一种基于代码执行顺序的源代码加固方法,还可以包括:将加固后的所述源代码存储至第一文件中;将加密后的所述跳转表存储至第二文件中。

其中,所述第一文件和所述第二文件为不同的文件。

在本申请实施例中,由于将加固后的源代码和加密后的跳转表分别保存到了不同的文件中,因此可以使跳转表变得更为隐蔽而不被静态分析攻击者获取,从而使攻击者无法获得跳转表中保存的正确执行顺序,因此可以进一步地提高源代码的防逆向破解能力。

在此基础上,本申请实施例提供的一种基于代码执行顺序的源代码加固方法,还可以包括:对所述第二文件进行加密。

具体的加密算法可以为现有的加密算法,本申请对此不做限定。

可以理解,对第二文件进行加密,可以进一步增加静态分析攻击者获取跳转表中隐藏的正确执行顺序的难度,从而进一步提升源代码的防逆向破解能力。

较佳的,针对所述跳转表的加密算法与针对所述第二文件的加密算法可以不同。这样,由于需要破解两种不同的加密算法才能获取跳转表中隐藏的正确执行顺序,因此可以更进一步地增加静态分析攻击者获取跳转表中隐藏的正确执行顺序的难度,从而更进一步提升源代码的防逆向破解能力。

可选地,在得到加固后的源代码之前,本申请实施例提供的一种基于代码执行顺序的源代码加固方法,还可以包括:在所述原始源代码中插入冗余代码。这也可以进一步提升源代码的防逆向破解能力。

相应于上述方法实施例,本申请实施例还提供了一种基于执行顺序和单点逻辑的源代码加固装置,下面进行说明。

如图3所示,本申请实施例提供了一种基于执行顺序和单点逻辑的源代码加固装置300,该装置300可以包括:代码块拆分模块301、跳转表建立模块302和第一加固模块303。

代码块拆分模块301,用于基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块。

上述应用程序,可以是需要保护的目标应用程序。

代码块,可以理解为是源代码中能够顺序执行的一段代码,以跳转逻辑开始并以跳转逻辑结束,通常由一个花括号“{}”括起来,当然也可以不由花括号括起来。

更为具体的,代码块可以是原始源代码中跳转语句对应的代码段。

跳转表建立模块302,用于基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表。

上述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址。

第一加固模块303,用于将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成所述加固后的源代码。

在一种具体实施方式中,如图4所示,第一加固模块303可以包括:第一确定子模块401、第一插入子模块402、替换子模块403、第二确定子模块404和第二插入子模块405。

第一确定子模块401,用于确定第一代码块在所述原始源代码中的初始位置。

第一代码块,可以是需要混淆其在原始源代码中的执行顺序的目标代码块。

可以理解,在本申请实施例中,需要隐藏或混淆其执行顺序的第一代码块的数量可以一个也可以是多个,本申请实施例对此不做限定。

第一插入子模块402,用于在所述原始源代码的第一位置插入所述第一代码块。

第一位置是与所述初始位置不同的位置,也就是说可以在与上述初始位置不同的任一位置插入所述第一代码块。

替换子模块403,用于将位于所述初始位置的所述第一代码块替换为第一预设代码。

第一预设代码可以包括:第一预设跳转语句和第一代码块标记;其中,第一预设跳转语句用于访问第一代码块标记,且第一预设跳转语句包括但不限于goto语句。第一代码块标记用于访问所述第一代码块对应的地址,以执行所述第一代码块。

第二确定子模块404,用于确定第二代码块,所述第二代码块为所述原始源代码在编译或运行时,执行完所述第一代码块后需要执行的下一代码块。

第二插入子模块405,用于在插入所述第一位置的第一代码块的结尾插入第二预设代码。

上述第二预设代码可以包括:第二预设跳转语句和第二代码块标记;其中,所述第二预设跳转语句用于访问所述第二代码块标记,且第二预设语句包括但不限于goto语句,例如第二预设语句可以事先定义的跳转函数,等等。第二代码块标记用于访问所述第二代码块对应的地址,以执行所述第二代码块。

需要说明的是,图4所示的实施例仅列出了上述模块303的一种具体实施方式,在实际实现时,本领域技术人员还可以基于本申请的发明构思采用其他具体实施方式来实现,本申请实施例对此不做限定。

第二加固模块304,用于使用不透明谓词对所述第一源代码的函数中的条件变量进行模糊处理,得到加固后的第二源代码。

在一种具体实施方式中,第二加固模块304,具体可以包括:

确定子模块,用于确定所述第一源代码的函数中的第一条件变量;

添加子模块,用于在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;

替换子模块,用于利用所述第二条件变量替换所述第一条件变量。

在一个实施例中,不透明谓词包括恒为真的函数表达式。

在一个实施例中,上述添加子模块可以包括:

添加及分隔单元,用于在第一条件变量之前或之后添加至少一个不透明谓词,并利用预设符号分隔第一条件变量和不透明谓词。

在一个实施例中,上述添加子模块可以包括:

分割单元,用于利用预设规则将第一条件变量分割为多个字符段;

添加单元,用于在多个字符段之间添加至少一个不透明谓词。

需要说明的是,在第二加固模块304中,被模糊处理的条件变量可以是一个也可以是多个,本申请实施例对此不做限定。

本申请实施例提供的一种基于执行顺序和单点逻辑的源代码加固装置,由于一方面,通过跳转表中的代码块标记实现了原始源代码的代码块之间的跳转逻辑,因此可以隐藏原始源代码的执行顺序;另一方面,利用不透明谓词对源代码中的条件变量进行了模糊处理,因此可以增大加固后的源代码的破解难度,进而可以提高源代码的防逆向分析能力。

可选地,在上述任一实施例的基础上,本申请实施例提供的一种基于代码执行顺序的源代码加固装置300,还可以包括:第一加密模块,用于对所述第一预设代码和/或所述第二预设代码进行加密。

例如,第一加密模块可以用乱码将所述第一预设代码和/或所述第二预设代码进行替换,以实现对所述第一预设代码和/或所述第二预设代码的加密。当然第一加密模块还可以采用其他方式对第一预设代码和/或第二预设代码进行加密,本申请实施例对此不做限定。

可以理解,在本申请实施例中,对第一预设代码和/或所述第二预设代码进行加密,可以更好地隐藏源代码中代码块的正确执行顺序,提高破解加固后的源代码的难度,进一步提升加固后的源代码的防逆向分析能力。

可选地,在上述任一实施例的基础上,本申请实施例提供的一种基于代码执行顺序的源代码加固装置300,还可以包括:第二加密模块,用于对所述跳转表进行加密。

对跳转表的加密可以采用现有的加密算法进行加密,本申请实施例对此不做限定。

同样可以理解,在本申请实施例中,对反映代码块正确执行顺序的跳转表进行加密,可以更好地隐藏源代码中代码块的正确执行顺序,使得静态分析攻击者即使拿到了源代码,因无法获得跳转表中保存的正确执行顺序,而无法获知源代码的真实业务逻辑,进一步提升了源代码的防逆向分析能力。

可选地,在上述任一实施例的基础上,本申请实施例提供的一种基于代码执行顺序的源代码加固装置300,还可以包括:第一文件保存模块和第二文件保存模块。

第一文件保存模块,用于将加固后的所述源代码存储至第一文件中。

第二文件保存模块,用于将加密后的所述跳转表存储至第二文件中。

其中,所述第一文件和所述第二文件为不同的文件。

在本申请实施例中,由于将加固后的源代码和加密后的跳转表分别保存到了不同的文件中,因此可以使跳转表变得更为隐蔽而不被静态分析攻击者获取,从而使攻击者无法获得跳转表中保存的正确执行顺序,因此可以进一步地提高源代码的防逆向破解能力。

在此基础上,本申请实施例提供的一种基于代码执行顺序的源代码加固装置,还可以包括:文件加密模块,用于对所述第二文件进行加密。

具体的加密算法可以为现有的加密算法,本申请对此不做限定。

可以理解,对第二文件进行加密,可以进一步增加静态分析攻击者获取跳转表中隐藏的正确执行顺序的难度,从而进一步提升源代码的防逆向破解能力。

较佳的,针对所述跳转表的加密算法与针对所述第二文件的加密算法可以不同。这样,由于需要破解两种不同的加密算法才能获取跳转表中隐藏的正确执行顺序,因此可以更进一步地增加静态分析攻击者获取跳转表中隐藏的正确执行顺序的难度,从而更进一步提升源代码的防逆向破解能力。

可选地,在得到加固后的源代码之前,本申请实施例提供的一种基于代码执行顺序的源代码加固装置,还可以包括:冗余代码插入模块,用于在所述原始源代码中插入冗余代码。这也可以进一步提升源代码的防逆向破解能力。

图5示出了是本申请实施例提供的一种电子设备的结构示意图。请参考图5,在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(random-accessmemory,ram),也可能还包括非易失性存储器(non-volatilememory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。

处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是isa(industrystandardarchitecture,工业标准体系结构)总线、pci(peripheralcomponentinterconnect,外设部件互连标准)总线或eisa(extendedindustrystandardarchitecture,扩展工业标准结构)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图5中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。

存储器,用于存放程序。具体地,程序可以包括程序代码,所述程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。

处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成基于执行顺序和单点逻辑的源代码加固装置。处理器,执行存储器所存放的程序,并具体用于执行以下操作:

基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块;

基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表,所述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的第二源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址;

将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;

使用不透明谓词对所述第一源代码的函数中的条件变量进行模糊处理,得到所述加固后的第二源代码。

上述如本申请图5所示实施例揭示的基于执行顺序和单点逻辑的源代码加固装置执行的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(centralprocessingunit,cpu)、网络处理器(networkprocessor,np)等;还可以是数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。

本申请实施例还提出了一种计算机可读存储介质,该计算机可读存储介质存储一个或多个程序,该一个或多个程序包括指令,该指令当被包括多个应用程序的电子设备执行时,能够使该电子设备执行图5所示实施例中基于执行顺序和单点逻辑的源代码加固装置执行的方法,并具体用于执行:

基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块;

基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表,所述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的第二源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址;

将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;

使用不透明谓词对所述第一源代码的函数中的条件变量进行模糊处理,得到所述加固后的第二源代码。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

需要说明的是,本申请中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。

以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

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