CN108446538A - 基于状态、符号执行和单点逻辑的源代码加固方法及装置 - Google Patents

基于状态、符号执行和单点逻辑的源代码加固方法及装置 Download PDF

Info

Publication number
CN108446538A
CN108446538A CN201810146589.4A CN201810146589A CN108446538A CN 108446538 A CN108446538 A CN 108446538A CN 201810146589 A CN201810146589 A CN 201810146589A CN 108446538 A CN108446538 A CN 108446538A
Authority
CN
China
Prior art keywords
code
code block
variable
source code
block
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.)
Granted
Application number
CN201810146589.4A
Other languages
English (en)
Other versions
CN108446538B (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 Bang Bang Safety Technology Co Ltd
Original Assignee
Beijing Bang Bang Safety 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 Bang Bang Safety Technology Co Ltd filed Critical Beijing Bang Bang Safety Technology Co Ltd
Priority to CN201810146589.4A priority Critical patent/CN108446538B/zh
Publication of CN108446538A publication Critical patent/CN108446538A/zh
Application granted granted Critical
Publication of CN108446538B publication Critical patent/CN108446538B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

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)

Abstract

本申请公开了基于状态、符号执行和单点逻辑的源代码加固方法及装置,该方法包括:基于应用程序的原始源代码在编译或运行时的跳转逻辑,将原始源代码拆分成多个代码块,并为各代码块设置不同的状态;基于代码块的状态以及代码块中的跳转逻辑,确定代码块跳转状态机;将代码块中的跳转逻辑通过代码块跳转状态机实现,得到加固后的第一源代码;确定第一源代码中需要保护的目标变量;在第一源代码中插入至少一个中间变量,中间变量用于访问目标变量;将第一源代码中的部分目标变量替换为任一中间变量,得到加固后的第二源代码;使用不透明谓词对第二源代码的函数中的条件变量进行模糊处理,得到加固后的第三源代码。可以提高源代码的防逆向分析能力。

Description

