基于顺序、符号执行和单点逻辑的源代码加固方法及装置制造方法及图纸

技术编号:18784101 阅读:29 留言:0更新日期:2018-08-29 07:04
本申请公开了一种基于顺序、符号执行和单点逻辑的源代码加固方法及装置,可以将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;确定所述第一源代码中需要保护的目标变量;在所述第一源代码中插入至少一个中间变量,并将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码;使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述加固后的第三源代码。该方法及装置可以提高防逆向分析能力。

【技术实现步骤摘要】
基于顺序、符号执行和单点逻辑的源代码加固方法及装置
本申请涉及软件安全
,尤其涉及一种基于顺序、符号执行和单点逻辑的源代码加固方法及装置。
技术介绍
现如今,移动互联网、物联网、车联网等技术高速发展,终端的数量越来越多,终端中安装的应用程序也越来越多,这给人们的工作和生活带来了极大的便利。应用程序运行过程中会产生一些重要的信息,这引起了攻击者的极大兴趣,使得这些重要信息存在被泄露的风险。目前,攻击者常使用反汇编、反编译等静态分析工具,对应用程序的源代码进行逆向分析破解,获得应用程序的执行逻辑,从而非法窃取、非法篡改应用程序运行过程中产生的重要信息。针对上述风险,现有技术常通过对应用程序的源代码进行混淆,提高源代码的防逆向分析能力,降低应用程序运行过程中产生的重要信息被泄露的风险。但是,现有的控制流平坦化等源代码混淆方法依然存在被破解的风险,源代码的防逆向分析能力还有待提高。
技术实现思路
本申请实施例提供一种基于顺序、符号执行和单点逻辑的源代码加固方法及装置,以提高源代码的防逆向分析能力。第一方面,提供了一种基于顺序、符号执行和单点逻辑的源代码加固方法,所述方法包括:基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块;基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表,所述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的第三源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址;将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;确定所述第一源代码中需要保护的目标变量;在所述第一源代码中插入至少一个中间变量,并将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码;其中,所述至少一个中间变量用于访问所述目标变量;使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述加固后的第三源代码。第二方面,提供了一种基于顺序、符号执行和单点逻辑的源代码加固装置,包括:代码块拆分模块,用于基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块;跳转表建立模块,用于基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表,所述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的第三源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址;第一加固模块,用于将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;确定模块,用于确定所述第一源代码中需要保护的目标变量;第二加固模块,用于在所述第一源代码中插入至少一个中间变量,并将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码;其中,所述至少一个中间变量用于访问所述目标变量;第三加固模块,用于使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述加固后的第三源代码。第三方面,本申请实施例还提供了一种电子设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如第一方面所述的方法的步骤。第四方面,本申请实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面所述的方法的步骤。本申请实施例采用的上述至少一个技术方案,由于:一方面,通过跳转表中的代码块标记实现了原始源代码的代码块之间的跳转逻辑,因此可以隐藏原始源代码的执行顺序;另一方面,部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象;再有,利用不透明谓词对源代码中的条件变量进行了模糊处理。因此可以增大加固后的源代码的破解难度,进而可以提高源代码的防逆向分析能力。附图说明此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:图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、基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表。上述跳转表中保存有代码块标记与代码块的地本文档来自技高网...

【技术保护点】
1.一种基于顺序、符号执行和单点逻辑的源代码加固方法,其特征在于,所述方法包括:基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块;基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表,所述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的第三源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址;将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;确定所述第一源代码中需要保护的目标变量;在所述第一源代码中插入至少一个中间变量,并将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码;其中,所述至少一个中间变量用于访问所述目标变量;使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述加固后的第三源代码。

