一种基于符号执行和单点逻辑的源代码加固方法及装置与流程

文档序号:15257985发布日期:2018-08-24 20:57阅读:115来源:国知局
本申请涉及软件安全
技术领域
,尤其涉及一种基于符号执行和单点逻辑的源代码加固方法及装置。
背景技术
:现如今,移动互联网、物联网、车联网等技术高速发展,终端的数量越来越多,终端中安装的应用程序也越来越多,这给人们的工作和生活带来了极大的便利。应用程序运行过程中会产生一些重要的信息,这引起了攻击者的极大兴趣,使得这些重要信息存在被泄露的风险。目前,攻击者常使用符号执行模型等静态分析工具对应用程序的源代码进行逆向分析破解,获得应用程序的执行逻辑,从而非法窃取、非法篡改应用程序运行过程中产生的重要信息。针对上述风险,现有技术常通过对应用程序的源代码进行混淆,提高源代码的防逆向分析能力,降低应用程序运行过程中产生的重要信息被泄露的风险。但是,现有的控制流平坦化等源代码混淆方法依然存在被破解的风险,源代码的防逆向分析能力还有待提高。技术实现要素:本申请实施例提供一种基于符号执行和单点逻辑的源代码加固方法及装置,以提高源代码的防逆向分析能力。第一方面,本申请实施例提供一种基于符号执行和单点逻辑的源代码加固方法,所述方法包括:确定待混淆的原始源代码中需要保护的目标变量;在所述原始源代码中插入至少一个中间变量,得到第一源代码;其中,所述至少一个中间变量用于访问所述目标变量;将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码;使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到加固后的第三源代码。第二方面,本申请实施例还提供一种基于符号执行和单点逻辑的源代码加固装置,包括:确定模块,用于确定待混淆的原始源代码中需要保护的目标变量;插入模块,用于在所述原始源代码中插入至少一个中间变量,得到第一源代码;其中,所述至少一个中间变量用于访问所述目标变量;替换模块,用于将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码;第一处理模块,用于使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到加固后的第三源代码。第三方面,本申请实施例还提供了一种电子设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如第一方面所述的方法的步骤。第四方面,本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面所述的方法的步骤。本申请实施例采用的上述至少一个技术方案,可以确定待混淆的原始源代码中需要保护的目标变量;在所述原始源代码中插入至少一个中间变量,得到第一源代码;其中,所述至少一个中间变量用于访问所述目标变量;将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码;使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到加固后的第三源代码。一方面,由于将原始源代码中的部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象。由于攻击者感兴趣的变量是需要保护的目标变量而非中间变量,因此可以欺骗攻击者不对通过中间变量间接表示的目标变量进行分析,最终提高源代码的防逆向分析能力。另一方面,利用不透明谓词对源代码中的条件变量进行了模糊处理,因此可以增大加固后的源代码的破解难度,从而也可以提高源代码的防逆向分析能力。附图说明此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:图1为本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固方法的一种具体实现方式的流程示意图;图2为本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固方法的另一种具体实现方式的流程示意图;图3为本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固装置的一种具体实现方式的结构示意图;图4为本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固装置的另一种具体实现方式的结构示意图;图5为本申请实施例提供的电子设备的结构示意图。具体实施方式为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。为了提高源代码的防逆向分析能力。本申请实施例提供了一种基于符号执行和单点逻辑的源代码加固方法和装置,下面分别进行说明。需要说明的是,实施本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固方法及装置的执行主体,可以是客户端,也可以是服务器,本申请实施例对实施上述方法及装置的具体实施主体不做限定。下面先对本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固方法进行说明。如图1所示,本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固方法,可以包括如下步骤:步骤101、确定待混淆的原始源代码中需要保护的目标变量。其中,待混淆的原始源代码可以是需要保护的目标应用程序的源代码。相应的,需要保护的目标变量,可以是待混淆的原始源代码中携带重要信息的变量,例如,假设目标应用程序为一款金融app(application),那么目标变量可以是该金融app的源代码中与支付密码有关的变量。步骤102、在所述原始源代码中插入至少一个中间变量,得到第一源代码。其中,所述至少一个中间变量用于访问所述目标变量。且上述中间变量可以是指针和数组等变量中的任一种。程序的静态分析,一般是指在程序不运行的情况下,通过分析程序的源代码或者可执行代码来获得程序在运行时的信息的技术。由于程序没有被真正执行,若要获得程序在运行时的状态信息,可以建立一个模型对程序在运行时的状态进行模拟,通过对这个模型进行操作,可以获得程序的运行状态的近似表示。符号执行就是这样的一个模型。由于符号执行一般是指用符号值代替真实值模拟执行程序的过程,且在该过程中模拟了变量在内存中的存储位置。因此,相应的,在一种具体实施方式中,若插入原始源代码中的中间变量为数组,则可以通过数组在模拟内存中的溢出访问实现对目标变量的访问。例如,假设待混淆的原始源代码为:则,在目标变量x的后面插入数组a[10]后的第一源代码为:这样,就可以通过对数组a[10]的上溢出元素a[-1]进行访问,实现对目标变量x的访问。为了更清楚地理解上述溢出访问的过程,可以用下表1所示的形式来形象地说明目标变量x以及数组a[10]在模拟内存中的相对存储位置关系。表1xa[0]a[1]a[2]a[3]…a[9]在表1中,数组a[10]共包括a[0]-a[9]10个元素,并且这10个元素按序占据模拟内存中的10个存储位置,目标变量x占据a[0]之前的一个存储位置,也即目标变量x占据数组a[10]的上溢出元素a[-1]所占据的位置,因此,可以通过访问内存中a[-1]所占据的存储位置,实现对目标变量x的访问。可以理解,数组a[10]的上溢出元素a[-1]并非数组a[10]中实际包含的元素,而是在存储位置上相对于数组a[10]具有溢出关系的元素。还需要说明的是,通常情况下,在源代码的正确性检测过程中,溢出访问被视为是一种错误,应避免出现。而本申请实施例正是刻意的利用这种表面属于错误的溢出访问来迷惑攻击者,使攻击者误以为源代码中出现错误,而不去分析该错误背后隐藏的目标变量,从而进一步地提高加固后的源代码的防逆向分析能力。在另一种具体实施方式中,若插入源代码中的中间变量为指针,则可以通过访问指针实现对目标变量的访问。步骤103、将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码。沿用步骤102中所举的例子,假设在目标变量x后面插入数组a[10]后的第一源代码为:那么,将第一源代码中部分目标变量x替换为数组a[10]的溢出元素a[-1]后,得到的加固后的第二源代码为:这样,当有攻击者利用符号执行模型这样的静态分析工具,对上述加固后的第二源代码中的目标变量x进行静态分析时,由于第二源代码中的部分变量x的名称已修改为中间变量的上溢出元素a[-1],使得攻击者仅能识别出未修改名称的少量目标变量x,而无法识别出已修改名称的目标变量x,相应的,从根本上达到混淆目标变量x与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量x的存储位置为存储中间变量的存储位置的假象,使得攻击者无法获得目标变量x在程序运行过程中的完整变化逻辑,从而提高了源代码的防逆向分析能力。步骤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中,被模糊处理的条件变量可以是一个也可以是多个,本申请实施例对此不做限定。本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固方法,一方面,由于部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象。由于攻击者感兴趣的变量是需要保护的目标变量而非中间变量,因此可以欺骗攻击者不对通过中间变量间接表示的目标变量进行分析,最终提高源代码的防逆向分析能力。另一方面,利用不透明谓词对源代码中的条件变量进行了模糊处理,因此可以进一步增大加固后的源代码的破解难度,从而进一步提高源代码的防逆向分析能力。可选地,在上述步骤102和步骤103中,为了增加源代码的混淆程度,以进一步增大源代码的防逆向分析能力,可以在原始源代码中插入多个能够访问所述目标变量的中间变量,并用多个中间变量分别替换第一源代码中的部分目标变量。因为,插入和替换的能够访问目标变量的中间变量越多,对攻击者造成的迷惑性越大,使得攻击者难以从众多的中间变量中分辨出目标变量,从而更好地提升混淆或加固后的源代码的防逆向分析能力。可选地,在第一种具体实施方式中,若上述中间变量为数组,则:上述步骤102具体可以包括:在所述目标变量的前面插入第一数组。相应的,上述步骤103具体可以包括:将所述第一源代码中的部分所述目标变量替换为所述第一数组的下溢出元素。其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量。数组中元素的最大下标一般为该数组中的最后一个元素的下标。需要再次说明的是,数组的溢出元素并非数组中实际包含的元素,而是在模拟内存中的存储位置上相对于数组具有溢出关系的元素。其中,下溢出元素,指的是存储位置相对于数组中实际包含的元素相对靠后的元素,相应的,上溢出元素,指的是存储位置相对于数组中实际包含的元素相对靠前的元素。例如,假设待混淆的原始源代码为:则,在目标变量x的前面插入第一数组b[5]后的第一源代码可以为:相应的,目标变量x以及第一数组b[5]在模拟内存中的相对存储位置关系如表2所示。表2b[0]b[1]…b[4]zx并假设第一数组b[5]与目标变量x在内存中相隔的存储位置的数量为m(第一数值),也即假设变量z占用的存储位置的数量为m,则用于访问目标变量x的下溢出元素的下标等于“4+m+1”。若m=1,则下溢出元素的下标为“4+1+1=6”,进而可以通过访问b[6]实现对目标变量x的访问。更为具体的,若第一数组与目标变量相邻,也即,若第一数组b[5]和目标变量x之间不存在变量z,使得m=0,则相应的,所述下溢出元素的下标为所述第一数组中元素的最大下标加1。具体的,沿用上述例子,下溢出元素的下标可以为“4+1=5”,进而可以通过访问b[5]实现对目标变量x的访问。在该具体实施方式中,由于插入原始源代码中的中间变量为第一数组,并用第一数组的溢出元素替换第一源代码中与所述目标变量相同的至少一个变量。因此,一方面由于部分变量被替换为中间变量,进而可以欺骗攻击者不对通过中间变量间接表示的目标变量进行分析,最终提高源代码的防逆向分析能力;另一方面,由于在源代码的正确性检测过程中,溢出访问被视为是一种错误,应避免出现,而本申请实施例正是刻意地利用这种表面属于错误的溢出访问来迷惑攻击者,使攻击者误以为源代码中出现错误,而不去分析该错误背后隐藏的目标变量,从而进一步地提高混淆或加固后的源代码的防逆向分析能力。可选地,在第二种具体实施方式中,若上述中间变量为数组,则:上述步骤102具体可以包括:在所述目标变量的后面插入第二数组。相应的,上述步骤103具体可以包括:将所述第一源代码中的部分所述目标变量替换为所述第二数组的上溢出元素。其中,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。数组中元素的最小下标一般为0。例如,假设待混淆的原始源代码为:则,在目标变量x的后面插入第二数组a[10]后的源代码可以为:相应的,目标变量x以及第二数组a[10]在模拟内存中的相对存储位置关系如表3所示。表3xya[0]a[1]…a[9]并假设目标变量x与第二数组a[10]在内存中相隔的存储位置的数量为n(第二数值),也即假设变量y占用的存储位置的数量为n,则用于访问目标变量x的上溢出元素的下标等于“0-n-1”。例如,若n=1,则上溢出元素的下标为“0-1-1=-2”,进而可以通过访问a[-2]实现对目标变量x的访问。更为具体的,若第二数组与目标变量相邻,也即,若第二数组a[10]和目标变量x之间不存在变量y,则n=0,相应的,所述上溢出元素的下标为所述第二数组中元素的最小下标减1。具体的,上溢出元素的下标可以为“0-1=-1”,也即可以通过访问a[-1]实现对目标变量x的访问。在该第二种具体实施方式中,由于插入原始源代码中的中间变量也为数组,因此可以取得与上述第一种具体实施方式相同的技术效果,此处不再赘述。可选地,在第三种具体实施方式中,若上述中间变量为数组,则:上述步骤102具体可以包括:在所述目标变量的前面插入第一数组,并在所述目标变量的后面插入第二数组。相应的,上述步骤103具体可以包括:将所述第一源代码中的第一部分所述目标变量替换为所述第一数组的下溢出元素,将所述第一源代码中的第二部分所述目标变量替换为所述第二数组的上溢出元素。其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。并且,所述第一部分和所述第二部分互不重叠,也即第一部分目标变量和第二部分目标变量为待混淆的原始源代码中不同位置出现的目标变量,且所述第一部分和所述第二部分的并集小于所述原始源代码中的所有目标变量组成的集合,也就是说,并不是对待混淆的原始源代码中出现的所有目标变量利用中间变量进行替换。例如,假设待混淆的原始源代码为:则,在目标变量x的前面插入第一数组b[5],在目标变量x的后面插入第二数组a[10]后的源代码可以为:相应的,第一数组b[5]、目标变量x以及第二数组a[10]在模拟内存中的相对存储位置关系如表4所示。表4b[0]b[1]…b[4]xa[0]a[1]…a[9]假设目标变量x与第一数组b[5]在内存中相隔的存储位置的数量为0(第一数值=0),则用于访问目标变量x的下溢出元素的下标等于“4+0+1”,也即可以通过访问b[5]实现对目标变量x的访问。同时,假设目标变量x与第二数组a[10]在内存中相隔的存储位置的数量也为0(第二数值=0),则用于访问目标变量x的上溢出元素的下标等于“0-0-1”,进而可以通过访问a[-1]实现对目标变量x的访问。根据上述例子可知,若所述第一数组和所述第二数组均与所述目标变量相邻,则:所述下溢出元素的下标为所述第一数组中元素的最大下标加1;所述上溢出元素的下标为所述第二数组中元素的最小下标减1。并且,可以理解,在第一数组和/或所述第二数组与目标变量不相邻时,由于攻击者难以分析出与目标变量相隔较远的数组有间接的联系,因此,对攻击者产生的迷惑性更大,从而也可以更进一步地提升源代码的防逆向分析能力。此外,相比于上述第一种和第二种具体实施方式,在第三种具体实施方式中,由于在目标变量的前面和后面分别插入了数组,并且对第一源代码中的第一部分目标变量用第一数组的溢出元素替换,对第一源代码中的第二部分目标变量用第二数组的溢出元素替换,使得得到的第二源代码中的目标变量至少用三种名称表示,这对攻击者造成的迷惑性更大,因此更能提高源代码的防逆向分析能力。在本申请提供的另一实施例中,如图2所示,在上述任一实施例的基础上,本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固方法还可以包括如下步骤:步骤105、采用预设方法对所述第三源代码进行处理。其中,所述预设方法包括下列方法中的一种或多种:控制流平坦化和其他变量的不透明谓词替换等。也就是说,除了在源代码中插入中间变量,并将源代码中的部分目标变量用中间变量替换之外,还可以采用其他方式对源代码进行混淆,以进一步地提高源代码的防逆向破解能力。相应于上述方法实施例,本申请实施例还提供了一种基于符号执行和单点逻辑的源代码加固装置,下面进行说明。如图3所示,本申请实时流提供了一种基于符号执行和单点逻辑的源代码加固装置,该装置可以包括:确定模块301、插入模块302、替换模块303和第一处理模块304。确定模块301,用于确定待混淆的原始源代码中需要保护的目标变量。其中,待混淆的原始源代码可以是需要保护的目标应用程序的源代码。相应的,需要保护的目标变量,可以是待混淆的原始源代码中携带重要信息的变量,例如,假设目标应用程序为一款金融app(application),那么目标变量可以是该金融app的源代码中与支付密码有关的变量。插入模块302,用于在所述原始源代码中插入至少一个中间变量,得到第一源代码。其中,所述至少一个中间变量用于访问所述目标变量。且上述中间变量可以是指针和数组等变量中的任一种。程序的静态分析,一般是指在程序不运行的情况下,通过分析程序的源代码或者可执行代码来获得程序在运行时的信息的技术。由于程序没有被真正执行,若要获得程序在运行时的状态信息,可以建立一个模型对程序在运行时的状态进行模拟,通过对这个模型进行操作,可以获得程序的运行状态的近似表示。符号执行就是这样的一个模型。由于符号执行一般是指用符号值代替真实值模拟执行程序的过程,且在该过程中模拟了变量在内存中的存储位置。因此,相应的,在一种具体实施方式中,若插入源代码中的中间变量为数组,则可以通过数组在模拟内存中的溢出访问实现对目标变量的访问。还需要说明的是,通常情况下,在源代码的正确性检测过程中,溢出访问被视为是一种错误,应避免出现。而本申请实施例正是刻意的利用这种表面属于错误的溢出访问来迷惑攻击者,使攻击者误以为源代码中出现错误,而不去分析该错误背后隐藏的目标变量,从而进一步地提高混淆或加固后的源代码的防逆向分析能力。在另一种具体实施方式中,若插入源代码中的中间变量为指针,则可以通过访问指针实现对目标变量的访问。替换模块303,用于将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码。第一处理模块304,用于使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到加固后的第三源代码。在一种具体实施方式中,上述第一处理模块304,具体用于:包括:确定子模块,用于确定所述第二源代码的函数中的第一条件变量;添加子模块,用于在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;替换子模块,用于利用所述第二条件变量替换所述第一条件变量。在一个实施例中,不透明谓词包括恒为真的函数表达式。在一个实施例中,上述添加子模块可以包括:添加及分隔单元,用于在第一条件变量之前或之后添加至少一个不透明谓词,并利用预设符号分隔第一条件变量和不透明谓词。在一个实施例中,上述添加子模块可以包括:分割单元,用于利用预设规则将第一条件变量分割为多个字符段;添加单元,用于在多个字符段之间添加至少一个不透明谓词。需要说明的是,在第一处理模块304中,被模糊处理的条件变量可以是一个也可以是多个,本申请实施例对此不做限定。本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固装置,一方面,由于部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象。由于攻击者感兴趣的变量是需要保护的目标变量而非中间变量,因此可以欺骗攻击者不对通过中间变量间接表示的目标变量进行分析,最终提高源代码的防逆向分析能力。另一方面,利用不透明谓词对源代码中的条件变量进行了模糊处理,因此可以进一步增大加固后的源代码的破解难度,从而进一步提高源代码的防逆向分析能力。可选地,在上述插入模块302和替换模块303中,为了增加源代码的混淆程度,以进一步增大源代码的防逆向分析能力,可以在源代码中插入多个能够访问所述目标变量的中间变量,并用多个中间变量分别替换源代码中的部分目标变量。因为,插入和替换的能够访问目标变量的中间变量越多,对攻击者造成的迷惑性越大,使得攻击者难以从众多的中间变量中分辨出目标变量,从而更好地提升混淆或加固后的源代码的防逆向分析能力。在第一种具体实施方式中,若所述中间变量为数组,则:上述插入模块302,具体用于:在所述目标变量的前面插入第一数组;上述替换模块303,具体用于:将所述第一源代码中的部分所述目标变量替换为所述第一数组的下溢出元素,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量。在该具体实施方式中,由于插入源代码中的中间变量为第一数组,并用第一数组的溢出元素替换所述第一源代码中与所述目标变量相同的至少一个变量。因此,一方面由于部分变量被替换为中间变量,进而可以欺骗攻击者不对通过中间变量间接表示的目标变量进行分析,最终提高源代码的防逆向分析能力;另一方面,由于在源代码的正确性检测过程中,溢出访问被视为是一种错误,应避免出现,而本申请实施例正是刻意的利用这种表面属于错误的溢出访问来迷惑攻击者,使攻击者误以为源代码中出现错误,而不去分析该错误背后隐藏的目标变量,从而进一步地提高混淆或加固后的源代码的防逆向分析能力。在第二种具体实施方式中,若所述中间变量为数组,则:上述插入模块302,具体用于:在所述目标变量的后面插入第二数组;上述替换模块303,具体用于:将所述第一源代码中的部分所述目标变量替换为所述第二数组的上溢出元素,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。在该第二种具体实施方式中,由于插入源代码中的中间变量也为数组,因此可以取得与上述第一种具体实施方式相同的技术效果,此处不再赘述。在第三种具体实施方式中,若所述中间变量为数组,则:上述插入模块302,具体用于:在所述目标变量的前面插入第一数组,并在所述目标变量的后面插入第二数组。相应的,上述替换模块303,具体用于:将所述第一源代码中的第一部分所述目标变量替换为所述第一数组的下溢出元素,将所述第一源代码中的第二部分所述目标变量替换为所述第二数组的上溢出元素。其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。并且,所述第一部分和所述第二部分互不重叠,也即第一部分目标变量和第二部分目标变量为待混淆的原始源代码中不同位置出现的目标变量,且所述第一部分和所述第二部分的并集小于所述源代码中的所有目标变量组成的集合,也就是说,并不是对待混淆的原始源代码中出现的所有目标变量利用中间变量进行替换。可以理解,在第一数组和/或所述第二数组与目标变量不相邻时,由于攻击者难以分析出与目标变量相隔较远的数组有间接的联系,因此,对攻击者产生的迷惑性更大,从而也可以更进一步地提升源代码的防逆向分析能力。此外,相比于上述第一种和第二种具体实施方式,在第三种具体实施方式中,由于在目标变量的前面和后面分别插入了数组,并且对第一原始源代码中的第一部分目标变量用第一数组的溢出元素替换,对第一源代码中的第二部分目标变量用第二数组的溢出元素替换,使得得到的第二源代码中的目标变量至少用三种名称表示,这对攻击者造成的迷惑性更大,因此更能提高源代码的防逆向分析能力。在本申请提供的另一实施例中,如图4所示,在上述任一实施例的基础上,本申请实施例提供的一种基于符号执行和单点逻辑的源代码加固装置还可以包括:第二处理模块305,用于采用预设方法对所述第三源代码进行处理。其中,所述预设方法包括下列方法中的一种或多种:控制流平坦化和其他变量的不透明谓词替换等。也就是说,除了在源代码中插入中间变量,并将源代码中的部分目标变量用中间变量替换之外,还可以采用其他方式对源代码进行混淆,以进一步地提高源代码的防逆向破解能力。本申请实施例提供的基于符号执行和单点逻辑的源代码加固装置能够实现图1至图2所示的方法实施例中基于符号执行和单点逻辑的源代码加固方法实现的各个过程,并且能取得同样的技术效果,为避免重复,这里不再赘述。图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页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1