基于状态、符号执行和单点逻辑的源代码加固方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及一种基于状态、符号执行和单点逻辑的源代码加固方法及装置。
背景技术
随着移动互联网、物联网、车联网等技术的高速发展,各种应用程序也极大的方便了人们的生活。随之而来的是,各种应用程序易被破解、被篡改,进而面临着重要信息泄露的风险。
目前,攻击者常使用符号执行模型等静态分析工具对应用程序的源代码进行逆向分析破解,获得应用程序的执行逻辑,从而非法窃取、非法篡改应用程序运行过程中产生的重要信息。
针对上述风险,现有技术常通过对应用程序的源代码进行混淆,提高源代码的防逆向分析能力,降低应用程序运行过程中产生的重要信息被泄露的风险。但是,现有的控制流平坦化等源代码混淆方法依然存在被破解的风险,源代码的防逆向分析能力还有待提高。
发明内容
本申请实施例提供一种基于状态、符号执行和单点逻辑的源代码加固方法,以提高源代码的防逆向分析能力。
本申请实施例提供一种基于状态、符号执行和单点逻辑的源代码加固装置,用于解决现有技术中应用程序的安全性较低的问题。
本申请实施例采用下述技术方案:
第一方面,本申请实施例提供一种基于状态、符号执行和单点逻辑的源代码加固方法,包括:
基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成所述应用程序加固后的第一源代码;
确定所述第一源代码中需要保护的目标变量;
在所述第一源代码中插入至少一个中间变量,所述至少一个中间变量用于访问所述目标变量;
将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到所述应用程序加固后的第二源代码;
使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述应用程序加固后的第三源代码。
第二方面,本申请实施例提供一种基于状态、符号执行和单点逻辑的源代码加固装置,包括:
拆分模块,用于基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
第一确定模块,用于基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
第一加固模块,用于将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成所述应用程序加固后的第一源代码;
第二确定模块,用于确定所述第一源代码中需要保护的目标变量;
插入模块,用于在所述第一源代码中插入至少一个中间变量,所述至少一个中间变量用于访问所述目标变量;
第二加固模块,用于将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到所述应用程序加固后的第二源代码;
第三加固模块,用于使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述应用程序加固后的第三源代码。
第三方面,本发明实施例还提供一种移动终端,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如第一方面所述的方法的步骤。
第四方面,本发明实施例还提供一种可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面所述的方法的步骤。
本申请实施例采用的上述至少一个技术方案能够达到以下有益效果:
本申请实施例,一方面,在基于应用程序的原始源代码在编译或运行时的跳转逻辑,将应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并未每个代码块设置不同的状态;再基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的第一源代码,使得各个代码块中的跳转逻辑通过代码块跳转状态机实现,从而实现了对各个代码块中的跳转逻辑进行隐藏,有效防止攻击者通过反编汇、反编译和动态调式等操作轻易的破解各个代码块中的跳转逻辑,进而提高了应用程序的源代码的防逆向破解能力。另一方面,由于部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象,最终也能提高源代码的防逆向分析能力。再有,利用不透明谓词对源代码中的条件变量进行了模糊处理。因此可以增大加固后的源代码的破解难度,进而也可以提高源代码的防逆向分析能力。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例提供的基于状态、符号执行和单点逻辑的源代码加固方法的流程示意图;
图2为本申请实施例提供的基于状态、符号执行和单点逻辑的源代码加固装置的结构示意图;
图3为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
为了提高源代码的防逆向分析能力,本申请实施例提供一种基于状态、符号执行和单点逻辑的源代码加固方法,该方法的执行主体,可以但不限于计算机、平板电脑、个人电脑(Personal Computer,PC)、服务器等能够被配置为执行本申请实施例提供的方法中的至少一种。为便于描述,下文以该方法的执行主体是服务器为例,对该方法的实施方式进行介绍。可以理解,该方法的执行主体为服务器只是一种示例性的说明,并不应理解为对该方法的限定。
需要说明的是,在本申请实施例中,“基于状态、符号执行和单点逻辑的源代码加固方法及装置”中的状态指的是代码块的状态。
图1为本申请提供的一种基于状态、符号执行和单点逻辑的源代码加固方法的流程示意图;如图1所示,所述方法包括下述步骤:
步骤101、基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态。
其中,每个代码块以跳转逻辑结束。
该应用程序可以为安装在计算机、平板电脑、个人电脑、服务器等设备上的应用程序,也可以为新研发出应用程序。
该代码块,可以为以跳转逻辑开始并以跳转逻辑结束的一段代码段,该代码块的呈现形式可以由一个花括号“{}”括起来。
例如:
在本实施例中,为每个代码块设置不同的状态,也就是说,每个代码块对应一个状态。沿用上述示例,为代码块0配置状态0,即state=0;为代码块1配置状态1,即state=1;为代码块2配置状态2,即state=2;为代码块3配置状态3,即state=3。
步骤102、基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机。
其中,状态机(Finite State Machine,FSM)由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。
本申请实施例中所述的代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系。该代码块跳转状态机的确定具体实现可以为:
沿用上述示例,基于代码块中的跳转逻辑,可得到各个代码块之间的跳转,即:执行代码块0,若满足条件,则执行代码块1,在执行代码块1之后执行代码块3;否则执行代码块2,在执行代码块2之后执行代码块3。再基于代码块对应的各个状态,可以得到各个状态之间的跳转关系,即:执行状态0之后,若满足跳转条件,则跳转至状态1,再从状态1跳转至状态3;否则跳转至状态2,再从状态2跳转至状态3。该各个状态之间的跳转关系形成的模型即为代码块跳转状态机。
步骤103、将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成所述应用程序加固后的第一源代码。
在本实施例中,将代码块中的跳转逻辑通过所述代码块跳转状态机实现,具体为:通过代码块与各状态的对应关系,执行各状态之间的跳转,来实现代码块中的跳转逻辑。
例如,沿用上述示例,为代码块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。
根据上述所述的通过代码块跳转状态机实现代码块中的跳转逻辑,生成的应用程序加固后的第一源代码,具体可以为:
步骤104、确定所述第一源代码中需要保护的目标变量。
目标变量,可以是第一源代码中携带重要信息的变量,例如,假设步骤101中所述的应用程序为一款金融APP(Application),那么目标变量可以是该金融APP的源代码中与支付密码有关的变量。
步骤105、在所述第一源代码中插入至少一个中间变量,所述至少一个中间变量用于访问所述目标变量。
上述中间变量可以是指针和数组等变量中的任一种。
程序的静态分析,一般是指在程序不运行的情况下,通过分析程序的源代码或者可执行代码来获得程序在运行时的信息的技术。由于程序没有被真正执行,若要获得程序在运行时的状态信息,可以建立一个模型对程序在运行时的状态进行模拟,通过对这个模型进行操作,可以获得程序的运行状态的近似表示。符号执行就是这样的一个模型。
由于符号执行一般是指用符号值代替真实值模拟执行程序的过程,且在该过程中模拟了变量在内存中的存储位置。
因此,相应的,在一种具体实施方式中,若插入源代码中的中间变量为数组,则可以通过数组在模拟内存中的溢出访问实现对目标变量的访问。
例如,假设第一源代码为:
则,在目标变量x的后面插入数组a[10]后的源代码为:
这样,就可以通过对数组a[10]的上溢出元素a[-1]进行访问,实现对目标变量x的访问。
为了更清楚地理解上述溢出访问的过程,可以用下表1所示的形式来形象的说明目标变量x以及数组a[10]在模拟内存中的相对存储位置关系。
表1
x
a[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]具有溢出关系的元素。
还需要说明的是,通常情况下,在源代码的正确性检测过程中,溢出访问被视为是一种错误,应避免出现。而本申请实施例正是刻意的利用这种表面属于错误的溢出访问来迷惑攻击者,使攻击者误以为源代码中出现错误,而不去分析该错误背后隐藏的目标变量,从而进一步地提高第二源代码的防逆向分析能力。
在另一种具体实施方式中,若插入源代码中的中间变量为指针,则可以通过访问指针实现对目标变量的访问。
步骤106、将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到所述应用程序加固后的第二源代码。
沿用步骤105中所举的例子,假设在目标变量x后面插入数组a[10]后的第一源代码为:
那么,将第一源代码中部分目标变量x替换为数组a[10]的溢出元素a[-1]后,得到的第二源代码为:
这样,当有攻击者利用符号执行模型这样的静态分析工具,对上述第二源代码中的目标变量x进行静态分析时,由于第二源代码中的部分变量x的名称已修改为中间变量的上溢出元素a[-1],使得攻击者仅能识别出未修改名称的少量目标变量x,而无法识别出已修改名称的目标变量x,相应的,从根本上达到混淆目标变量x与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量x的存储位置为存储中间变量的存储位置的假象,使得攻击者无法获得变量x在程序运行过程中的完整变化逻辑,从而提高了最终得到的第二源代码的防逆向分析能力。
步骤107、使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述应用程序加固后的第三源代码。
在一种具体实施方式中,上述步骤107可以包括:确定所述第二源代码的函数中的第一条件变量;在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;利用所述第二条件变量替换所述第一条件变量。
其中,第一条件变量可以理解为是第二源代码的函数中条件语句对应的变量。条件语句包括但不限于if语句、do-while语句和switch-case语句,等等。
更为具体的,第一条件变量可以是第一源代码中位于函数的分支跳转节点处的条件变量。分支跳转节点可以是if、if else、switch等分支语句所在的节点,相应的,第一条件变量即为分支语句中的变量。
例如,假设执行完上述步骤106后得到的加固后的第二源代码为:
则,可以确定出第二源代码的函数中的条件变量为“condition”。
不透明谓词,可以是当且仅当一个谓词在程序上确定点的输出在混淆前就确定时,称该谓词是不透明的。
具体而言,在本申请实施例中,不透明谓词可以为值恒定的函数表达式。当不透明谓词为恒为真的函数表达式时,在第一条件变量中添加不透明谓词之后,对第一条件变量的值不会造成任何影响。
更为具体的,不透明谓词可以为恒为真或恒为假的数学公式,例如:x(x+1)%2==0。其中,“==”表示恒等于,“%”表示求余数。该表达式中,x与x+1必然一个为奇数,另一个为偶数,因此x(x+1)必然为偶数,x(x+1)%2的值也必然为0。因此,表达式“x(x+1)%2==0”恒为真。
相应的,使用不透明谓词对上例中的条件变量“condition”进行模糊替换后的第三源代码可以为:
可选地,在上述步骤107中,所述在所述第一条件变量中添加至少一个不透明谓词可以包括:在所述第一条件变量之前或之后添加所述至少一个不透明谓词,并利用预设符号分隔所述第一条件变量和所述不透明谓词。
沿用上述举例,不透明谓词为表达式“x(x+1)%2==0”,预设符号为“+”,第一条件变量为“x”。那么,在第一条件变量之后添加不透明谓词,可得到下述源代码:
if(condition+x(x+1)%2==0){
}
更为具体的,在上述步骤107中,所述在所述第一条件变量中添加至少一个不透明谓词可以包括:利用预设规则将所述第一条件变量分割为多个字符段;在所述多个字符段之间添加所述至少一个不透明谓词。
在本实施例中,由于添加了不透明谓词,使得第二条件变量“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”而言复杂度更高,因此在很大程度上增加了源代码的反编译难度,加固了源代码。
需要说明的是,在上述步骤107中,被模糊处理的条件变量可以是一个也可以是多个,本申请实施例对此不做限定。
本申请实施例,一方面,在基于应用程序的原始源代码在编译或运行时的跳转逻辑,将应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并未每个代码块设置不同的状态;再基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的第一源代码,使得各个代码块中的跳转逻辑通过代码块跳转状态机实现,从而实现了对各个代码块中的跳转逻辑进行隐藏,有效防止攻击者通过反编汇、反编译和动态调式等操作轻易的破解各个代码块中的跳转逻辑,进而提高了应用程序的源代码的防逆向破解能力。另一方面,由于部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象,最终也能提高源代码的防逆向分析能力。再有,利用不透明谓词对源代码中的条件变量进行了模糊处理。因此可以增大加固后的源代码的破解难度,进而也可以提高源代码的防逆向分析能力。
在一种具体实施方式中,所述代码块跳转状态机为代码块跳转函数,上述步骤103可以包括:
通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑。
其中,所述代码块跳转函数的参数包括所述代码块标识和跳转条件,所述代码块跳转函数用于在所述代码块执行到所述代码块跳转函数时,基于跳转条件跳转到目标代码块。
在本实施例中,基于代码块跳转函数在代码块中的嵌入位置可以根据实际情况确定。具体可以分为:
第一种情况:在每个所述代码块的结束位置处嵌入所述代码块跳转函数。
例如,沿用上述示例,在每个代码块的结束位置处嵌入代码块跳转函数“jumpFromTo(old,new)”。
本申请实施例通过采用第一种情况的设置,可以实现单级代码块跳转状态机。对于简单跳转逻辑的各代码块,单级代码块跳转状态机即可实现代码块中的跳转逻辑,使得应用程序的源代码不易被破解,提高了源代码的防逆向分析能力。
第二种情况:在每个所述代码块中至少一个位置处嵌入所述代码块跳转函数。
也就是说,可以在代码块中至少一个位置处嵌入代码块跳转函数“jumpFromTo(old,new)”。
本申请实施例通过采用第二种情况的设置,可以实现多级代码块跳转状态机。对于复杂跳转逻辑的各代码块,多级代码块跳转状态机即可实现代码块中的跳转逻辑,使得应用程序的源代码更不易被破解,进一步提高了源代码的防逆向分析能力。
在本步骤中,通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,具体可以为:
若采用第一种情况,则通过调用当前代码块的结束位置处的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
其中,所述代码块跳转函数的参数只有一个用于标识当前代码块的状态。
若采用第二种情况,则通过调用当前代码块中的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
其中,所述代码块跳转函数的参数至少包括用于标识当前代码块的状态。
在一种具体实施方式中,上述方法还可以包括:对代码块跳转状态机进行加密。
具体实施时,对代码块跳转状态机进行加密,具体实现可以包括:
第一种,对代码块跳转状态机表征的各个代码块对应的状态进行加密。具体为:根据各个所述代码块对应的各个状态之间的跳转关系,确定各个状态的跳转顺序;根据所述跳转顺序为各个状态配置序列号;根据各个状态之间的跳转关系及各个所述状态对应的序列号,建立跳转表并进行加密。
换句话说,将各个代码块对应的各个状态,根据跳转顺序重新配置序列号,将配置的序列号与各个状态生成跳转表,并对跳转表进行加密。
例如,沿用上述示例,根据各个状态的跳转关系,各个状态的跳转顺序依次为:状态0、状态1(状态2)、状态3,则生成的跳转表可以为:
跳转表:
序列号 状态
1 0
2 1/2
3 3
当然,跳转表并不局限于上述形式,还可以为其他形式,本申请实施例不做具体限定。
其中,对跳转表加密可以采用现有的加密算法进行加密,本申请实施例对此不做限定。
本申请实施例通过对跳转表进行加密,可以更好地隐藏个代码块中的跳转逻辑,提高破解加固后的源代码的难度,进一步提升加固后的源代码的防逆向分析能力。
第二种,对参数或跳转条件进行加密。具体为:建立所述代码块跳转函数的参数或所述代码块跳转函数的参数中的跳转条件与预定值的对应关系;根据所述对应关系,将所述参数或所述参数中的跳转条件替换为所述预定值。
应理解,将代码块跳转函数的参数或代码块跳转函数的参数中的跳转条件可以用预定值替换,以实现对代码块跳转函数进行加密,进而实现对代码块跳转状态机进行加密。
本申请实施例通过将代码块跳转函数的参数或代码块跳转函数的参数中的跳转条件进行替换,可以更好地隐藏个代码块中的跳转逻辑,提高破解加固后的源代码的难度,进一步提升加固后的源代码的防逆向分析能力。
第三种,对跳转函数进行加密,具体为:将代码块跳转函数替换为预设函数,所述代码块跳转函数与预设函数存在对应关系。
应理解,将代码块跳转函数替换为预设函数,以实现对代码块跳转函数进行加密,进而实现对代码块跳转状态机进行加密。
本申请实施例通过将代码块跳转函数进行替换,可以更好地隐藏个代码块中的跳转逻辑,提高破解加固后的源代码的难度,进一步提升加固后的源代码的防逆向分析能力。
可选地,在上述步骤105和步骤106中,为了增加源代码的加固程度,以进一步增大源代码的防逆向分析能力,可以在源代码中插入多个能够访问所述目标变量的中间变量,并用多个中间变量分别替换源代码中的部分目标变量。因为,插入和替换的能够访问目标变量的中间变量越多,对攻击者造成的迷惑性越大,使得攻击者难以从众多的中间变量中分辨出目标变量,从而更好地提升混淆后的源代码的防逆向分析能力。
可选地,在第一种具体实施方式中,若上述中间变量为数组,则:
上述步骤105具体可以包括:在所述目标变量的前面插入第一数组。
相应的,上述步骤106具体可以包括:将所述第一源代码中的部分所述目标变量替换为所述第一数组的下溢出元素。
其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量。数组中元素的最大下标一般为该数组中的最后一个元素的下标。
需要再次说明的是,数组的溢出元素并非数组中实际包含的元素,而是在模拟内存中的存储位置上相对于数组具有溢出关系的元素。其中,下溢出元素,指的是存储位置相对于数组中实际包含的元素相对靠后的元素,相应的,上溢出元素,指的是存储位置相对于数组中实际包含的元素相对靠前的元素。
例如,假设第一源代码为:
则,在目标变量x的前面插入第一数组b[5]后的源代码可以为:
相应的,目标变量x以及第一数组b[5]在模拟内存中的相对存储位置关系如表2所示。
表2
b[0]
b[1]
b[4]
z
x
并假设第一数组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。具体的,沿用上述例子,下溢出元素的下标可以为“7+1=5”,进而可以通过访问b[5]实现对目标变量x的访问。
在该具体实施方式中,由于插入第一源代码中的中间变量为第一数组,并用第一数组的溢出元素替换所述源代码中与所述目标变量相同的至少一个变量。因此,一方面由于部分变量被替换为中间变量,进而可以欺骗攻击者不对通过中间变量间接表示的目标变量进行分析,最终提高源代码的防逆向分析能力;另一方面,由于在源代码的正确性检测过程中,溢出访问被视为是一种错误,应避免出现,而本申请实施例正是刻意的利用这种表面属于错误的溢出访问来迷惑攻击者,使攻击者误以为源代码中出现错误,而不去分析该错误背后隐藏的目标变量,从而进一步地提高混淆后的源代码的防逆向分析能力。
可选地,在第二种具体实施方式中,若上述中间变量为数组,则:
上述步骤105具体可以包括:在所述目标变量的后面插入第二数组。
相应的,上述步骤106具体可以包括:将所述第一源代码中的部分所述目标变量替换为所述第二数组的上溢出元素。
其中,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。数组中元素的最小下标一般为0。
例如,假设第一源代码为:
则,在目标变量x的后面插入第二数组a[10]后的源代码可以为:
相应的,目标变量x以及第二数组a[10]在模拟内存中的相对存储位置关系如表3所示。
表3
x
y
a[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的访问。
在该第二种具体实施方式中,由于插入第一源代码中的中间变量也为数组,因此可以取得与上述第一种具体实施方式相同的技术效果,此处不再赘述。
可选地,在第三种具体实施方式中,若上述中间变量为数组,则:
上述步骤105具体可以包括:在所述目标变量的前面插入第一数组,并在所述目标变量的后面插入第二数组。
相应的,上述步骤106具体可以包括:将所述第一源代码中的第一部分所述目标变量替换为所述第一数组的下溢出元素,将所述第一源代码中的第二部分所述目标变量替换为所述第二数组的上溢出元素。
其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。
并且,所述第一部分和所述第二部分互不重叠,也即第一部分目标变量和第二部分目标变量为第一源代码中不同位置出现的目标变量,且所述第一部分和所述第二部分的并集小于所述第一源代码中的所有目标变量组成的集合,也就是说,并不是对第一源代码中出现的所有目标变量利用中间变量进行替换。
例如,假设第一源代码为:
则,在目标变量x的前面插入第一数组b[5],在目标变量x的后面插入第二数组a[10]后的源代码可以为:
相应的,第一数组b[5]、目标变量x以及第二数组a[10]在模拟内存中的相对存储位置关系如表4所示。
表4
b[0]
b[1]
b[4]
x
a[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所示,该装置可以包括:拆分模块201、第一确定模块202、第一加固模块203、第二确定模块204、插入模块205和第二加固模块206。
拆分模块201,用于基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束。
第一确定模块202,用于基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系。
第一加固模块203,用于将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成应用程序加固后的源代码。
在一种实施例中,所述第一加固模块203包括:
第一加固单元,用于通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,其中,所述代码块跳转函数的参数包括所述代码块标识和跳转条件,所述代码块跳转函数用于在所述代码块执行到所述代码块跳转函数时,基于跳转条件跳转到目标代码块。
在一种实施例中,所述第一加固单元包括:
第一嵌入子单元,用于在每个所述代码块的结束位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数只有一个用于标识当前代码块的状态;
第一实现子单元,用于通过调用当前代码块的结束位置处的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
在一种实施例中,所述第一加固单元包括:
第二嵌入子单元,用于在每个所述代码块中至少一个位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数至少包括用于标识当前代码块的状态;
第二实现子单元,用于通过调用当前代码块中的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
在一种实施例中,所述装置还包括:加密模块204,用于对代码块跳转状态机进行加密。
在一种实施例中,所述加密模块203包括:
确定单元,用于根据各个所述代码块对应的各个状态之间的跳转关系,确定各个状态的跳转顺序;
配置单元,用于根据所述跳转顺序为各个状态配置序列号;
第一建立单元,用于根据各个状态之间的跳转关系及各个所述状态对应的序列号,建立跳转表并进行加密。
在一种实施例中,所述加密模块203包括:
第二建立单元,用于建立所述代码块跳转函数的参数或所述代码块跳转函数的参数中的跳转条件与预定值的对应关系;
第一替换单元,用于根据所述对应关系,将所述参数或所述参数中的跳转条件替换为所述预定值。
在一种实施例中,所述加密模块203包括:
第二替换单元,用于将代码块跳转函数替换为预设函数,所述代码块跳转函数与预设函数存在对应关系。
第二确定模块204,用于确定第一源代码中需要保护的目标变量。
目标变量,可以是第一源代码中携带重要信息的变量,例如,假设目标应用程序为一款金融APP(Application),那么目标变量可以是该金融APP的源代码中与支付密码有关的变量。
插入模块205,用于在所述源代码中插入至少一个中间变量,所述至少一个中间变量用于访问所述目标变量。
上述中间变量可以是指针和数组等变量中的任一种。
程序的静态分析,一般是指在程序不运行的情况下,通过分析程序的源代码或者可执行代码来获得程序在运行时的信息的技术。由于程序没有被真正执行,若要获得程序在运行时的状态信息,可以建立一个模型对程序在运行时的状态进行模拟,通过对这个模型进行操作,可以获得程序的运行状态的近似表示。符号执行就是这样的一个模型。
由于符号执行一般是指用符号值代替真实值模拟执行程序的过程,且在该过程中模拟了变量在内存中的存储位置。
因此,相应的,在一种具体实施方式中,若插入源代码中的中间变量为数组,则可以通过数组在模拟内存中的溢出访问实现对目标变量的访问。
还需要说明的是,通常情况下,在源代码的正确性检测过程中,溢出访问被视为是一种错误,应避免出现。而本申请实施例正是刻意的利用这种表面属于错误的溢出访问来迷惑攻击者,使攻击者误以为源代码中出现错误,而不去分析该错误背后隐藏的目标变量,从而进一步地提高混淆后的源代码的防逆向分析能力。
在另一种具体实施方式中,若插入源代码中的中间变量为指针,则可以通过访问指针实现对目标变量的访问。
第二加固模块206,用于将所述源代码中的部分所述目标变量替换为任一所述中间变量。
第三加固模块207,用于使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述应用程序加固后的第三源代码。
在一种具体实施方式中,第三加固模块207,具体可以包括:
确定子模块,用于确定所述第二源代码的函数中的第一条件变量;
添加子模块,用于在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
替换子模块,用于利用所述第二条件变量替换所述第一条件变量。
在一个实施例中,不透明谓词包括恒为真的函数表达式。
在一个实施例中,上述添加子模块可以包括:
添加及分隔单元,用于在第一条件变量之前或之后添加至少一个不透明谓词,并利用预设符号分隔第一条件变量和不透明谓词。
在一个实施例中,上述添加子模块可以包括:
分割单元,用于利用预设规则将第一条件变量分割为多个字符段;
添加单元,用于在多个字符段之间添加至少一个不透明谓词。
需要说明的是,在第三加固模块207中,被模糊处理的条件变量可以是一个也可以是多个,本申请实施例对此不做限定。
本申请实施例,一方面,在基于应用程序的原始源代码在编译或运行时的跳转逻辑,将应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并未每个代码块设置不同的状态;再基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的第一源代码,使得各个代码块中的跳转逻辑通过代码块跳转状态机实现,从而实现了对各个代码块中的跳转逻辑进行隐藏,有效防止攻击者通过反编汇、反编译和动态调式等操作轻易的破解各个代码块中的跳转逻辑,进而提高了应用程序的源代码的防逆向破解能力。另一方面,由于部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象,最终也能提高源代码的防逆向分析能力。
可选地,在上述插入模块205和第二加固模块206中,为了增加源代码的加固程度,以进一步增大源代码的防逆向分析能力,可以在第一源代码中插入多个能够访问所述目标变量的中间变量,并用多个中间变量分别替换源代码中的部分目标变量。因为,插入和替换的能够访问目标变量的中间变量越多,对攻击者造成的迷惑性越大,使得攻击者难以从众多的中间变量中分辨出目标变量,从而更好地提升加固后的源代码的防逆向分析能力。再有,利用不透明谓词对源代码中的条件变量进行了模糊处理。因此可以增大加固后的源代码的破解难度,进而也可以提高源代码的防逆向分析能力。
在第一种具体实施方式中,若所述中间变量为数组,则:
上述插入模块205,具体用于:在所述目标变量的前面插入第一数组;
上述第二加固模块206,具体用于:将所述第一源代码中的部分所述目标变量替换为所述第一数组的下溢出元素,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量。
在该具体实施方式中,由于插入第一源代码中的中间变量为第一数组,并用第一数组的溢出元素替换所述第一源代码中与所述目标变量相同的至少一个变量。因此,一方面由于部分变量被替换为中间变量,进而可以欺骗攻击者不对通过中间变量间接表示的目标变量进行分析,最终提高源代码的防逆向分析能力;另一方面,由于在源代码的正确性检测过程中,溢出访问被视为是一种错误,应避免出现,而本申请实施例正是刻意的利用这种表面属于错误的溢出访问来迷惑攻击者,使攻击者误以为源代码中出现错误,而不去分析该错误背后隐藏的目标变量,从而进一步地提高混淆后的源代码的防逆向分析能力。
在第二种具体实施方式中,若所述中间变量为数组,则:
上述插入模块205,具体用于:在所述目标变量的后面插入第二数组;
上述第二加固模块206,具体用于:将所述第一源代码中的部分所述目标变量替换为所述第二数组的上溢出元素,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。
在该第二种具体实施方式中,由于插入第一源代码中的中间变量也为数组,因此可以取得与上述第一种具体实施方式相同的技术效果,此处不再赘述。
在第三种具体实施方式中,若所述中间变量为数组,则:
上述插入模块205,具体用于:在所述目标变量的前面插入第一数组,并在所述目标变量的后面插入第二数组;
上述第二加固模块206,具体用于:将所述第一源代码中的第一部分所述目标变量替换为所述第一数组的下溢出元素,将所述第一源代码中的第二部分所述目标变量替换为所述第二数组的上溢出元素;
其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。
并且,所述第一部分和所述第二部分互不重叠,也即第一部分目标变量和第二部分目标变量为待混淆的源代码中不同位置出现的目标变量,且所述第一部分和所述第二部分的并集小于所述第一源代码中的所有目标变量组成的集合,也就是说,并不是对待混淆的源代码中出现的所有目标变量利用中间变量进行替换。
可以理解,在第一数组和/或所述第二数组与目标变量不相邻时,由于攻击者难以分析出与目标变量相隔较远的数组有间接的联系,因此,对攻击者产生的迷惑性更大,从而也可以更进一步地提升源代码的防逆向分析能力。
此外,相比于上述第一种和第二种具体实施方式,在第三种具体实施方式中,由于在目标变量的前面和后面分别插入了数组,并且对第一源代码中的第一部分目标变量用第一数组的溢出元素替换,对第一源代码中的第二部分目标变量用第二数组的溢出元素替换,使得加固后的第二源代码中的目标变量至少用三种名称表示,这对攻击者造成的迷惑性更大,因此更能提高源代码的防逆向分析能力。
图3示出了是本申请实施例提供的一种电子设备的结构示意图。请参考图3,在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(Random-Access Memory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。
处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是ISA(Industry Standard Architecture,工业标准体系结构)总线、PCI(PeripheralComponent Interconnect,外设部件互连标准)总线或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图3中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
存储器,用于存放程序。具体地,程序可以包括程序代码,所述程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。
处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成网络覆盖性能表征装置。处理器,执行存储器所存放的程序,并具体用于执行以下操作:
基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成所述应用程序加固后的第一源代码;
确定所述第一源代码中需要保护的目标变量;
在所述第一源代码中插入至少一个中间变量,所述至少一个中间变量用于访问所述目标变量;
将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到所述应用程序加固后的第二源代码;
使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述应用程序加固后的第三源代码。
本申请实施例,一方面,在基于应用程序的原始源代码在编译或运行时的跳转逻辑,将应用程序的原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并未每个代码块设置不同的状态;再基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,将代码块中的跳转逻辑通过代码块跳转状态机实现,以生成应用程序加固后的第一源代码,使得各个代码块中的跳转逻辑通过代码块跳转状态机实现,从而实现了对各个代码块中的跳转逻辑进行隐藏,有效防止攻击者通过反编汇、反编译和动态调式等操作轻易的破解各个代码块中的跳转逻辑,进而提高了应用程序的源代码的防逆向破解能力。另一方面,由于部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象,最终也能提高源代码的防逆向分析能力。再有,利用不透明谓词对源代码中的条件变量进行了模糊处理。因此可以增大加固后的源代码的破解难度,进而也可以提高源代码的防逆向分析能力。
上述如本申请图3所示实施例揭示的基于状态、符号执行和单点逻辑的源代码加固装置执行的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(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 (25)

1.一种基于状态、符号执行和单点逻辑的源代码加固方法,其特征在于,包括:
基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成所述应用程序加固后的第一源代码;
确定所述第一源代码中需要保护的目标变量;
在所述第一源代码中插入至少一个中间变量,所述至少一个中间变量用于访问所述目标变量;
将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到所述应用程序加固后的第二源代码;
使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述应用程序加固后的第三源代码。
2.根据权利要求1所述的方法,其特征在于,
所述代码块跳转状态机为代码块跳转函数,所述将代码块中的跳转逻辑通过所述代码块跳转状态机实现,包括:
通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,其中,所述代码块跳转函数的参数包括所述代码块标识和跳转条件,所述代码块跳转函数用于在所述代码块执行到所述代码块跳转函数时,基于跳转条件跳转到目标代码块。
3.根据权利要求2所述的方法,其特征在于,所述通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,包括:
在每个所述代码块的结束位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数只有一个用于标识当前代码块的状态;
通过调用当前代码块的结束位置处的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
4.根据权利要求2所述的方法,其特征在于,所述通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,包括:
在每个所述代码块中至少一个位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数至少包括用于标识当前代码块的状态;
通过调用当前代码块中的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
5.根据权利要求2所述的方法,其特征在于,还包括:对代码块跳转状态机进行加密。
6.根据权利要求5所述的方法,其特征在于,对代码块跳转状态机进行加密,包括:
根据各个所述代码块对应的各个状态之间的跳转关系,确定各个状态的跳转顺序;
根据所述跳转顺序为各个状态配置序列号;
根据各个状态之间的跳转关系及各个所述状态对应的序列号,建立跳转表并进行加密。
7.根据权利要求5所述的方法,其特征在于,对代码块跳转状态机进行加密,包括:
建立所述代码块跳转函数的参数或所述代码块跳转函数的参数中的跳转条件与预定值的对应关系;
根据所述对应关系,将所述参数或所述参数中的跳转条件替换为所述预定值。
8.根据权利要求5所述的方法,其特征在于,对代码块跳转状态机进行加密,包括:
将代码块跳转函数替换为预设函数,所述代码块跳转函数与预设函数存在对应关系。
9.根据权利要求1所述的方法,其特征在于,所述中间变量为数组,则所述在所述第一源代码中插入至少一个中间变量,包括:在所述目标变量的前面插入第一数组;
所述将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,包括:将所述第一源代码中的部分所述目标变量替换为所述第一数组的下溢出元素;
其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量。
10.根据权利要求1所述的方法,其特征在于,所述中间变量为数组,则所述在所述第一源代码中插入至少一个中间变量,包括:在所述目标变量的后面插入第二数组;
所述将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,包括:将所述第一源代码中的部分所述目标变量替换为所述第二数组的上溢出元素;
其中,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。
11.根据权利要求1所述的方法,其特征在于,所述中间变量为数组,则所述在所述第一源代码中插入至少一个中间变量,包括:在所述目标变量的前面插入第一数组,并在所述目标变量的后面插入第二数组;
所述将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,包括:将所述第一源代码中的第一部分所述目标变量替换为所述第一数组的下溢出元素,将所述第一源代码中的第二部分所述目标变量替换为所述第二数组的上溢出元素;
其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量;
其中,所述第一部分和所述第二部分互不重叠,且所述第一部分和所述第二部分的并集小于所述第一源代码中的所有目标变量组成的集合。
12.根据权利要求1所述的方法,其特征在于,所述使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,包括:
确定所述第二源代码的函数中的第一条件变量;
在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
利用所述第二条件变量替换所述第一条件变量。
13.根据权利要求12所述的方法,其特征在于,所述不透明谓词为恒为真或恒为假的函数表达式。
14.一种基于状态、符号执行和单点逻辑的源代码加固装置,其特征在于,包括:
拆分模块,用于基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码按照跳转逻辑的代码位置,拆分成多个代码块,并为每个代码块设置不同的状态,其中,每个代码块以跳转逻辑结束;
第一确定模块,用于基于代码块的状态,以及代码块中的跳转逻辑,确定代码块跳转状态机,所述代码块跳转状态机用于表征各个所述代码块对应的各个状态之间的跳转关系;
第一加固模块,用于将代码块中的跳转逻辑通过所述代码块跳转状态机实现,以生成所述应用程序加固后的第一源代码;
第二确定模块,用于确定所述第一源代码中需要保护的目标变量;
插入模块,用于在所述第一源代码中插入至少一个中间变量,所述至少一个中间变量用于访问所述目标变量;
第二加固模块,用于将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到所述应用程序加固后的第二源代码;
第三加固模块,用于使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述应用程序加固后的第三源代码。
15.根据权利要求14所述的装置,其特征在于,所述第一加固模块包括:
第一加固单元,用于通过调用所述代码块跳转函数,实现所述代码块中的跳转逻辑,其中,所述代码块跳转函数的参数包括所述代码块标识和跳转条件,所述代码块跳转函数用于在所述代码块执行到所述代码块跳转函数时,基于跳转条件跳转到目标代码块。
16.根据权利要求15所述的装置,其特征在于,所述第一加固单元包括:
第一嵌入子单元,用于在每个所述代码块的结束位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数只有一个用于标识当前代码块的状态;
第一实现子单元,用于通过调用当前代码块的结束位置处的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
17.根据权利要求15所述的装置,其特征在于,所述第一加固单元包括:
第二嵌入子单元,用于在每个所述代码块中至少一个位置处嵌入所述代码块跳转函数;其中,所述代码块跳转函数的参数至少包括用于标识当前代码块的状态;
第二实现子单元,用于通过调用当前代码块中的所述代码块跳转函数,实现从当前代码块跳至所述目标代码块。
18.根据权利要求15所述的装置,其特征在于,还包括:加密模块,用于对代码块跳转状态机进行加密。
19.根据权利要求18所述的装置,其特征在于,所述加密模块包括:
确定单元,用于根据各个所述代码块对应的各个状态之间的跳转关系,确定各个状态的跳转顺序;
配置单元,用于根据所述跳转顺序为各个状态配置序列号;
第一建立单元,用于根据各个状态之间的跳转关系及各个所述状态对应的序列号,建立跳转表并进行加密。
20.根据权利要求18所述的装置,其特征在于,所述加密模块包括:
第二建立单元,用于建立所述代码块跳转函数的参数或所述代码块跳转函数的参数中的跳转条件与预定值的对应关系;
第一替换单元,用于根据所述对应关系,将所述参数或所述参数中的跳转条件替换为所述预定值。
21.根据权利要求18所述的装置,其特征在于,所述加密模块包括:
第二替换单元,用于将代码块跳转函数替换为预设函数,所述代码块跳转函数与预设函数存在对应关系。
22.根据权利要求14所述的装置,其特征在于,所述中间变量为数组,则
所述插入模块,具体用于:在所述目标变量的前面插入第一数组;
所述第二加固模块,具体用于:将所述第一源代码中的部分所述目标变量替换为所述第一数组的下溢出元素,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量。
23.根据权利要求14所述的装置,其特征在于,所述中间变量为数组,则
所述插入模块,具体用于:在所述目标变量的后面插入第二数组;
所述第二加固模块,具体用于:将所述第一源代码中的部分所述目标变量替换为所述第二数组的上溢出元素,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。
24.根据权利要求14所述的装置,其特征在于,其特征在于,所述中间变量为数组,则
所述插入模块,具体用于:在所述目标变量的前面插入第一数组,并在所述目标变量的后面插入第二数组;
所述第二加固模块,具体用于:将所述第一源代码中的第一部分所述目标变量替换为所述第一数组的下溢出元素,将所述第一源代码中的第二部分所述目标变量替换为所述第二数组的上溢出元素;
其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量;
其中,所述第一部分和所述第二部分互不重叠,且所述第一部分和所述第二部分的并集小于所述第一源代码中的所有目标变量组成的集合。
25.根据权利要求14所述的装置,其特征在于,所述第三加固模块包括:
确定子模块,用于确定所述第二源代码的函数中的第一条件变量;
添加子模块,用于在所述第一条件变量中添加至少一个不透明谓词,得到第二条件变量,所述不透明谓词的值恒定;
替换子模块,用于利用所述第二条件变量替换所述第一条件变量。
CN201810146589.4A 2018-02-12 2018-02-12 基于状态、符号执行和单点逻辑的源代码加固方法及装置 Active CN108446538B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810146589.4A CN108446538B (zh) 2018-02-12 2018-02-12 基于状态、符号执行和单点逻辑的源代码加固方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810146589.4A CN108446538B (zh) 2018-02-12 2018-02-12 基于状态、符号执行和单点逻辑的源代码加固方法及装置

Publications (2)

Publication Number Publication Date
CN108446538A true CN108446538A (zh) 2018-08-24
CN108446538B CN108446538B (zh) 2020-02-07

Family

ID=63192566

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810146589.4A Active CN108446538B (zh) 2018-02-12 2018-02-12 基于状态、符号执行和单点逻辑的源代码加固方法及装置

Country Status (1)

Country Link
CN (1) CN108446538B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109740313A (zh) * 2018-12-12 2019-05-10 北京字节跳动网络技术有限公司 计算机程序保护方法、装置、电子设备和计算机可读存储介质
CN109885991A (zh) * 2018-12-25 2019-06-14 深圳供电局有限公司 一种基于移动应用数据流体的加密方法、电子设备和介质
CN113867734A (zh) * 2021-10-20 2021-12-31 北京思明启创科技有限公司 代码块解释执行方法、装置、电子设备及存储介质

Citations (4)

* 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
CN105117621A (zh) * 2014-04-23 2015-12-02 恩智浦有限公司 代码混淆的控制流平展化
CN106529225A (zh) * 2016-10-27 2017-03-22 努比亚技术有限公司 一种应用程序源代码保护装置及方法
CN107229848A (zh) * 2017-06-12 2017-10-03 北京洋浦伟业科技发展有限公司 一种代码加固方法和装置

Patent Citations (4)

* 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
CN105117621A (zh) * 2014-04-23 2015-12-02 恩智浦有限公司 代码混淆的控制流平展化
CN106529225A (zh) * 2016-10-27 2017-03-22 努比亚技术有限公司 一种应用程序源代码保护装置及方法
CN107229848A (zh) * 2017-06-12 2017-10-03 北京洋浦伟业科技发展有限公司 一种代码加固方法和装置

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109740313A (zh) * 2018-12-12 2019-05-10 北京字节跳动网络技术有限公司 计算机程序保护方法、装置、电子设备和计算机可读存储介质
CN109885991A (zh) * 2018-12-25 2019-06-14 深圳供电局有限公司 一种基于移动应用数据流体的加密方法、电子设备和介质
CN113867734A (zh) * 2021-10-20 2021-12-31 北京思明启创科技有限公司 代码块解释执行方法、装置、电子设备及存储介质

Also Published As

Publication number Publication date
CN108446538B (zh) 2020-02-07

Similar Documents

Publication Publication Date Title
TWI715999B (zh) 身份資訊的識別方法及裝置
CN108509772A (zh) 基于执行顺序和单点逻辑的源代码加固方法及装置
CN108537012A (zh) 基于变量和代码执行顺序的源代码混淆方法及装置
CN108446538A (zh) 基于状态、符号执行和单点逻辑的源代码加固方法及装置
CN111159697B (zh) 一种密钥检测方法、装置及电子设备
CN112990941B (zh) 一种针对智能合约中庞氏骗局的漏洞检测方法及系统
CN111111176B (zh) 游戏中物体lod的管理方法、装置及电子设备
CN108446535A (zh) 基于代码执行顺序的源代码加固方法及装置
US7661064B2 (en) Displaying text intraline diffing output
CN109508879A (zh) 一种风险的识别方法、装置及设备
CN110502902A (zh) 一种漏洞分类方法、装置及设备
CN107392406A (zh) 一种用于风险决策的风险决策因子筛选方法及装置
CN110263817B (zh) 一种基于用户账号的风险等级划分方法及装置
Fleury et al. Mining definitions in Kissat with Kittens
CN108460253A (zh) 基于顺序、符号执行和单点逻辑的源代码加固方法及装置
CN107358071A (zh) 防止Flash应用程序中函数非法调用的方法及装置
Zhou et al. Stop pulling my rug: Exposing rug pull risks in crypto token to investors
CN110188578A (zh) 一种自动屏蔽信息的方法及设备
CN109492401A (zh) 一种内容载体风险检测方法、装置、设备及介质
CN105335645A (zh) 图片验证码验证方法和装置
CN108415709A (zh) 一种基于有限状态机加固源代码的方法及装置
CN110008714A (zh) 基于对抗神经网络的数据加密的方法、装置和电子设备
CN108446536A (zh) 一种基于符号执行和单点逻辑的源代码加固方法及装置
CN105630680A (zh) 一种随机测试程序生成方法
CN108446541A (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