【技术特征摘要】
1.一种基于顺序、符号执行和单点逻辑的源代码加固方法,其特征在于,所述方法包括:基于应用程序的原始源代码在编译或运行时的跳转逻辑,将所述原始源代码拆分成多个代码块;基于所述原始源代码在编译或运行时的跳转逻辑,建立表征所述多个代码块的执行顺序的跳转表,所述跳转表中保存有代码块标记与代码块的地址的对应关系;其中,所述地址为加固后的第三源代码在编译或运行时、代码块在内存中的地址,所述代码块标记用于访问对应的代码块的地址;将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,以生成加固后的第一源代码;确定所述第一源代码中需要保护的目标变量;在所述第一源代码中插入至少一个中间变量,并将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,得到加固后的第二源代码;其中,所述至少一个中间变量用于访问所述目标变量;使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,得到所述加固后的第三源代码。2.根据权利要求1所述的方法,其特征在于,所述将所述原始源代码的代码块之间的跳转逻辑,通过所述跳转表中的代码块标记实现,包括:确定第一代码块在所述原始源代码中的初始位置;在所述原始源代码的第一位置插入所述第一代码块,所述第一位置与所述初始位置不同;将位于所述初始位置的所述第一代码块替换为第一预设代码,所述第一预设代码包括:第一预设跳转语句和第一代码块标记;其中,所述第一预设跳转语句用于访问所述第一代码块标记,所述第一代码块标记用于访问所述第一代码块对应的地址,以执行所述第一代码块;确定第二代码块,所述第二代码块为所述原始源代码在编译或运行时,执行完所述第一代码块后需要执行的下一代码块;在插入所述第一位置的第一代码块的结尾插入第二预设代码,所述第二预设代码包括:第二预设跳转语句和第二代码块标记;其中,所述第二预设跳转语句用于访问所述第二代码块标记,所述第二代码块标记用于访问所述第二代码块对应的地址,以执行所述第二代码块。3.根据权利要求2所述的方法,其特征在于,所述方法还包括:对所述第一预设代码和/或所述第二预设代码进行加密。4.根据权利要求1-3任一项所述的方法,其特征在于,所述方法还包括:对所述跳转表进行加密。5.根据权利要求4所述的方法,其特征在于,所述方法还包括:将加固后的所述第三源代码存储至第一文件中;将加密后的所述跳转表存储至第二文件中;其中,所述第一文件和所述第二文件为不同的文件。6.根据权利要求1所述的方法,其特征在于,所述中间变量为数组,则所述在所述第一源代码中插入至少一个中间变量,并将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,包括:在所述目标变量的前面插入第一数组;将所述第一源代码中的部分所述目标变量替换为所述第一数组的下溢出元素;其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量。7.根据权利要求1所述的方法,其特征在于,所述中间变量为数组,则所述在所述第一源代码中插入至少一个中间变量,并将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,包括:在所述目标变量的后面插入第二数组;将所述第一源代码中的部分所述目标变量替换为所述第二数组的上溢出元素;其中,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。8.根据权利要求1所述的方法,其特征在于,所述中间变量为数组,则所述在所述第一源代码中插入至少一个中间变量,并将所述第一源代码中的部分所述目标变量替换为任一所述中间变量,包括:在所述目标变量的前面插入第一数组,并在所述目标变量的后面插入第二数组;将所述第一源代码中的第一部分所述目标变量替换为所述第一数组的下溢出元素,将所述第一源代码中的第二部分所述目标变量替换为所述第二数组的上溢出元素;其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量;所述第一部分和所述第二部分互不重叠,且所述第一部分和所述第二部分的并集小于所述源代码中的所有目标变量组成的集合。9.根据权利要求8所述的方法,其特征在于,所述第一数组和所述第二数组均与所述目标变量相邻,则所述下溢出元素的下标为所述第一数组中元素的最大下标加1;所述上溢出元素的下标为所述第二数组中元素的最小下标减1。10.根据权利要求1所述的方法,其特征在于,所述使用不透明谓词对所述第二源代码的函数中的条件变量进行模糊处理,包括:确定所述第二源代码的函数中的第一条件变量;在所述第一条件变量中添加至少一个不透...

【专利技术属性】
技术研发人员:阚志刚陈彪王文洋李世杰尉爽生卢佐华
申请(专利权)人:北京梆梆安全科技有限公司
类型:发明
国别省市:北京,11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1