CN108537012B - 基于变量和代码执行顺序的源代码混淆方法及装置 - Google Patents
基于变量和代码执行顺序的源代码混淆方法及装置 Download PDFInfo
- Publication number
- CN108537012B CN108537012B CN201810146581.8A CN201810146581A CN108537012B CN 108537012 B CN108537012 B CN 108537012B CN 201810146581 A CN201810146581 A CN 201810146581A CN 108537012 B CN108537012 B CN 108537012B
- Authority
- CN
- China
- Prior art keywords
- target
- code
- source code
- array
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 94
- 238000012545 processing Methods 0.000 claims abstract description 83
- 238000013507 mapping Methods 0.000 claims abstract description 15
- 238000003860 storage Methods 0.000 claims description 64
- 230000008569 process Effects 0.000 claims description 39
- 238000004458 analytical method Methods 0.000 abstract description 23
- 238000010586 diagram Methods 0.000 description 12
- 238000004590 computer program Methods 0.000 description 9
- 230000006870 function Effects 0.000 description 9
- 230000006872 improvement Effects 0.000 description 9
- 230000002441 reversible effect Effects 0.000 description 8
- 230000003068 static effect Effects 0.000 description 7
- 238000005516 engineering process Methods 0.000 description 6
- 238000003780 insertion Methods 0.000 description 6
- 230000037431 insertion Effects 0.000 description 6
- 230000002265 prevention Effects 0.000 description 6
- 238000005336 cracking Methods 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 4
- 238000004088 simulation Methods 0.000 description 4
- 238000003491 array Methods 0.000 description 3
- 230000005055 memory storage Effects 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 238000004891 communication Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 239000003550 marker Substances 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 229920001296 polysiloxane Polymers 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/12—Protecting executable software
- G06F21/14—Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请实施例提供了一种基于变量和代码执行顺序的源代码混淆方法及装置,包括:对目标应用程序的源代码中的需要保护的目标变量进行第一混淆处理;基于源代码在编译或运行时的跳转逻辑,将源代码拆分成多个代码块;基于跳转逻辑和各个代码块对应的代码块标记,对多个代码块中的目标代码块的执行顺序进行第二混淆处理;并建立表征多个代码块执行顺序的跳转表,跳转表内存储有代码块标记和第二混淆处理后的代码块地址的映射关系;其中,代码块标记用于访问对应的代码块地址。本申请中,可以达到模糊、混淆源代码中的目标变量、隐藏源代码的执行顺序的目的,进而可以提高源代码的防逆向分析能力,提高了应用程序中信息的安全性。
Description
技术领域
本申请涉及软件安全技术领域,尤其涉及一种基于变量和代码执行顺序的源代码混淆方法及装置。
背景技术
随着科学技术的不断发展,终端设备在人们的生活、工作中得到了广泛的应用。而随着终端设备的广泛应用,安装在终端设备上的应用程序也越来越多。当用户在使用某些应用程序时,可能会在应用程序中存储一些重要的信息,有些人为了非法获取这些信息,可能会对应用程序进行攻击。
目前,在非法获取上述信息时,通常使用反汇编、反编译等静态分析工具,对应用程序的源代码进行逆向分析破解,获得应用程序的执行逻辑,从而非法窃取、非法篡改应用程序运行过程中产生的重要信息,从而导致应用程序存在重大安全隐患。
因此,有必要提出一种源代码的混淆方法,以提高源代码的防逆向分析能力,进而提高应用程序中信息的安全性。
发明内容
本申请实施例的目的是提供一种基于变量和代码执行顺序的源代码混淆方法及装置,对源代码中的目标变量和源代码中代码块的执行顺序进行混淆处理,从而达到模糊、混淆源代码中的目标变量以及隐藏源代码的执行顺序的目的,进而可以提高源代码的防逆向分析能力,从而提高应用程序中信息的安全性。
为解决上述技术问题,本申请实施例是这样实现的:
本申请实施例提供了一种基于变量和代码执行顺序的源代码混淆方法,包括:
对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,所述目标变量为所述源代码中需要保护的变量;
基于所述源代码在编译或运行时的跳转逻辑,将所述源代码拆分成多个代码块;
基于所述跳转逻辑和各个代码块对应的代码块标记,对所述多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立表征多个代码块执行顺序的跳转表,所述跳转表内存储有所述代码块标记和第二混淆处理后的代码块地址的映射关系;其中,所述代码块标记用于访问对应的代码块地址。
本申请实施例还提供了一种基于变量和代码执行顺序的源代码混淆装置,包括:
第一处理模块,用于对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,所述目标变量为所述源代码中需要保护的变量;
拆分模块,用于基于所述源代码在编译或运行时的跳转逻辑,将所述源代码拆分成多个代码块;
第二处理模块,用于基于所述跳转逻辑和各个代码块对应的代码块标记,对所述多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立模块,用于建立表征多个代码块执行顺序的跳转表,所述跳转表内存储有所述代码块标记和第二混淆处理后的代码块地址的映射关系;其中,所述代码块标记用于访问对应的代码块地址。
本申请实施例还提供了一种基于变量和代码执行顺序的源代码混淆设备,所述设备包括:
处理器;以及
被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:
对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,所述目标变量为所述源代码中需要保护的变量;
基于所述源代码在编译或运行时的跳转逻辑,将所述源代码拆分成多个代码块;
基于所述跳转逻辑和各个代码块对应的代码块标记,对所述多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立表征多个代码块执行顺序的跳转表,所述跳转表内存储有所述代码块标记和第二混淆处理后的代码块地址的映射关系;其中,所述代码块标记用于访问对应的代码块地址。
本申请实施例还提供了一种存储介质,用于存储计算机可执行指令,所述可执行指令在被执行时实现以下流程:
对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,所述目标变量为所述源代码中需要保护的变量;
基于所述源代码在编译或运行时的跳转逻辑,将所述源代码拆分成多个代码块;
基于所述跳转逻辑和各个代码块对应的代码块标记,对所述多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立表征多个代码块执行顺序的跳转表,所述跳转表内存储有所述代码块标记和第二混淆处理后的代码块地址的映射关系;其中,所述代码块标记用于访问对应的代码块地址。
本申请实施例提供的技术方案,对源代码中的目标变量和源代码中代码块的执行顺序均进行混淆处理,从而达到模糊、混淆源代码中的目标变量以及隐藏源代码的执行顺序的目的,进而可以提高源代码的防逆向分析能力,从而提高应用程序中信息的安全性。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的一种基于变量和代码执行顺序的源代码混淆方法的第一种方法流程图;
图2为本申请实施例提供的一种基于变量和代码执行顺序的源代码混淆方法中,对目标代码块的执行顺序进行第二混淆处理的流程图;
图3为本申请实施例提供的一种基于变量和代码执行顺序的源代码混淆方法的二种方法流程图;
图4为本申请实施例提供的一种基于变量和代码执行顺序的源代码混淆装置的模块组成示意图;
图5为本申请实施例提供的一种基于变量和代码执行顺序的源代码混淆设备的结构示意图。
具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
本申请实施例提供了一种基于变量和代码执行顺序的源代码混淆方法,该方法可以应用于终端设备,也可以应用于服务器;其中,上述终端设备可以是手机、平板电脑、计算机等。
图1为本申请实施例提供的基于变量和代码执行顺序的源代码混淆方法的第一种方法流程图,图1所示的方法至少包括如下步骤:
步骤102,对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,目标变量为源代码中需要保护的变量。
其中,上述目标应用程序可以是任意一种需要进行源代码混淆的应用程序。
上述需要保护的目标变量,可以是目标应用程序的源代码中携带有重要信息的变量,例如,目标应用程序为一款金融类应用程序,那么目标变量可以是该金融类应用程序的源代码中与支付密码有关的变量。当然,也可以是其它需要保护的变量,此处只是举例进行说明,目标变量的选取并不局限于此。
在本申请实施例中,上述步骤102中对目标应用程序的源代码中的目标变量进行第一混淆处理,包括如下步骤(1)、(2)和(3);
步骤(1)、确定源代码中的目标变量;
步骤(2)、在源代码中插入中间变量组;其中,中间变量组用于访问目标变量;
步骤(3)、根据上述中间变量组,对源代码中的部分目标变量进行第一混淆处理。
其中,上述中间变量组可以是数组或者指针。
上述步骤(3)中,并不对源代码中出现的所有的目标变量都进行混淆处理,而是只对其中一部分目标变量进行第一混淆处理。例如,在源代码中目标变量为x,并且,目标变量x在源代码中出现了N次,则最多需要对源代码中的N-1个目标变量x进行第一混淆处理。
程序的静态分析,一般是指在程序不运行的情况下,通过分析程序的源代码或者可执行代码来获得程序在运行时的信息的技术。由于程序没有被真正执行,若要获得程序在运行时的状态信息,可以建立一个模型对程序在运行时的状态进行模拟,通过对这个模型进行操作,可以获得程序的运行状态的近似表示。符号执行就是这样的一个模型。
符号执行一般是指用符号值代替真实值模拟执行程序的过程,且在该过程中模拟了变量在内存中的存储位置。
在本申请实施例中,上述步骤(2)中在源代码中插入中间变量组,可以是在源代码中目标变量的前面任一位置处插入中间变量组,也可以是在源代码中目标变量的后面任一位置处插入中间变量组,或者,还可以是在源代码中的目标变量的前面任一位置和后面任一位置处均插入中间变量组。
下述将根据中间变量组的插入位置不同,分三种情况进行介绍。
第一种情况,上述中间变量组为第一数组;
则上述步骤(2)中,在源代码中插入中间变量组,包括:
在目标变量的前面某一位置处插入第一数组;
相应的,上述步骤(3)中,根据所述中间变量组,对源代码中的部分目标变量进行第一混淆处理,包括:
将源代码中的部分目标变量替换为第一数组的下溢出元素;其中,下溢出元素的下标为第一数组中元素的最大下标与第一数值的和再加1,第一数值为第一数组与目标变量在内存中相隔的存储位置的数量。
在本申请实施例中,可以在目标变量的前面且与目标变量相邻的位置处插入第一数组,也可以在目标变量的前面与目标变量相间隔几个存储位置处插入第一数组,在该种情况下,只要是插入的第一数组在目标变量的前面即可,本申请实施例并不对上述第一数组的具体插入位置进行限定。
下述将举例进行说明。
例如,假设目标应用程序对应的源代码为:
上述源代码中的目标变量为x,在目标变量x的前面插入第一数组b[5],插入后的源代码为:
在上述插入第一数组b[5]的下溢出元素b[6]进行访问,实现对目标变量x 的访问。
为了便于理解上述过程,下述通过表1列举出目标变量x和第一数组b[5] 在模拟内存中的相对存储位置关系。
表1
b[0] |
b[1] |
… |
b[4] |
z |
x |
其中,上述第一数组b[5]共包括b[0]-b[4]5个元素,并且这5个元素按序占据模拟内存中的5个存储位置,第一数组b[5]中元素的最大下标为4,第一数组和目标变量x之间间隔一个存储位置,即第一竖直的取值为1,因此,下溢出元素的下标为4+1+1=6,所以,在此举例中,目标变量z占据数组b[5]的下溢出元素b[6]所占据的位置,因此,可以通过访问内容中b[6]所占据的存储位置,实现对目标变量x的访问。
则使用下溢出元素b[6]代替上述源代码中的部分目标变量后,得到的源代码为:
这样,当有攻击者利用符号执行模型这样的静态分析工具,对上述混淆后的源代码中的目标变量x进行静态分析时,由于源代码中的部分变量x的名称已修改为第一数组的下溢出元素b[6],使得攻击者仅能够识别出未修改名称的少量目标变量,而无法识别出已修改名称的目标变量,相应的,从根本上达到混淆目标变量x与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量x的存储位置为存储中间变量的存储位置的假象,使得攻击者无法获得变量x在程序运行过程中的完整变化逻辑,从而提高了源代码的防逆向分析能力。
在该种情况下,由于部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象。由于攻击者感兴趣的变量是需要保护的目标变量而非中间变量,因此可以欺骗攻击者不对通过中间变量间接表示的目标变量进行分析,最终提高源代码的防逆向分析能力。
第二种情况,上述中间变量组为第二数组;
则在上述步骤(2)中,在源代码中插入中间变量组,包括:
在目标变量的后面某一位置处插入第二数组;
相应的,在上述步骤(3)中,根据中间变量组,对源代码中的部分目标变量进行第一混淆处理,包括:
将源代码中的部分目标变量替换为第二数组的上溢出元素;
其中,上溢出元素的下标为第二数组中元素的最小下标与第二数值的差再减1,第二数值为目标变量与第二数组在内存中相隔的存储位置的数量。
在该种情况下,在目标变量的后面某一位置处插入第二数组,可以在目标变量的后面且与目标变量相邻的位置处插入第二数组,也可以在目标变量的后面且与目标变量相间隔几个存储位置处插入第二数组,在该种情况下,只要是插入的第二数组在目标变量的后面即可,本申请实施例并不对上述第二数组的具体插入位置进行限定。
下述将举例进行说明。
例如,假设目标应用程序对应的源代码为:
上述源代码中需要保护的目标变量为x,则在目标变量x的后面插入第二数组a[10],插入第二数组a[10]后的源代码为:
由于第二数组a[10]插在目标变量x后面且与目标变量相邻的位置处,因此,目标变量x与第二数组a[10]之间间隔的存储位置的数量为零,即第二数组的取值为零,因此,第二数组的上溢出元素为a[-1],因此,可以通过对数组 a[10]的上溢出元素a[-1]进行访问,实现对目标变量x的访问。
为了便于理解上述过程,下述通过表2形象的说明目标变量x与第二数组 a[10]在模拟内存中的相对存储位置关系。
表2
x |
a[0] |
a[1] |
a[2] |
a[3] |
… |
a[9] |
在表2中,第二数组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]具有溢出关系的元素。
一般情况下,通常情况下,在源代码的正确性检测过程中,溢出访问被视为是一种错误,应避免出现。而本申请实施例正是刻意的利用这种表面属于错误的溢出访问来迷惑攻击者,使攻击者误以为源代码中出现错误,而不去分析该错误背后隐藏的目标变量,从而进一步地提高混淆后的源代码的防逆向分析能力。
之后,在将上述源代码中的部分目标变量x替换为第二数组a[10]的上溢出元素a[-1],替换后得到的源代码为:
在该种情况下,由于部分目标变量被替换为中间变量,因此,可以达到模糊、混淆源代码中的目标表变量的目的,并相应的达到模糊、混淆目标变量与内存存储位置之间的对应关系的目的,给攻击者造成内存中原本存储目标变量的存储位置却为存储中间变量的存储位置的假象。由于攻击者感兴趣的变量是需要保护的目标变量而非中间变量,因此可以欺骗攻击者不对通过中间变量间接表示的目标变量进行分析,最终提高源代码的防逆向分析能力。
第三种情况,在目标变量的前面和后面均插入数组。
在一种具体实施方式中,在目标变量的前面插入第一数组,在目标变量的后面插入第二数组。
相应的,上述步骤(3)中,则将源代码中的第一部分目标变量替换为第一数组的下溢出元素,将源代码中的第二部分目标变量替换为第二数组的上溢出变量。
并且,第一部分目标变量和第二部分目标变量互不重叠,也即第一部分目标变量和第二部分目标变量为源代码中不同位置出现的目标变量,且第一部分目标变量和第二部分目标变量的并集小于源代码中的所有目标变量组成的集合。
为了便于理解上述过程,下述将举例进行说明。
例如,目标应用程序的源代码为:
上述源代码中的目标变量为x,在目标变量x的前面插入第一数组b[5],在目标变量x的后面插入第二数组a[10],插入后的源代码为:
则,第一数组b[5],第二数组a[10]以及目标变量x在模拟内容中的相对存储位置如表3所示。
表 3
b[0] |
b[1] |
… |
b[4] |
x |
a[0] |
a[1] |
… |
a[9] |
由于目标变量x与第一数组b[5]相邻,因此,目标变量x与第一数组b[5] 在内存中间隔的存储位置的数量为零,因此,用于访问目标变量x的下溢出元素的下标为4+0+1=5,即通过访问b[5]可实现对目标变量x的访问。
另外,目标变量还与第二数组a[10]相邻,因此,目标变量x与第二数组 a[10]在内存中间隔的存储位置的数量为零,因此,用于访问目标变量x的上溢出元素的下标为0-0-1=-1,因此,可以通过访问a[-1]实现对目标变量x的访问。
因此,可以将源代码中的第一部分目标变量x替换为第一数组的下溢出元素b[5],将源代码中的第二部分目标变量x替换为第二数组的上溢出变量a[-1]。
另外,在第一数组和/或所述第二数组与目标变量不相邻时,由于攻击者难以分析出与目标变量相隔较远的数组有间接的联系,因此,对攻击者产生的迷惑性更大,从而也可以更进一步地提升源代码的防逆向分析能力。
在该种情况下,由于在目标变量的前面和后面分别插入了数组,并且对待混淆的源代码中的第一部分目标变量用第一数组的溢出元素替换,对待混淆的源代码中的第二部分目标变量用第二数组的溢出元素替换,使得待混淆的源代码中的目标变量至少用三种名称表示,这对攻击者造成的迷惑性更大,因此更能提高源代码的防逆向分析能力。
另外,在本申请实施例中,为了进一步增加源代码的混淆程度,以便进一步增大源代码的防逆向分析能力,可以在源代码中插入多个能够访问目标变量的中间变量组,并用多个中间变量组分别替换源代码中的部分目标变量。因为,插入和替换的能够访问目标变量的中间变量越多,对攻击者造成的迷惑性越大,使得攻击者难以从众多的中间变量中分辨出目标变量,从而更好地提升混淆后的源代码的防逆向分析能力。
另外,在本申请实施例中,还可以采用控制流平坦化和/或不透明谓词等方法对目标变量进行混淆处理。
也就是说,除了在源代码中插入中间变量组,并将源代码中的部分目标变量用中间变量替换之外,还可以采用其他方式对源代码进行混淆,以进一步地提高源代码的防逆向破解能力。
步骤104,基于源代码在编译或运行时的跳转逻辑,将源代码拆分成多个代码块。
在本申请实施例中,上述代码块可以是源代码中能够顺序执行的一段代码,以跳转逻辑开始并以跳转逻辑结束,可以是源代码中跳转语句对应的代码段。例如:
其中,跳转语句可以包括:循环语句、条件语句、返回语句和结束语句等语句中的任一种。循环语句例如可以包括:while、do-while、for、for/in等语句。条件语句例如可以包括:if/else、switch/case等语句。返回语句例如可以是 return语句。结束语句例如可以是break语句。此外,跳转语句还可以包括goto、 continue等语句。此处列举的循环语句、条件语句、返回语句和结束语句等语句仅是对跳转语句的举例说明,并不构成对本申请实施例的限定。
步骤106,基于上述跳转逻辑和各个代码块对应的代码块标记,对多个代码块中的目标代码块的执行顺序进行第二混淆处理。
其中,上述代码块对应的代码块标记可以是使用一个数组中的数组元素,例如,可以使用数组address_array[3]中的元素“address_array[0]”作为“代码块1”对应的代码块标记,“address_array[1]”作为“代码块2”对应的代码块标记,“address_array[2]”作为“代码块3”对应的代码块标记。
其中,上述目标代码块指的是源代码中需要隐藏或者混淆其执行顺序的代码块,若是存在多个需要混淆其执行顺序的代码块时,可以一个一个进行混淆处理,也可以多个同时并行进行混淆处理。
图2示出了本申请实施例中,对多个代码块中的目标代码块的执行顺序进行第二混淆处理的方法流程图,图2所示的方法至少包括如下步骤:
步骤202,确定目标代码块在源代码中的初始位置。
步骤204,在源代码的预设位置插入目标代码块,其中,预设位置不同于初始位置。
步骤206,将位于初始位置处的目标代码块替换为第一预设跳转语句和目标代码块对应的代码块标记;其中,第一预设跳转语句用于访问目标代码块对应的代码块标记。
步骤208,确定第一代码块,其中,第一代码块为源代码在编译或运行时,执行完目标代码块后需要执行的代码块。
步骤210,在插入预设位置处的目标代码块的结尾插入第二预设跳转语句和第一代码块对应的代码块标记;其中,第二预设跳转语句用于访问第一代码块对应的代码块标记。
为了便于理解上述过程,下述将举例进行说明。例如,目标应用程序的源代码为:
将上述代码中的“代码块1”作为目标代码块。
上述步骤204中,在预设位置处插入目标代码块,可以是在“代码块2”之后的位置处插入“代码块1”,则插入目标代码块之后的源代码为:
在步骤206中,上述第一预设跳转语句可以是goto语句,当然,还可以是其它语句,第一预设跳转语句并不局限于此。
在本申请的一个具体实施例中,“代码块1”对应的代码块标记为“address_array[0]”,所使用的第一预设跳转语句为goto语句,因此,在执行完步骤206后,得到的源代码为:
在步骤208中,则需要确定第一代码块,在上述举例中,执行完“代码块1”后,需要执行的下一代码块为“代码块3”,执行完“代码块2”后需要执行的下一代码块也为“代码块3”,因此,第一代码块为代码块3。
在步骤210中,上述第二预设语句可以是goto语句,当然,还可以是其它语句,第一预设跳转语句并不局限于此,“代码块3”对应的代码块标记为 address_array[2],因此,在执行完步骤210后,得到的源代码为:
步骤108,建立表征多个代码块执行顺序的跳转表,上述跳转表内存储有代码块标记和第二混淆处理后的代码块地址的映射关系;其中,上述代码块标记用于访问对应的代码块地址。
当对目标代码块的执行顺序进行混淆处理后,确定进行混淆处理后的各个代码块在内存中的地址,并建立代码块标记和代码块地址的映射关系。
例如,代码块标记“address_array[0]”与“代码块1的地址”对应,代码块标记“address_array[1]”与“代码块2的地址”对应,代码块标记“address_array[2]”与“代码块3的地址”对应,将上述对应关系存储在跳转表中。
其中,上述“address_array[0]”、“address_array[1]”和“address_array[2]”均为数组address_array[3]中的元素,因此,上述跳转表可以表示为 address_array[3]={代码块1的地址,代码块2的地址,代码块3的地址}。
在本申请实施例中,上述跳转表中存储有混淆后的各个代码块的执行顺序,通过跳转表中的代码块标记实现了源代码的代码块之间的跳转逻辑,因此,可以隐藏源代码中代码块的执行顺序,进而可以提高源代码的防逆向分析能力。
另外,本申请实施例提供的方法,还包括:
对跳转表进行加密。
其中,在本申请实施例中,可以采用现有的加密算法对跳转表进行加密。
在本申请实施例中,对反映代码块正确执行顺序的跳转表进行加密,可以更好的隐藏源代码中代码块的正确执行顺序,使得静态分析攻击者即使拿到了源代码,因无法获得跳转表中保存的正确执行顺序,而无法获知源代码的真实业务逻辑,进一步提高了源代码的防逆向分析能力。
本申请实施例提供的方法,还包括:
将加密后的跳转表和混淆后的源代码存储在不同的文件中。
例如,在本申请实施例中,可以将加密后的跳转表存储在第一文件中,将混淆后的源代码存储在第二文件中,其中,第一文件和第二文件为不同的文件。
在本申请实施例中,由于将混淆后的源代码和加密后的跳转表分别保存到了不同的文件中,因此可以使跳转表变得更为隐蔽而不被静态分析攻击者获取,从而使攻击者无法获得跳转表中保存的正确执行顺序,因此可以进一步地提高源代码的防逆向破解能力。
另外,为了进一步提高源代码的防逆向破解能力,本申请实施例提供的方法还包括:
对存储有跳转表的文件进行加密。
图3为本申请实施例提供的基于变量和代码执行顺序的源代码混淆方法的第二种方法流程图,图3所示的方法至少包括如下步骤:
步骤302,确定目标应用程序的代码中需要进行保护的目标变量。
步骤304,在目标变量前面的位置插入数组。
其中,上述数组用户访问目标变量,例如,可以是数组a[10]、数组b[5] 等。
步骤306,将源代码中的部分目标变量替换为上述数组的下溢出元素。
其中,下溢出元素的下标为第一数组中元素的最大下标与第一竖直的和再加1,第一数值为第一数组与目标变量在内存中相隔的存储位置的数量。
步骤308,基于源代码在编译或运行时的跳转逻辑,将上述替换后得到的源代码拆分为多个代码块。
步骤310,确定目标代码块在源代码中的初始位置。
其中,目标代码块为需要隐藏执行顺序的代码块,可以为一个或者多个。
步骤312,在不同于上述初始位置的位置处插入目标代码块。
步骤314,将位于初始位置处的目标代码块替换为第一预设跳转语句和目标代码块对应的代码块标记。
其中,上述第一预设跳转语句可以是goto语句,上述代码块标记可以是数组元素。
步骤316,确定源代码在编译或运行时,执行完目标代码块后需要执行的代码块,记为第一代码块。
步骤318,在插入目标代码块的结尾处插入第二跳转语句和第一代码块对应的代码块标记。
其中,第二跳转语句可以是goto语句,上述第一代码块对应的代码块标记可以是数组元素。
步骤320,确定各个代码块在内存中的地址,代码块标记和代码块的地址的映射关系,得到表征多个代码块执行顺序的跳转表。
本申请实施例提供的基于变量和代码执行顺序的源代码混淆方法,对源代码中的目标变量和目标代码块的执行顺序均进行混淆处理,从而达到模糊、混淆源代码中的目标变量、隐藏源代码的执行顺序的目的,进而可以提高源代码的防逆向分析能力,提高了应用程序中信息的安全性。
基于与上述实施例提供的基于变量和代码执行顺序的源代码混淆方法相同的思路,本申请实施例还提供了一种基于变量和代码执行顺序的源代码混淆装置,图4示出了本申请实施例提供的基于变量和代码执行顺序的源代码混淆装置的模块组成示意图,图4所示的装置,包括:
第一处理模块41,用于对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,目标变量为源代码中需要保护的变量;
拆分模块42,用于基于源代码在编译或运行时的跳转逻辑,将源代码拆分成多个代码块;
第二处理模块43,用于基于跳转逻辑和各个代码块对应的代码块标记,对多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立模块44,用于建立表征多个代码块执行顺序的跳转表,跳转表内存储有代码块标记和第二混淆处理后的代码块地址的映射关系;其中,代码块标记用于访问对应的代码块地址。
可选地,第一处理模块41,包括:
第一确定单元,用于确定源代码中的目标变量;
第一插入单元,用于在源代码中插入中间变量组;其中,中间变量组用于访问目标变量;
第一处理单元,用于根据中间变量组,对源代码中的部分目标变量进行第一混淆处理。
可选地,上述中间变量组为第一数组;
相应的,上述第一插入单元,包括:
第一插入子单元,用于在目标变量的前面某一位置处插入第一数组;
相应的,上述第一处理单元,包括:
第一替换子单元,用于将源代码中的部分目标变量替换为第一数组的下溢出元素;
其中,下溢出元素的下标为第一数组中元素的最大下标与第一数值的和再加1,第一数值为第一数组与目标变量在内存中相隔的存储位置的数量。
可选地,上述中间变量组为第二数组;
相应的,上述第一插入单元,包括:
第二插入子单元,用于在目标变量的后面某一位置处插入第二数组;
相应的,上述第一处理单元,包括:
第二替换子单元,用于将源代码中的部分目标变量替换为第二数组的上溢出元素;
其中,上溢出元素的下标为第二数组中元素的最小下标与第二数值的差再减1,第二数值为目标变量与第二数组在内存中相隔的存储位置的数量。
可选地,上述第二处理模块43,包括:
第二确定单元,用于确定目标代码块在源代码中的初始位置;
第二插入单元,用于在源代码的预设位置插入目标代码块,其中,预设位置不同于初始位置;
替换单元,用于将位于初始位置处的目标代码块替换为第一预设跳转语句和目标代码块对应的代码块标记;其中,第一预设跳转语句用于访问目标代码块对应的代码块标记;
第三确定单元,用于确定第一代码块,其中,第一代码块为源代码在编译或运行时,执行完目标代码块后需要执行的代码块;
第三插入单元,用于在插入预设位置处的目标代码块的结尾插入第二预设跳转语句和第一代码块对应的代码块标记;其中,第二预设跳转语句用于访问第一代码块对应的代码块标记。
可选地,本申请实施例提供的装置,还包括:
加密模块,用于对上述跳转表进行加密。
可选地,本申请实施例提供的装置,还包括:
存储模块,用于将加密后的跳转表和混淆后的源代码存储在不同的文件中。
本申请实施例提供的基于变量和代码执行顺序的源代码混淆装置,对源代码中的目标变量和目标代码块的执行顺序均进行混淆处理,从而达到模糊、混淆源代码中的目标变量、隐藏源代码的执行顺序的目的,进而可以提高源代码的防逆向分析能力,提高了应用程序中信息的安全性。
进一步地,基于上述图1至图3所示的方法,本申请实施例还提供了一种基于变量和代码执行顺序的源代码混淆设备,如图5所示。
基于变量和代码执行顺序的源代码混淆设备可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上的处理器501和存储器502,存储器 502中可以存储有一个或一个以上存储应用程序或数据。其中,存储器502可以是短暂存储或持久存储。存储在存储器502的应用程序可以包括一个或一个以上模块(图示未示出),每个模块可以包括对基于变量和代码执行顺序的源代码混淆设备中的一系列计算机可执行指令。更进一步地,处理器501可以设置为与存储器502通信,在基于变量和代码执行顺序的源代码混淆设备上执行存储器502中的一系列计算机可执行指令。基于变量和代码执行顺序的源代码混淆设备还可以包括一个或一个以上电源503,一个或一个以上有线或无线网络接口504,一个或一个以上输入输出接口505,一个或一个以上键盘506等。
在一个具体的实施例中,基于变量和代码执行顺序的源代码混淆设备包括有存储器,以及一个或一个以上的程序,其中一个或者一个以上程序存储于存储器中,且一个或者一个以上程序可以包括一个或一个以上模块,且每个模块可以包括对基于变量和代码执行顺序的源代码混淆设备中的一系列计算机可执行指令,且经配置以由一个或者一个以上处理器执行该一个或者一个以上程序包含用于进行以下计算机可执行指令:
对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,目标变量为源代码中需要保护的变量;
基于源代码在编译或运行时的跳转逻辑,将源代码拆分成多个代码块;
基于跳转逻辑和各个代码块对应的代码块标记,对多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立表征多个代码块执行顺序的跳转表,跳转表内存储有代码块标记和第二混淆处理后的代码块地址的映射关系;其中,代码块标记用于访问对应的代码块地址。
可选地,计算机可执行指令在被执行时,对目标应用程序的源代码中的目标变量进行第一混淆处理,包括:
确定源代码中的目标变量;
在源代码中插入中间变量组;其中,中间变量组用于访问目标变量;
根据中间变量组,对源代码中的部分目标变量进行第一混淆处理。
可选地,计算机可执行指令在被执行时,中间变量组为第一数组;
在源代码中插入中间变量组,包括:
在目标变量的前面某一位置处插入第一数组;
根据中间变量组,对源代码中的部分目标变量进行第一混淆处理,包括:
将源代码中的部分目标变量替换为第一数组的下溢出元素;
其中,下溢出元素的下标为第一数组中元素的最大下标与第一数值的和再加1,第一数值为第一数组与目标变量在内存中相隔的存储位置的数量。
可选地,计算机可执行指令在被执行时,中间变量组为第二数组;
在源代码中插入中间变量组,包括:
在目标变量的后面某一位置处插入第二数组;
根据中间变量组,对源代码中的部分目标变量进行第一混淆处理,包括:
将源代码中的部分目标变量替换为第二数组的上溢出元素;
其中,上溢出元素的下标为第二数组中元素的最小下标与第二数值的差再减1,第二数值为目标变量与第二数组在内存中相隔的存储位置的数量。
可选地,计算机可执行指令在被执行时,基于跳转逻辑和各个代码块对应的代码块标记,对多个代码块中的目标代码块的执行顺序进行第二混淆处理,包括:
确定目标代码块在源代码中的初始位置;
在源代码的预设位置插入目标代码块,其中,预设位置不同于初始位置;
将位于初始位置处的目标代码块替换为第一预设跳转语句和目标代码块对应的代码块标记;其中,第一预设跳转语句用于访问目标代码块对应的代码块标记;
确定第一代码块,其中,第一代码块为源代码在编译或运行时,执行完目标代码块后需要执行的代码块;
在插入预设位置处的目标代码块的结尾插入第二预设跳转语句和第一代码块对应的代码块标记;其中,第二预设跳转语句用于访问第一代码块对应的代码块标记。
可选地,计算机可执行指令在被执行时,上述方法还包括:
对上述跳转表进行加密。
可选地,计算机可执行指令在被执行时,上述方法还包括:
将加密后的跳转表和混淆后的源代码存储在不同的文件中。
本申请实施例提供的基于变量和代码执行顺序的源代码混淆设备,对源代码中的目标变量和目标代码块的执行顺序均进行混淆处理,从而达到模糊、混淆源代码中的目标变量、隐藏源代码的执行顺序的目的,进而可以提高源代码的防逆向分析能力,提高了应用程序中信息的安全性。
进一步地,基于上述图1至图3所示的方法,本申请实施例还提供了一种存储介质,用于存储计算机可执行指令,一种具体的实施例中,该存储介质可以为U盘、光盘、硬盘等,该存储介质存储的计算机可执行指令在被处理器执行时,能实现以下流程:
对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,目标变量为源代码中需要保护的变量;
基于源代码在编译或运行时的跳转逻辑,将源代码拆分成多个代码块;
基于跳转逻辑和各个代码块对应的代码块标记,对多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立表征多个代码块执行顺序的跳转表,跳转表内存储有代码块标记和第二混淆处理后的代码块地址的映射关系;其中,代码块标记用于访问对应的代码块地址。
可选地,该存储介质存储的计算机可执行指令在被处理器执行时,对目标应用程序的源代码中的目标变量进行第一混淆处理,包括:
确定源代码中的目标变量;
在源代码中插入中间变量组;其中,中间变量组用于访问目标变量;
根据中间变量组,对源代码中的部分目标变量进行第一混淆处理。
可选地,该存储介质存储的计算机可执行指令在被处理器执行时,中间变量组为第一数组;
在源代码中插入中间变量组,包括:
在目标变量的前面某一位置处插入第一数组;
根据中间变量组,对源代码中的部分目标变量进行第一混淆处理,包括:
将源代码中的部分目标变量替换为第一数组的下溢出元素;
其中,下溢出元素的下标为第一数组中元素的最大下标与第一数值的和再加1,第一数值为第一数组与目标变量在内存中相隔的存储位置的数量。
可选地,该存储介质存储的计算机可执行指令在被处理器执行时,中间变量组为第二数组;
在源代码中插入中间变量组,包括:
在目标变量的后面某一位置处插入第二数组;
根据中间变量组,对源代码中的部分目标变量进行第一混淆处理,包括:
将源代码中的部分目标变量替换为第二数组的上溢出元素;
其中,上溢出元素的下标为第二数组中元素的最小下标与第二数值的差再减1,第二数值为目标变量与第二数组在内存中相隔的存储位置的数量。
可选地,该存储介质存储的计算机可执行指令在被处理器执行时,基于跳转逻辑和各个代码块对应的代码块标记,对多个代码块中的目标代码块的执行顺序进行第二混淆处理,包括:
确定目标代码块在源代码中的初始位置;
在源代码的预设位置插入目标代码块,其中,预设位置不同于初始位置;
将位于初始位置处的目标代码块替换为第一预设跳转语句和目标代码块对应的代码块标记;其中,第一预设跳转语句用于访问目标代码块对应的代码块标记;
确定第一代码块,其中,第一代码块为源代码在编译或运行时,执行完目标代码块后需要执行的代码块;
在插入预设位置处的目标代码块的结尾插入第二预设跳转语句和第一代码块对应的代码块标记;其中,第二预设跳转语句用于访问第一代码块对应的代码块标记。
可选地,该存储介质存储的计算机可执行指令在被处理器执行时,上述方法还包括:
对上述跳转表进行加密。
可选地,该存储介质存储的计算机可执行指令在被处理器执行时,上述方法还包括:
将加密后的跳转表和混淆后的源代码存储在不同的文件中。
本申请实施例提供的存储介质中存储的计算机可执行指令在被执行时,对源代码中的目标变量和目标代码块的执行顺序均进行混淆处理,从而达到模糊、混淆源代码中的目标变量、隐藏源代码的执行顺序的目的,进而可以提高源代码的防逆向分析能力,提高了应用程序中信息的安全性。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray, FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、 Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL (Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL (RubyHardware Description Language)等,目前最普遍使用的是VHDL (Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、 CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和 /或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/ 或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器 (RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存 (PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器 (CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。
Claims (7)
1.一种基于变量和代码执行顺序的源代码混淆方法,其特征在于,所述方法包括:
对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,所述目标变量为所述源代码中需要保护的变量;
基于所述源代码在编译或运行时的跳转逻辑,将所述源代码拆分成多个代码块;
基于所述跳转逻辑和各个代码块对应的代码块标记,对所述多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立表征多个代码块执行顺序的跳转表,所述跳转表内存储有所述代码块标记和第二混淆处理后的代码块地址的映射关系;其中,所述代码块标记用于访问对应的代码块地址;
其中,所述对目标应用程序的源代码中的目标变量进行第一混淆处理,包括:确定所述源代码中的目标变量;在所述源代码中插入中间变量组;其中,所述中间变量组用于访问所述目标变量;根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理;
其中,所述中间变量组包括第一数组或第二数组,在所述中间变量组为第一数组时,所述在所述源代码中插入中间变量组,包括:在所述目标变量的前面某一位置处插入第一数组;所述根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理,包括:将所述源代码中的部分目标变量替换为所述第一数组的下溢出元素;其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;
在所述中间变量组为第二数组时,所述在所述源代码中插入中间变量组,包括:在所述目标变量的后面某一位置处插入第二数组;所述根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理,包括:将所述源代码中的部分目标变量替换为所述第二数组的上溢出元素;其中,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。
2.根据权利要求1所述的方法,其特征在于,所述基于所述跳转逻辑和各个代码块对应的代码块标记,对所述多个代码块中的目标代码块的执行顺序进行第二混淆处理,包括:
确定所述目标代码块在所述源代码中的初始位置;
在所述源代码的预设位置插入所述目标代码块,其中,所述预设位置不同于所述初始位置;
将位于所述初始位置处的目标代码块替换为第一预设跳转语句和目标代码块对应的代码块标记;其中,所述第一预设跳转语句用于访问所述目标代码块对应的代码块标记;
确定第一代码块,其中,所述第一代码块为所述源代码在编译或运行时,执行完所述目标代码块后需要执行的代码块;
在插入所述预设位置处的目标代码块的结尾插入第二预设跳转语句和所述第一代码块对应的代码块标记;其中,所述第二预设跳转语句用于访问所述第一代码块对应的代码块标记。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:
对所述跳转表进行加密。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
将加密后的跳转表和混淆后的源代码存储在不同的文件中。
5.一种基于变量和代码执行顺序的源代码混淆装置,其特征在于,所述装置包括:
第一处理模块,用于对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,所述目标变量为所述源代码中需要保护的变量;
拆分模块,用于基于所述源代码在编译或运行时的跳转逻辑,将所述源代码拆分成多个代码块;
第二处理模块,用于基于所述跳转逻辑和各个代码块对应的代码块标记,对所述多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立模块,用于建立表征多个代码块执行顺序的跳转表,所述跳转表内存储有所述代码块标记和第二混淆处理后的代码块地址的映射关系;其中,所述代码块标记用于访问对应的代码块地址;
其中,所述对目标应用程序的源代码中的目标变量进行第一混淆处理,包括:确定所述源代码中的目标变量;在所述源代码中插入中间变量组;其中,所述中间变量组用于访问所述目标变量;根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理;
其中,所述中间变量组包括第一数组或第二数组,在所述中间变量组为第一数组时,所述在所述源代码中插入中间变量组,包括:在所述目标变量的前面某一位置处插入第一数组;所述根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理,包括:将所述源代码中的部分目标变量替换为所述第一数组的下溢出元素;其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;
在所述中间变量组为第二数组时,所述在所述源代码中插入中间变量组,包括:在所述目标变量的后面某一位置处插入第二数组;所述根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理,包括:将所述源代码中的部分目标变量替换为所述第二数组的上溢出元素;其中,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。
6.一种基于变量和代码执行顺序的源代码混淆设备,其特征在于,包括:
处理器;以及
被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:
对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,所述目标变量为所述源代码中需要保护的变量;
基于所述源代码在编译或运行时的跳转逻辑,将所述源代码拆分成多个代码块;
基于所述跳转逻辑和各个代码块对应的代码块标记,对所述多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立表征多个代码块执行顺序的跳转表,所述跳转表内存储有所述代码块标记和第二混淆处理后的代码块地址的映射关系;其中,所述代码块标记用于访问对应的代码块地址;
其中,所述对目标应用程序的源代码中的目标变量进行第一混淆处理,包括:确定所述源代码中的目标变量;在所述源代码中插入中间变量组;其中,所述中间变量组用于访问所述目标变量;根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理;
其中,所述中间变量组包括第一数组或第二数组,在所述中间变量组为第一数组时,所述在所述源代码中插入中间变量组,包括:在所述目标变量的前面某一位置处插入第一数组;所述根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理,包括:将所述源代码中的部分目标变量替换为所述第一数组的下溢出元素;其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;
在所述中间变量组为第二数组时,所述在所述源代码中插入中间变量组,包括:在所述目标变量的后面某一位置处插入第二数组;所述根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理,包括:将所述源代码中的部分目标变量替换为所述第二数组的上溢出元素;其中,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。
7.一种存储介质,用于存储计算机可执行指令,其特征在于,所述可执行指令在被执行时实现以下流程:
对目标应用程序的源代码中的目标变量进行第一混淆处理,其中,所述目标变量为所述源代码中需要保护的变量;
基于所述源代码在编译或运行时的跳转逻辑,将所述源代码拆分成多个代码块;
基于所述跳转逻辑和各个代码块对应的代码块标记,对所述多个代码块中的目标代码块的执行顺序进行第二混淆处理;并
建立表征多个代码块执行顺序的跳转表,所述跳转表内存储有所述代码块标记和第二混淆处理后的代码块地址的映射关系;其中,所述代码块标记用于访问对应的代码块地址;
其中,所述对目标应用程序的源代码中的目标变量进行第一混淆处理,包括:确定所述源代码中的目标变量;在所述源代码中插入中间变量组;其中,所述中间变量组用于访问所述目标变量;根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理;
其中,所述中间变量组包括第一数组或第二数组,在所述中间变量组为第一数组时,所述在所述源代码中插入中间变量组,包括:在所述目标变量的前面某一位置处插入第一数组;所述根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理,包括:将所述源代码中的部分目标变量替换为所述第一数组的下溢出元素;其中,所述下溢出元素的下标为所述第一数组中元素的最大下标与第一数值的和再加1,所述第一数值为所述第一数组与所述目标变量在内存中相隔的存储位置的数量;
在所述中间变量组为第二数组时,所述在所述源代码中插入中间变量组,包括:在所述目标变量的后面某一位置处插入第二数组;所述根据所述中间变量组,对所述源代码中的部分目标变量进行第一混淆处理,包括:将所述源代码中的部分目标变量替换为所述第二数组的上溢出元素;其中,所述上溢出元素的下标为所述第二数组中元素的最小下标与第二数值的差再减1,所述第二数值为所述目标变量与所述第二数组在内存中相隔的存储位置的数量。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810146581.8A CN108537012B (zh) | 2018-02-12 | 2018-02-12 | 基于变量和代码执行顺序的源代码混淆方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810146581.8A CN108537012B (zh) | 2018-02-12 | 2018-02-12 | 基于变量和代码执行顺序的源代码混淆方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108537012A CN108537012A (zh) | 2018-09-14 |
CN108537012B true CN108537012B (zh) | 2021-11-16 |
Family
ID=63486031
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810146581.8A Active CN108537012B (zh) | 2018-02-12 | 2018-02-12 | 基于变量和代码执行顺序的源代码混淆方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108537012B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110309629B (zh) * | 2019-06-18 | 2023-10-10 | 创新先进技术有限公司 | 一种网页代码加固方法、装置及设备 |
CN112541188B (zh) * | 2019-09-20 | 2022-05-13 | 武汉斗鱼网络科技有限公司 | 阻止应用程序代码被静态分析的方法及装置 |
CN111339503B (zh) * | 2020-02-25 | 2023-01-03 | Oppo广东移动通信有限公司 | 控制流混淆方法及相关产品 |
CN111488602A (zh) * | 2020-04-16 | 2020-08-04 | 支付宝(杭州)信息技术有限公司 | 数据对象的隐私保护方法、装置及电子设备 |
CN112115427B (zh) * | 2020-08-14 | 2024-05-31 | 咪咕文化科技有限公司 | 代码混淆方法、装置、电子设备及存储介质 |
CN114662063B (zh) * | 2022-04-22 | 2024-06-25 | 苏州浪潮智能科技有限公司 | 一种混淆代码的方法、装置以及介质 |
CN118689481A (zh) * | 2023-03-23 | 2024-09-24 | 华为技术有限公司 | 一种代码处理方法及装置 |
CN117436040B (zh) * | 2023-12-18 | 2024-04-12 | 常熟理工学院 | 基于不透明谓词的代码混淆方法、系统及存储介质 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103413073A (zh) * | 2013-07-09 | 2013-11-27 | 北京深思数盾科技有限公司 | 一种保护java可执行程序的方法及设备 |
CN103544414A (zh) * | 2013-10-25 | 2014-01-29 | 苏州通付盾信息技术有限公司 | 一种Android系统应用的深度代码混淆方法 |
CN103902858A (zh) * | 2013-12-25 | 2014-07-02 | 武汉安天信息技术有限责任公司 | 一种apk应用加固的方法及系统 |
CN104834837A (zh) * | 2015-04-03 | 2015-08-12 | 西北大学 | 一种基于语义的二进制代码反混淆方法 |
CN105103127A (zh) * | 2013-02-28 | 2015-11-25 | 微软技术许可有限责任公司 | 基于编译器的混淆 |
CN106326694A (zh) * | 2016-08-30 | 2017-01-11 | 北京鼎源科技有限公司 | 一种基于C源代码的混淆的Android应用加固方法 |
CN106529225A (zh) * | 2016-10-27 | 2017-03-22 | 努比亚技术有限公司 | 一种应用程序源代码保护装置及方法 |
CN107341374A (zh) * | 2017-07-17 | 2017-11-10 | 广东工业大学 | 一种不透明谓词的插入方法及装置 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2405958A (en) * | 2003-08-20 | 2005-03-16 | Macrovision Europ Ltd | Code obfuscation and controlling a processor by emulation |
US8645930B2 (en) * | 2010-01-04 | 2014-02-04 | Apple Inc. | System and method for obfuscation by common function and common function prototype |
US8775826B2 (en) * | 2011-02-09 | 2014-07-08 | Apple Inc. | Counteracting memory tracing on computing systems by code obfuscation |
US8661549B2 (en) * | 2012-03-02 | 2014-02-25 | Apple Inc. | Method and apparatus for obfuscating program source codes |
CN103902857B (zh) * | 2012-12-25 | 2017-11-14 | 深圳市腾讯计算机系统有限公司 | 一种软件程序的保护方法和装置 |
WO2016094840A2 (en) * | 2014-12-11 | 2016-06-16 | Ghosh Sudeep | System, method & computer readable medium for software protection via composable process-level virtual machines |
US10594705B2 (en) * | 2015-10-06 | 2020-03-17 | Shouhuai Xu | Systems and methods for instructions-based detection of sophisticated obfuscation and packing |
CN107038354A (zh) * | 2016-02-03 | 2017-08-11 | 阿里巴巴集团控股有限公司 | 代码混淆方法、代码运行方法及装置 |
CN105787305B (zh) * | 2016-02-26 | 2018-08-10 | 西北大学 | 一种抵抗符号执行和污点分析的软件保护方法 |
CN107229848A (zh) * | 2017-06-12 | 2017-10-03 | 北京洋浦伟业科技发展有限公司 | 一种代码加固方法和装置 |
-
2018
- 2018-02-12 CN CN201810146581.8A patent/CN108537012B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105103127A (zh) * | 2013-02-28 | 2015-11-25 | 微软技术许可有限责任公司 | 基于编译器的混淆 |
CN103413073A (zh) * | 2013-07-09 | 2013-11-27 | 北京深思数盾科技有限公司 | 一种保护java可执行程序的方法及设备 |
CN103544414A (zh) * | 2013-10-25 | 2014-01-29 | 苏州通付盾信息技术有限公司 | 一种Android系统应用的深度代码混淆方法 |
CN103902858A (zh) * | 2013-12-25 | 2014-07-02 | 武汉安天信息技术有限责任公司 | 一种apk应用加固的方法及系统 |
CN104834837A (zh) * | 2015-04-03 | 2015-08-12 | 西北大学 | 一种基于语义的二进制代码反混淆方法 |
CN106326694A (zh) * | 2016-08-30 | 2017-01-11 | 北京鼎源科技有限公司 | 一种基于C源代码的混淆的Android应用加固方法 |
CN106529225A (zh) * | 2016-10-27 | 2017-03-22 | 努比亚技术有限公司 | 一种应用程序源代码保护装置及方法 |
CN107341374A (zh) * | 2017-07-17 | 2017-11-10 | 广东工业大学 | 一种不透明谓词的插入方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN108537012A (zh) | 2018-09-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108537012B (zh) | 基于变量和代码执行顺序的源代码混淆方法及装置 | |
CN109478217B (zh) | 使用基于偏移的虚拟地址映射对目标应用功能的基于内核的检测 | |
CN108595921B (zh) | 一种源代码中字符串的混淆方法和装置 | |
US8589897B2 (en) | System and method for branch extraction obfuscation | |
JP7154365B2 (ja) | ソフトウェアコードをセキュアにするための方法 | |
CN105117621B (zh) | 代码混淆的控制流平展化 | |
US8429637B2 (en) | System and method for conditional expansion obfuscation | |
CN108509772B (zh) | 基于执行顺序和单点逻辑的源代码加固方法及装置 | |
KR101861341B1 (ko) | 애플리케이션 코드의 역난독화 장치 및 이를 이용한 애플리케이션 코드의 역난독화 방법 | |
CN107632832B (zh) | 一种面向dalvik字节码控制流混淆方法 | |
US12086278B2 (en) | Method of encoding and decoding memory data for software security, recording medium and apparatus for performing the method | |
CN103927164B (zh) | 一种脚本混淆方法及系统 | |
CN105930694A (zh) | 用于模糊虚拟机的灵活指令集 | |
EP2937803B1 (en) | Control flow flattening for code obfuscation where the next block calculation needs run-time information | |
CN108446538B (zh) | 基于状态、符号执行和单点逻辑的源代码加固方法及装置 | |
EP2856378B1 (en) | Method, system and device for protection against reverse engineering and/or tampering with programs | |
CN108460253B (zh) | 基于顺序、符号执行和单点逻辑的源代码加固方法及装置 | |
US11256786B2 (en) | Method to secure a software code | |
CN108446536B (zh) | 一种基于符号执行和单点逻辑的源代码加固方法及装置 | |
CN108446542B (zh) | 一种基于符号执行的源代码混淆方法及装置 | |
CN112199731A (zh) | 一种数据处理方法、装置及设备 | |
US9547758B2 (en) | Program cable obfuscation based upon recently executed program code | |
CN108446541B (zh) | 基于有限状态机和符号执行的源代码加固方法及装置 | |
Balachandran et al. | Return oriented obfuscation | |
CN112528282B (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 |