CN108416191B - 基于不透明谓词和有限状态机加固源代码的方法及装置 - Google Patents

基于不透明谓词和有限状态机加固源代码的方法及装置 Download PDF

Info

Publication number
CN108416191B
CN108416191B CN201810146259.5A CN201810146259A CN108416191B CN 108416191 B CN108416191 B CN 108416191B CN 201810146259 A CN201810146259 A CN 201810146259A CN 108416191 B CN108416191 B CN 108416191B
Authority
CN
China
Prior art keywords
code block
jump
code
function
logic
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201810146259.5A
Other languages
English (en)
Other versions
CN108416191A (zh
Inventor
阚志刚
陈彪
王文洋
李世杰
尉爽生
卢佐华
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Bangcle Technology Co ltd
Original Assignee
Beijing Bangcle Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Bangcle Technology Co ltd filed Critical Beijing Bangcle Technology Co ltd
Priority to CN201810146259.5A priority Critical patent/CN108416191B/zh
Publication of CN108416191A publication Critical patent/CN108416191A/zh
Application granted granted Critical
Publication of CN108416191B publication Critical patent/CN108416191B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/121Restricting unauthorised execution of programs
    • G06F21/125Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本申请公开了一种基于不透明谓词和有限状态机加固源代码的方法及装置,该方法包括:定位应用程序的源代码中的第一条件变量;在第一条件变量中添加至少一个不透明谓词,得到第二条件变量;利用第二条件变量替换第一条件变量;基于原始源代码在编译或运行时的跳转逻辑,将原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态;基于代码块的状态以及代码块中的跳转逻辑,确定代码块跳转状态机;将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的源代码。该技术方案能够达到模糊、混淆源代码中的条件变量的目的,以及各个代码块中的跳转逻辑通过代码块跳转状态机实现,增加源代码的反编译难度。

Description

基于不透明谓词和有限状态机加固源代码的方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种基于不透明谓词和有限状态机加固源代码的方法及装置。
背景技术
随着移动互联网、物联网、车联网等技术的高速发展,终端的数量越来越多,终端中安装的应用程序也越来越多,各种应用程序也极大的方便了人们的生活。随之而来的是,各种应用程序易被破解、被篡改,进而面临着重要信息泄露的风险。
目前,应用程序未经过加固保护,攻击者可以使用工具对未经过加固保护的应用程序的可执行文件进行反汇编、反编译和动态调试等操作,可以很容易破解应用程序的实现逻辑,从而对应用程序进行算法窃取、非法篡改或者接口调用。因此,现有应用程序的安全性较低。
发明内容
本申请实施例提供一种基于不透明谓词和有限状态机加固源代码的方法,用于解决现有技术中应用程序的安全性较低的问题。
本申请实施例提供一种基于不透明谓词和有限状态机加固源代码的装置,用于解决现有技术中应用程序的安全性较低的问题。
本申请实施例采用下述技术方案:
第一方面,本申请实施例提供一种基于不透明谓词和有限状态机加固源代码的方法,包括:
定位应用程序的源代码中的第一条件变量;
在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
利用所述第二条件变量替换所述第一条件变量;
基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成应用程序加固后的源代码。
第二方面,本申请实施例提供一种基于不透明谓词和有限状态机加固源代码的装置,包括:
定位模块,用于定位应用程序的源代码中的第一条件变量;
添加模块,用于在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
替换模块,用于利用所述第二条件变量替换所述第一条件变量;
拆分模块,用于基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
确定模块,用于基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
实现模块,用于将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成应用程序加固后的源代码。
第三方面,本发明实施例还提供一种移动终端,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现上述所述的基于不透明谓词和有限状态机加固源代码的方法的步骤。
第四方面,本发明实施例还提供一种可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述所述的基于不透明谓词和有限状态机加固源代码的方法的步骤。
本申请实施例采用的上述至少一个技术方案能够达到以下有益效果:
本申请实施例通过定位源代码中的第一条件变量,并在定位到的第一条件变量中加入至少一个不透明谓词,得到第二条件变量,进而利用第二条件变量替换第一条件变量;再通过在基于应用程序的原始源代码在编译或运行时的跳转逻辑,将应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并未每个代码块设置不同的状态;再基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的源代码,能够达到模糊、混淆源代码中的条件变量的目的,以及各个代码块中的跳转逻辑通过代码块跳转状态机实现,从而实现了对各个代码块中的跳转逻辑进行隐藏,增加源代码的反编译难度,有效防止攻击者通过反编汇、反编译和动态调式等操作轻易的破解各个代码块中的跳转逻辑,进而提高了应用程序的安全性。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例提供的基于不透明谓词和有限状态机加固源代码的方法的流程示意图;
图2为本申请实施例提供的基于不透明谓词和有限状态机加固源代码的装置的结构示意图;
图3为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
为解决现有技术中应用程序的安全性较低的问题,本申请实施例提供一种基于不透明谓词和有限状态机加固源代码的方法,该方法的执行主体,可以但不限于计算机、平板电脑、个人电脑(Personal Computer,PC)、服务器等能够被配置为执行本申请实施例提供的方法中的至少一种。为便于描述,下文以该方法的执行主体是服务器为例,对该方法的实施方式进行介绍。可以理解,该方法的执行主体为服务器只是一种示例性的说明,并不应理解为对该方法的限定。
图1为本申请提供的一种基于不透明谓词和有限状态机加固源代码的方法的流程示意图;如图1所示,所述方法包括下述步骤:
步骤101、定位应用程序的源代码中的第一条件变量。
具体实施时,定位源代码中位于分支跳转节点处的第一条件变量。其中,分支跳转节点可以是if、if else、switch等分支语句所在的节点。第一条件变量即为分支语句中的变量。
步骤102、在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定。
步骤103、利用所述第二条件变量替换所述第一条件变量。
例如,源代码如下:
if(condition){
}
上述源代码中,第一条件变量即为“condition”,那么,在第一条件变量中添加不透明谓词,得到第二条件变量,并用第二条件变量替换第一条件变量之后,得到下述源代码:
if(condition&不透明谓词){
}
步骤104、基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态。
其中,每个代码块以跳转逻辑结束。
该应用程序可以为安装在计算机、平板电脑、个人电脑、服务器等设备上的应用程序,也可以为新研发出应用程序。
该代码块,可以为以跳转逻辑开始并以跳转逻辑结束的一段代码段,该代码块的呈现形式可以由一个花括号“{}”括起来。
例如:
Figure BDA0001578891940000051
Figure BDA0001578891940000061
在本实施例中,为每个代码块设置不同的状态,也就是说,每个代码块对应一个状态。沿用上述示例,为代码块0配置状态0,即state=0;为代码块1配置状态1,即state=1;为代码块2配置状态2,即state=2;为代码块3配置状态3,即state=3。
步骤105、基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机。
其中,状态机(Finite State Machine,FSM)由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。
本申请实施例中所述的代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系。该代码块跳转状态机的确定具体实现可以为:
沿用上述示例,基于代码块中的跳转逻辑,可得到各个代码块之间的跳转,即:执行代码块0,若满足条件,则执行代码块1,在执行代码块1之后执行代码块3;否则执行代码块2,在执行代码块2之后执行代码块3。再基于代码块对应的各个状态,可以得到各个状态之间的跳转关系,即:执行状态0之后,若满足跳转条件,则跳转至状态1,再从状态1跳转至状态3;否则跳转至状态2,再从状态2跳转至状态3。该各个状态之间的跳转关系形成的模型即为代码块跳转状态机。
步骤106、将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成应用程序加固后的源代码。
在本实施例中,将代码块中的跳转逻辑通过所述代码块跳转状态机实现,具体为:通过代码块与各状态的对应关系,执行各状态之间的跳转,来实现代码块中的跳转逻辑。
例如,沿用上述示例,为代码块0配置状态0,即state=0;为代码块1配置状态1,即state=1;为代码块2配置状态2,即state=2;为代码块3配置状态3,即state=3。
在执行状态0之后,若满足跳转条件,则跳转至状态1,执行与状态1对应的代码块1,在执行完代码块1之后,跳转至状态3,执行与状态3对应的代码块3;否则跳转至状态2,执行与状态2对应的代码块2,在执行完代码块2之后,跳转至状态3,执行与状态3对应的代码块3。
根据上述所述的通过代码块跳转状态机实现代码块中的跳转逻辑,生成的应用程序加固后的源代码,具体可以为:
Figure BDA0001578891940000071
Figure BDA0001578891940000081
本申请实施例通过定位源代码中的第一条件变量,并在定位到的第一条件变量中加入至少一个不透明谓词,得到第二条件变量,进而利用第二条件变量替换第一条件变量;再通过在基于应用程序的原始源代码在编译或运行时的跳转逻辑,将应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并未每个代码块设置不同的状态;再基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的源代码,能够达到模糊、混淆源代码中的条件变量的目的,以及各个代码块中的跳转逻辑通过代码块跳转状态机实现,从而实现了对各个代码块中的跳转逻辑进行隐藏,增加源代码的反编译难度,有效防止攻击者通过反编汇、反编译和动态调式等操作轻易的破解各个代码块中的跳转逻辑,进而提高了应用程序的安全性。
在一个实施例中,不透明谓词为恒为真的函数表达式或恒为假的函数表达式。当不透明谓词为恒为真的函数表达式时,在第一条件变量中添加不透明谓词之后,对第一条件变量的值不会造成任何影响。
例如,不透明谓词为表达式“x(x+1)%2==0”。其中,“==”表示恒等于,“%”表示求余数。该表达式中,x与x+1必然一个为奇数,另一个为偶数,因此x(x+1)必然为偶数,x(x+1)%2的值也必然为0。因此,表达式“x(x+1)%2==0”恒为真。
在一个实施例中,在第一条件变量中添加时不透明谓词,可在第一条件变量之前或之后添加不透明谓词,并利用预设符号分隔第一条件变量和不透明谓词。
沿用上述举例,不透明谓词为表达式“x(x+1)%2==0”,预设符号为“+”,第一条件变量为“x”。那么,在第一条件变量之后添加不透明谓词,可得到下述源代码:
if(x+x(x+1)%2==0){
}
在本实施例中,由于添加了不透明谓词,使得第二条件变量“x+x(x+1)%2==0”相较于原始的第一条件变量“x”而言复杂度更高,因此在很大程度上增加了源代码的反编译难度,加固了源代码。
当然,还可在第一条件变量中添加多个不透明谓词,以更加提高第一条件变量的复杂度。例如,分别在第一条件变量之前和第二条件变量之后添加不透明谓词“x(x+1)%2==0”,并用预设符号“+”分隔第一条件变量和不透明谓词,得到第二条件变量:x(x+1)%2+x+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”而言复杂度更高,因此在很大程度上增加了源代码的反编译难度,加固了源代码。
在一种具体实施方式中,所述代码块跳转状态机为代码块跳转函数,上述步骤106可以包括:
通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑。
其中,所述代码块跳转函数的参数包括所述代码块标识和跳转条件,所述代码块跳转函数用于在所述代码块执行到所述代码块跳转函数时,基于跳转条件跳转到目标代码块。
在本实施例中,基于代码块跳转函数在代码块中的嵌入位置可以根据实际情况确定。具体可以分为:
第一种情况:在每个所述代码块的结束位置处嵌入所述代码块跳转函数。
例如,沿用上述示例,在每个代码块的结束位置处嵌入代码块跳转函数“jumpFromTo(old,new)”。
本申请实施例通过,采用第一种情况的设置,可以实现单级代码块跳转状态机。对于简单跳转逻辑的各代码块,单级代码块跳转状态机即可实现代码块中的跳转逻辑,使得应用程序的源代码不易被破解,提高了应用程序的安全性。
第二种情况:在每个所述代码块中至少一个位置处嵌入所述代码块跳转函数。
也就是说,可以在代码块中至少一个位置处嵌入代码块跳转函数“jumpFromTo(old,new)”。
本申请实施例通过,采用第二种情况的设置,可以实现多级代码块跳转状态机。对于复杂跳转逻辑的各代码块,多级代码块跳转状态机即可实现代码块中的跳转逻辑,使得应用程序的源代码更不易被破解,使得应用程序的安全性更高。
在本步骤中,通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,具体可以为:
若采用第一种情况,则通过调用当前代码块的结束位置处的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
其中,所述代码块跳转函数的参数只有一个用于标识当前代码块的状态。
若采用第二种情况,则通过调用当前代码块中的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
其中,所述代码块跳转函数的参数至少包括用于标识当前代码块的状态。
在一种具体实施方式中,上述方法还可以包括:对代码块跳转状态机进行加密。
具体实施时,对代码块跳转状态机进行加密,具体实现可以包括:
第一种,对代码块跳转状态机表征的各个代码块对应的状态进行加密。具体为:根据各个所述代码块对应的各个状态之间的跳转关系,确定各个状态的跳转顺序;根据所述跳转顺序为各个状态配置序列号;根据各个状态之间的跳转关系及各个所述状态对应的序列号,建立跳转表并进行加密。
换句话说,将各个代码块对应的各个状态,根据跳转顺序重新配置序列号,将配置的序列号与各个状态生成跳转表,并对跳转表进行加密。
例如,沿用上述示例,根据各个状态的跳转关系,各个状态的跳转顺序依次为:状态0、状态1(状态2)、状态3,则生成的跳转表可以为:
跳转表:
序列号 状态
1 0
2 1/2
3 3
当然,跳转表并不局限于上述形式,还可以为其他形式,本申请实施例不做具体限定。
其中,对跳转表加密可以采用现有的加密算法进行加密,本申请实施例对此不做限定。
本申请实施例通过对跳转表进行加密,可以更好地隐藏个代码块中的跳转逻辑,提高破解加固后的源代码的难度,进一步提升加固后的源代码的防逆向分析能力。
第二种,对参数或跳转条件进行加密。具体为:建立所述代码块跳转函数的参数或所述代码块跳转函数的参数中的跳转条件与预定值的对应关系;根据所述对应关系,将所述参数或所述参数中的跳转条件替换为所述预定值。
应理解,将代码块跳转函数的参数或代码块跳转函数的参数中的跳转条件可以用预定值替换,以实现对代码块跳转函数进行加密,进而实现对代码块跳转状态机进行加密。
本申请实施例通过将代码块跳转函数的参数或代码块跳转函数的参数中的跳转条件进行替换,可以更好地隐藏个代码块中的跳转逻辑,提高破解加固后的源代码的难度,进一步提升加固后的源代码的防逆向分析能力。
第三种,对跳转函数进行加密,具体为:将代码块跳转函数替换为预设函数,所述代码块跳转函数与预设函数存在对应关系。
应理解,将代码块跳转函数替换为预设函数,以实现对代码块跳转函数进行加密,进而实现对代码块跳转状态机进行加密。
本申请实施例通过将代码块跳转函数进行替换,可以更好地隐藏个代码块中的跳转逻辑,提高破解加固后的源代码的难度,进一步提升加固后的源代码的防逆向分析能力。
为解决现有技术中应用程序的安全性低的问题,基于与上述基于不透明谓词和有限状态机加固源代码的方法相同的发明构思,本申请实施例还提供一种基于不透明谓词和有限状态机加固源代码的装置,如图2所示,包括:
定位模块201,用于定位应用程序的源代码中的第一条件变量;
添加模块202,用于在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
替换模块203,用于利用所述第二条件变量替换所述第一条件变量;
拆分模块204,用于基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
确定模块205,用于基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
实现模块206,用于将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成应用程序加固后的源代码。
在一种实施例中,所述实现模块206包括:
实现单元,用于通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,其中,所述代码块跳转函数的参数包括所述代码块标识和跳转条件,所述代码块跳转函数用于在所述代码块执行到所述代码块跳转函数时,基于跳转条件跳转到目标代码块。
在一种实施例中,所述实现单元包括:
第一嵌入子单元,用于在每个所述代码块的结束位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数只有一个用于标识当前代码块的状态;
第一实现子单元,用于通过调用当前代码块的结束位置处的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
在一种实施例中,所述实现单元包括:
第二嵌入子单元,用于在每个所述代码块中至少一个位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数至少包括用于标识当前代码块的状态;
第二实现子单元,用于通过调用当前代码块中的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
在一种实施例中,所述装置还包括:加密模块207,用于对代码块跳转状态机进行加密。
在一种实施例中,所述加密模块206包括:
确定单元,用于根据各个所述代码块对应的各个状态之间的跳转关系,确定各个状态的跳转顺序;
配置单元,用于根据所述跳转顺序为各个状态配置序列号;
第一建立单元,用于根据各个状态之间的跳转关系及各个所述状态对应的序列号,建立跳转表并进行加密。
在一种实施例中,所述加密模块206包括:
第二建立单元,用于建立所述代码块跳转函数的参数或所述代码块跳转函数的参数中的跳转条件与预定值的对应关系;
第一替换单元,用于根据所述对应关系,将所述参数或所述参数中的跳转条件替换为所述预定值。
在一种实施例中,所述加密模块206包括:
第二替换单元,用于将代码块跳转函数替换为预设函数,所述代码块跳转函数与预设函数存在对应关系。
在一种实施例中,所述不透明谓词包括恒为真的函数表达式或恒为假的函数表达式。
在一种实施例中,所述添加模块202包括:
添加及分隔单元,用于在所述第一条件变量之前或之后添加所述至少一个不透明谓词,并利用预设符号分隔所述第一条件变量和所述不透明谓词。
在一种实施例中,所述添加模块202包括:
分割单元,用于利用预设规则将所述第一条件变量分割为多个字符段;
添加单元,用于在所述多个字符段之间添加所述至少一个不透明谓词
本申请实施例通过定位源代码中的第一条件变量,并在定位到的第一条件变量中加入至少一个不透明谓词,得到第二条件变量,进而利用第二条件变量替换第一条件变量;再通过在基于应用程序的原始源代码在编译或运行时的跳转逻辑,将应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并未每个代码块设置不同的状态;再基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的源代码,能够达到模糊、混淆源代码中的条件变量的目的,以及各个代码块中的跳转逻辑通过代码块跳转状态机实现,从而实现了对各个代码块中的跳转逻辑进行隐藏,增加源代码的反编译难度,有效防止攻击者通过反编汇、反编译和动态调式等操作轻易的破解各个代码块中的跳转逻辑,进而提高了应用程序的安全性。
图3示出了是本申请实施例提供的一种电子设备的结构示意图。请参考图3,在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(Random-Access Memory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。
处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是ISA(Industry Standard Architecture,工业标准体系结构)总线、PCI(PeripheralComponent Interconnect,外设部件互连标准)总线或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图3中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
存储器,用于存放程序。具体地,程序可以包括程序代码,所述程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。
处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成网络覆盖性能表征装置。处理器,执行存储器所存放的程序,并具体用于执行以下操作:
定位应用程序的源代码中的第一条件变量;
在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
利用所述第二条件变量替换所述第一条件变量;
基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成应用程序加固后的源代码。
本申请实施例通过定位源代码中的第一条件变量,并在定位到的第一条件变量中加入至少一个不透明谓词,得到第二条件变量,进而利用第二条件变量替换第一条件变量;再通过在基于应用程序的原始源代码在编译或运行时的跳转逻辑,将应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并未每个代码块设置不同的状态;再基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的源代码,能够达到模糊、混淆源代码中的条件变量的目的,以及各个代码块中的跳转逻辑通过代码块跳转状态机实现,从而实现了对各个代码块中的跳转逻辑进行隐藏,增加源代码的反编译难度,有效防止攻击者通过反编汇、反编译和动态调式等操作轻易的破解各个代码块中的跳转逻辑,进而提高了应用程序的安全性。
上述如本申请图2所示实施例揭示的基于不透明谓词和有限状态机加固源代码的装置执行的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application SpecificIntegrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
本申请实施例还提出了一种计算机可读存储介质,该计算机可读存储介质存储一个或多个程序,该一个或多个程序包括指令,该指令当被包括多个应用程序的电子设备执行时,能够使该电子设备执行图3所示实施例中基于不透明谓词和有限状态机加固源代码的装置执行的方法,并具体用于执行:
定位应用程序的源代码中的第一条件变量;
在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
利用所述第二条件变量替换所述第一条件变量;
基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成应用程序加固后的源代码。
本申请实施例通过定位源代码中的第一条件变量,并在定位到的第一条件变量中加入至少一个不透明谓词,得到第二条件变量,进而利用第二条件变量替换第一条件变量;再通过在基于应用程序的原始源代码在编译或运行时的跳转逻辑,将应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并未每个代码块设置不同的状态;再基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的源代码,能够达到模糊、混淆源代码中的条件变量的目的,以及各个代码块中的跳转逻辑通过代码块跳转状态机实现,从而实现了对各个代码块中的跳转逻辑进行隐藏,增加源代码的反编译难度,有效防止攻击者通过反编汇、反编译和动态调式等操作轻易的破解各个代码块中的跳转逻辑,进而提高了应用程序的安全性。
本申请是参照本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

Claims (18)

1.一种基于不透明谓词和有限状态机加固源代码的方法,其特征在于,包括:
定位应用程序的源代码中的第一条件变量;
在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
利用所述第二条件变量替换所述第一条件变量;
基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成应用程序加固后的源代码;
所述方法还包括对所述代码块跳转状态机进行加密,所述对所述代码块跳转状态机进行加密,包括:
根据各个所述代码块对应的各个状态之间的跳转关系,确定各个状态的跳转顺序;根据所述跳转顺序为各个状态配置序列号;根据各个状态之间的跳转关系及各个所述状态对应的序列号,建立跳转表并进行加密。
2.如权利要求1所述的方法,
所述代码块跳转状态机为代码块跳转函数,所述将代码块中的跳转逻辑通过所述代码块跳转状态机实现,包括:
通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,其中,所述代码块跳转函数的参数包括代码块标识和跳转条件,所述代码块跳转函数用于在所述代码块执行到所述代码块跳转函数时,基于跳转条件跳转到目标代码块。
3.如权利要求2所述的方法,所述通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,包括:
在每个所述代码块的结束位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数只有一个用于标识当前代码块的状态;
通过调用当前代码块的结束位置处的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
4.如权利要求2所述的方法,所述通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,包括:
在每个所述代码块中至少一个位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数至少包括用于标识当前代码块的状态;
通过调用当前代码块中的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
5.如权利要求1所述的方法,对代码块跳转状态机进行加密,包括:
建立所述代码块跳转函数的参数或所述代码块跳转函数的参数中的跳转条件与预定值的对应关系;
根据所述对应关系,将所述参数或所述参数中的跳转条件替换为所述预定值。
6.如权利要求1所述的方法,对代码块跳转状态机进行加密,包括:
将代码块跳转函数替换为预设函数,所述代码块跳转函数与预设函数存在对应关系。
7.如权利要求1所述的方法,所述不透明谓词包括恒为真的函数表达式或恒为假的函数表达式。
8.如权利要求1所述的方法,所述在所述第一条件变量中添加至少一个不透明谓词,包括:
在所述第一条件变量之前或之后添加所述至少一个不透明谓词,并利用预设符号分隔所述第一条件变量和所述不透明谓词。
9.如权利要求1所述的方法,所述在所述第一条件变量中添加至少一个不透明谓词,包括:
利用预设规则将所述第一条件变量分割为多个字符段;
在所述多个字符段之间添加所述至少一个不透明谓词。
10.一种基于不透明谓词和有限状态机加固源代码的装置,其特征在于,包括:
定位模块,用于定位应用程序的源代码中的第一条件变量;
添加模块,用于在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
替换模块,用于利用所述第二条件变量替换所述第一条件变量;
拆分模块,用于基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
确定模块,用于基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
实现模块,用于将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成应用程序加固后的源代码;
加密模块,用于对所述代码块跳转状态机进行加密;
所述加密模块包括:
确定单元,用于根据各个所述代码块对应的各个状态之间的跳转关系,确定各个状态的跳转顺序;
配置单元,用于根据所述跳转顺序为各个状态配置序列号;
第一建立单元,用于根据各个状态之间的跳转关系及各个所述状态对应的序列号,建立跳转表并进行加密。
11.如权利要求10所述的装置,所述实现模块包括:
实现单元,用于通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,其中,所述代码块跳转函数的参数包括代码块标识和跳转条件,所述代码块跳转函数用于在所述代码块执行到所述代码块跳转函数时,基于跳转条件跳转到目标代码块。
12.如权利要求11所述的装置,所述实现单元包括:
第一嵌入子单元,用于在每个所述代码块的结束位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数只有一个用于标识当前代码块的状态;
第一实现子单元,用于通过调用当前代码块的结束位置处的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
13.如权利要求11所述的装置,所述实现单元包括:
第二嵌入子单元,用于在每个所述代码块中至少一个位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数至少包括用于标识当前代码块的状态;
第二实现子单元,用于通过调用当前代码块中的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
14.如权利要求10所述的装置,所述加密模块包括:
第二建立单元,用于建立所述代码块跳转函数的参数或所述代码块跳转函数的参数中的跳转条件与预定值的对应关系;
第一替换单元,用于根据所述对应关系,将所述参数或所述参数中的跳转条件替换为所述预定值。
15.如权利要求10所述的装置,所述加密模块包括:
第二替换单元,用于将代码块跳转函数替换为预设函数,所述代码块跳转函数与预设函数存在对应关系。
16.如权利要求10所述的装置,其特征在于,所述不透明谓词包括恒为真的函数表达式或恒为假的函数表达式。
17.如权利要求10所述的装置,其特征在于,所述添加模块包括:
添加及分隔单元,用于在所述第一条件变量之前或之后添加所述至少一个不透明谓词,并利用预设符号分隔所述第一条件变量和所述不透明谓词。
18.如权利要求10所述的装置,其特征在于,所述添加模块包括:
分割单元,用于利用预设规则将所述第一条件变量分割为多个字符段;
添加单元,用于在所述多个字符段之间添加所述至少一个不透明谓词。
CN201810146259.5A 2018-02-12 2018-02-12 基于不透明谓词和有限状态机加固源代码的方法及装置 Active CN108416191B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810146259.5A CN108416191B (zh) 2018-02-12 2018-02-12 基于不透明谓词和有限状态机加固源代码的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810146259.5A CN108416191B (zh) 2018-02-12 2018-02-12 基于不透明谓词和有限状态机加固源代码的方法及装置

Publications (2)

Publication Number Publication Date
CN108416191A CN108416191A (zh) 2018-08-17
CN108416191B true CN108416191B (zh) 2021-11-19

Family

ID=63128637

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810146259.5A Active CN108416191B (zh) 2018-02-12 2018-02-12 基于不透明谓词和有限状态机加固源代码的方法及装置

Country Status (1)

Country Link
CN (1) CN108416191B (zh)

Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1947584B1 (en) * 2006-12-21 2009-05-27 Telefonaktiebolaget LM Ericsson (publ) Obfuscating computer program code
CN102880493A (zh) * 2012-09-25 2013-01-16 南京大学 一种构件间动态依赖关系的自动分析方法
CN105005718A (zh) * 2015-06-23 2015-10-28 电子科技大学 一种利用马尔可夫链实现代码混淆的方法
CN105117621A (zh) * 2014-04-23 2015-12-02 恩智浦有限公司 代码混淆的控制流平展化
CN105787305A (zh) * 2016-02-26 2016-07-20 西北大学 一种抵抗符号执行和污点分析的软件保护方法
CN106096338A (zh) * 2016-06-07 2016-11-09 西北大学 一种具有数据流混淆的虚拟化软件保护方法
CN106326694A (zh) * 2016-08-30 2017-01-11 北京鼎源科技有限公司 一种基于C源代码的混淆的Android应用加固方法
CN106529225A (zh) * 2016-10-27 2017-03-22 努比亚技术有限公司 一种应用程序源代码保护装置及方法
CN107229848A (zh) * 2017-06-12 2017-10-03 北京洋浦伟业科技发展有限公司 一种代码加固方法和装置
CN107341374A (zh) * 2017-07-17 2017-11-10 广东工业大学 一种不透明谓词的插入方法及装置
CN107632832A (zh) * 2017-09-27 2018-01-26 电子科技大学 一种面向dalvik字节码控制流混淆方法

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
NZ533028A (en) * 2004-05-19 2005-09-30 Auckland Uniservices Ltd Method of introducing digital signature into software
US8533669B2 (en) * 2009-04-21 2013-09-10 Microsoft Corporation Analysis of dynamic elements in bounded time
IL224743A0 (en) * 2013-02-14 2013-06-27 Harel Cain A system for automatic obfuscation of computer programs
US20160379131A1 (en) * 2015-06-26 2016-12-29 Nxp B.V. Fuzzy opaque predicates

Patent Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1947584B1 (en) * 2006-12-21 2009-05-27 Telefonaktiebolaget LM Ericsson (publ) Obfuscating computer program code
CN102880493A (zh) * 2012-09-25 2013-01-16 南京大学 一种构件间动态依赖关系的自动分析方法
CN105117621A (zh) * 2014-04-23 2015-12-02 恩智浦有限公司 代码混淆的控制流平展化
CN105005718A (zh) * 2015-06-23 2015-10-28 电子科技大学 一种利用马尔可夫链实现代码混淆的方法
CN105787305A (zh) * 2016-02-26 2016-07-20 西北大学 一种抵抗符号执行和污点分析的软件保护方法
CN106096338A (zh) * 2016-06-07 2016-11-09 西北大学 一种具有数据流混淆的虚拟化软件保护方法
CN106326694A (zh) * 2016-08-30 2017-01-11 北京鼎源科技有限公司 一种基于C源代码的混淆的Android应用加固方法
CN106529225A (zh) * 2016-10-27 2017-03-22 努比亚技术有限公司 一种应用程序源代码保护装置及方法
CN107229848A (zh) * 2017-06-12 2017-10-03 北京洋浦伟业科技发展有限公司 一种代码加固方法和装置
CN107341374A (zh) * 2017-07-17 2017-11-10 广东工业大学 一种不透明谓词的插入方法及装置
CN107632832A (zh) * 2017-09-27 2018-01-26 电子科技大学 一种面向dalvik字节码控制流混淆方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于Windows平台的目标代码混淆;李勇;《中国优秀硕士学位论文全文数据库》;20070915;第I138-391页 *

Also Published As

Publication number Publication date
CN108416191A (zh) 2018-08-17

Similar Documents

Publication Publication Date Title
CN107992307B (zh) 一种函数编译方法及装置
CN108509772B (zh) 基于执行顺序和单点逻辑的源代码加固方法及装置
CN108446535B (zh) 基于代码执行顺序的源代码加固方法及装置
CN108537012B (zh) 基于变量和代码执行顺序的源代码混淆方法及装置
CN105117621A (zh) 代码混淆的控制流平展化
US12086278B2 (en) Method of encoding and decoding memory data for software security, recording medium and apparatus for performing the method
CN107092824B (zh) 一种应用程序的运行方法及装置
CN110781192B (zh) 区块链数据的验证方法、装置及设备
CN110851207B (zh) 状态转换管理方法、装置、电子设备和存储介质
CN112861169B (zh) 一种基于隐私保护的数据处理方法、装置及设备
CN108446538B (zh) 基于状态、符号执行和单点逻辑的源代码加固方法及装置
US11349658B2 (en) Blockchain data processing method, apparatus, and device
CN108415709B (zh) 一种基于有限状态机加固源代码的方法及装置
CN114840427A (zh) 一种代码测试、测试用例生成的方法及装置
US7458100B2 (en) Adding copy protection to a computer program
CN108416191B (zh) 基于不透明谓词和有限状态机加固源代码的方法及装置
CN110688320B (zh) 全局变量的检测方法、装置及终端设备
CN108509773B (zh) 一种源代码加固方法及装置
CN108460253B (zh) 基于顺序、符号执行和单点逻辑的源代码加固方法及装置
CN108446541B (zh) 基于有限状态机和符号执行的源代码加固方法及装置
CN109189671B (zh) 逐层夹逼式变量定位方法、系统及终端设备
EP3844648A1 (en) Software tamper resistance
CN110765008A (zh) 一种数据处理方法及装置
US20150220425A1 (en) Test context generation
CN107239270B (zh) 代码处理方法和装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant