CN113031930B - 一种控制流平坦化的源代码混淆生成方法及装置 - Google Patents
一种控制流平坦化的源代码混淆生成方法及装置 Download PDFInfo
- Publication number
- CN113031930B CN113031930B CN201911347739.9A CN201911347739A CN113031930B CN 113031930 B CN113031930 B CN 113031930B CN 201911347739 A CN201911347739 A CN 201911347739A CN 113031930 B CN113031930 B CN 113031930B
- Authority
- CN
- China
- Prior art keywords
- statement
- dimension
- generating
- compound
- nodes
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
Abstract
本发明涉及Web源代码技术领域,具体涉及一种控制流平坦化的源代码混淆生成方法及装置,通过将源代码中函数所包含的复合语句进行分割,并把分割好的语句保存在中间语句块缓存中,然后在语句块缓存的基础上按照语句块数量进一步的划分,把语句块缓存按照一定的层次结构切分成多个小的语句块缓存,最后用多个switch语句多维嵌套的方式把多个小的语句块缓存中的语句按原有的代码执行路径生成平坦化代码。本发明创新性地提出了使用中间语句块缓存保存复合语句分割后的基本语句,将平坦化算法和抽象语法树中的细节进行隔离,降低了实现平坦化功能代码的复杂性,生成多层级的平坦化代码,能够完全的打乱原有代码的执行路径,有效的提高了代码的安全性。
Description
技术领域
本发明涉及web开发技术领域,具体涉及一种控制流平坦化的源代码混淆生成方法及装置。
背景技术
在实际的Web应用中,开发者编写的javascript(后面简称JS)代码会以源码的形式加载到用户浏览器中运行,这意味着用户具有访问和修改本地JS源码的权限。因此在一些数据敏感的Web应用场景下JS的源码安全就显得尤为重要。
目前比较有效的保护手段是对JS源代码做混淆处理,以保护代码的真实逻辑信息不被人窃取。业界的JS混淆方案中最常用的手段之一就是控制流平坦化技术,它把易读的代码转换成一种离散的复杂结构,可以有效的隐藏JS代码的原始执行流程。目前已公开的JS控制流平坦化技术都是基于抽象语法树把函数中的复合语句分割成最基本的语句块,然后用一个switch控制语句把切分好的语句块按原有的代码执行路径生成控制流平坦化代码。
但是使用该方案时,用switch控制语句实现的平坦化结构是一维的,攻击者利用浏览器的动态调试功能很容易就能逆向出代码的真正执行路径。因此,目前亟需一种安全高效的源代码混淆处理方法。
发明内容
本发明的目的是提供一种控制流平坦化的源代码混淆生成方法及装置,以解决目前web开发中源代码容易被攻击、存在安全隐患的问题。
本发明实施例提供了以下方案:
第一方面,本发明实施例提供一种控制流平坦化的源代码混淆生成方法,包括:
依据源代码生成抽象语法树;
判断所述抽象语法树的当前节点是否为一个复合语句;
若是,则对所述复合语句进行语句分割;
对所述语句分割后的复合语句进行三维控制平坦化处理,确定每一维度中的节点数量;其中,所述每一维度包括第一维度;
依据第二维度中的节点生成第一选择判断语句;
依据第一维度中的节点数量对所述第一选择判断语句进行分组;
将每组所述第一选择判断语句生成相对应的第二选择判断语句;
依据所述语句分割后的复合语句以及所述第二选择判断语句生成第三选择判断语句;
生成循环语句,并将所述第三选择判断语句加到所述循环语句中生成三维控制流平坦化代码。
在一种可能的实施例中,所述对复合语句进行语句分割具体包括:
依据所述复合语句的类型确定对应的语句块分割器;
利用所述语句块分割器将对应的复合语句划分为基本语句;
将所述基本语句缓存到语句块中;
将所述语句块保存至全局语句块缓存中。
在一种可能的实施例中,所述三维控制平坦化处理具体包括:
对所述全局语句块缓存的原始索引列表进行乱序处理;
依据所述原始索引列表与所述乱序处理后的原始索引列表的映射关系排列对应节点的顺序;
依据所述节点的顺序更新所述节点的当前语句节点编号、后续语句节点编号以及条件后续节点编号;
依据所述全局语句块缓存中语句块的数量确定每一维度中节点的个数。
在一种可能的实施例中,所述将基本语句缓存到语句块中具体包括:
判断所述全局语句块缓存中是否包含所述复合语句的语句块;
如果包含则用所述复合语句的语句块替换所述全局语句块缓存中原有的语句块;
如果不包含则以所述复合语句的节点在所在函数中的深度为key,将所述语句块保存至全局语句块缓存中。
在一种可能的实施例中,所述确定每一维度中节点的个数具体包括:
将所述全局语句块缓存中的变量定义和返回语句保存到第一列表中,其他语句保存到第二列表中;
计算每一维度中选择判断语句的最大个数,所述最大个数即为第二维度节点的个数;
根据所述第二列表长度和所述最大个数计算得到第一维度节点的个数;
根据所述第二列表长度、所述最大个数以及所述第二列表节点分组后的余数计算得到第零维度节点的个数。
在一种可能的实施例中,所述将对应的复合语句划分为基本语句具体包括:
所述语句块分割器按照语句执行顺序将对应的复合语句划分为五元组基本块;
所述五元组基本块包括语句节点编号、后续语句节点编号、语句节点、条件后续节点编号和测试语句节点。
在一种可能的实施例中,所述生成三维控制流平坦化代码具体包括:
生成循环语句;
将所述全局语句块缓存中的变量定义和返回语句以及所述第二选择判断语句进行分组;
依据分组的结果生成所述第三选择判断语句。
第二方面,本发明实施例提供一种控制流平坦化的源代码混淆生成装置,包括:
抽象语法树生成模块,用于依据源代码生成抽象语法树;
第一判断模块,用于判断所述抽象语法树的当前节点是否为一个复合语句;
语句分割模块,用于当所述抽象语法树的当前节点是否为一个复合语句时对所述复合语句进行语句分割;
三维控制平坦化处理模块,用于对所述语句分割后的复合语句进行三维控制平坦化处理,确定每一维度中节点的个数;
第一选择判断语句生成模块,用于依据第二维度中的节点生成第一选择判断语句;
第一分组模块,用于依据第一维度中的节点数量对所述第一选择判断语句进行分组;
第二选择判断语句生成模块,用于根据每组所述第一选择判断语句对应生成第二选择判断语句;
循环语句生成模块,用于生成循环语句;
第三选择判断语句生成模块,用于依据所述语句分割后的复合语句以及所述第二选择判断语句生成第三选择判断语句;
三维控制流平坦化代码生成模块,用于将所述第三选择判断语句加到所述循环语句中生成三维控制流平坦化代码。
第三方面,本发明实施例提供一种控制流平坦化的源代码混淆生成设备,包括:
存储器,用于存储计算机程序;
处理器,用于执行该计算机程序以实现如上述第一方面任意一项所述的源代码混淆生成方法的步骤。
第四方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时以实现如上述第一方面任意一项所述的源代码混淆生成方法的步骤。
本发明与现有技术相比,具有如下的优点和有益效果:
本发明将源代码中函数所包含的复合语句进行彻底的分割,并把分割好的语句保存在中间语句块缓存中,然后在语句块缓存的基础上按照语句块数量进一步的划分,把语句块缓存按照一定的层次结构切分成多个小的语句块缓存,最后用多个选择判断语句多维嵌套的方式把多个小的语句块缓存中的语句按原有的代码执行路径生成平坦化代码。本发明的方法创新性地提出了使用中间语句块缓存保存复合语句分割后的基本语句,将平坦化算法和抽象语法树中的细节进行隔离,生成多维的平坦化代码,能够完全的打乱原有代码的执行路径,有效的提高了代码的安全性。
附图说明
为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种控制流平坦化的源代码混淆生成方法的流程图;
图2是本发明实施例提供的一种控制流平坦化的源代码混淆生成方法中预处理的流程图;
图3是本发明实施例提供的一种控制流平坦化的源代码混淆生成方法中语句块分割的流程图;
图4是本发明实施例提供的一种控制流平坦化的源代码混淆生成方法中for语句分割示意图;
图5是本发明实施例提供的一种控制流平坦化的源代码混淆生成方法中if语句分割示意图;
图6是本发明实施例提供的一种控制流平坦化的源代码混淆生成方法中while语句分割示意图;
图7是本发明实施例提供的一种控制流平坦化的源代码混淆生成方法中function语句分割示意图;
图8是本发明实施例提供的一种控制流平坦化的源代码混淆生成装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例,基于本发明实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明实施例保护的范围。
本发明实施例提供一种控制流平坦化的源代码混淆生成方法,该方法将JS(javascript)源代码每个函数中的复合语句彻底地分割成基本语句(不可分割的最小语句单位)保存到内存的缓冲区中,然后使用switch语句以多维嵌套的方式把基本语句组织起来生成具有多维平坦化功能的源码。请参阅图1,具体的实现流程可以分为预处理、语句分割、控制流平坦化、代码生成4个过程,每个步骤包括:
步骤11,依据源代码生成抽象语法树;
步骤12,判断所述抽象语法树的当前节点是否为一个复合语句;
步骤13,若是,则对所述复合语句进行语句分割;
步骤11至步骤13的作用是对源代码进行预处理,生成抽象语法树并判断当前节点是否为复合语句,从而确定是否进入语句分割过程,本步骤能够实现对源代码进行预处理以便后续步骤的使用,同时也是进入语句分割过程的判断条件。
具体的,使用fs模块的readFileSync方法读取一个JS源文件到内存中,使用espree模块的parse方法对读取的JS源码进行词法、语法、语义分析生成抽象语法树,使用estraverse模块的replace方法遍历生成的抽象语法树,在遍历过程中,如果当前节点是一个复合语句则进入语句分割过程,如果是最后一个节点则结束遍历。
具体的,依据所述复合语句的类型确定对应的语句块分割器;利用所述语句块分割器将对应的复合语句划分为基本语句;将所述基本语句缓存到语句块中;将所述语句块保存至全局语句块缓存中。
更具体的,判断所述全局语句块缓存中是否包含所述复合语句的语句块;
如果包含则用所述复合语句的语句块替换所述全局语句块缓存中原有的语句块;如果不包含则以所述复合语句的节点在所在函数中的深度为key,将所述语句块保存至全局语句块缓存中。
进一步的,所述语句块分割器按照语句执行顺序将对应的复合语句划分为五元组基本块;所述五元组基本块包括语句节点编号、后续语句节点编号、语句节点、条件后续节点编号和测试语句节点。
把复合语句的深度作为key,分割好的基本块五元组为value按照正确的语法作用域保存到全局基本块缓存map中。
需要说明的是,现有技术中在对源代码进行混淆处理时,利用选择判断语句实现平坦化结构通常是一维的,这样就使得攻击者利用浏览器的动态调试功能很容易就能逆向出源代码的真正执行路径,而本发明实施例的该步骤通过将分割后的复合语句划分为五元组基本块,能够生成多维度的平坦化代码,从而能够完全的打乱原有代码的执行路径,继而防止了现有技术中利用浏览器的动态调试功就能很容易逆向出源代码的真正执行路径,有效的提高了代码的安全性。
本步骤的作用是将复合语句分割为基本语句,并创新性地提出了使用中间语句块缓存保存复合语句分割后的基本语句,为下一步进行多维控制平坦化奠定了基础。
步骤14,对所述语句分割后的复合语句进行三维控制平坦化处理,确定每一维度中的节点数量。
其中,所述每一维度包括第一维度。
本步骤的作用是在语句块缓存的基础上按照语句块数量进一步的划分,把语句块缓存按照一定的层次结构切分成多个小的语句块缓存,将平坦化算法和抽象语法树中的细节进行隔离,生成多维的平坦化代码,能够完全的打乱原有代码的执行路径,有效的提高了代码的安全性。
具体的,对所述全局语句块缓存的原始索引列表进行乱序处理;
依据所述原始索引列表与所述乱序处理后的原始索引列表的映射关系排列对应节点的顺序;
依据所述节点的顺序更新所述节点的当前语句节点编号、后续语句节点编号以及条件后续节点编号;
依据所述全局语句块缓存中语句块的数量确定每一维度中节点的个数。
更具体的,将所述全局语句块缓存中的变量定义和返回语句保存到第一列表中,其他语句保存到第二列表中;
计算每一维度中选择判断语句的最大个数,所述最大个数即为第二维度节点的个数;
根据所述第二列表长度和所述最大个数计算得到第一维度节点的个数;
根据所述第二列表长度、所述最大个数以及所述第二列表节点分组后的余数计算得到第零维度节点的个数。
在本步骤中,给出的具体实施方式中控制流平坦化为三维度,但本发明保护的技术方案不限于这里给出的三维度,在其他扩展实施方式中,可以根据实际需求改变维度的数量,其具体方案与这里给出的三维度的视线方式类同,均能够被本领域技术人员所实现,在此不予以赘述。在此基础上,本领域技术人员能够清楚理解本发明实施例的javascript混淆方法。
步骤15,依据第二维度中的节点生成第一选择判断语句。
步骤16,依据第一维度中的节点数量对所述第一选择判断语句进行分组。
步骤17,将每组所述第一选择判断语句生成相对应的第二选择判断语句。
步骤18,依据所述语句分割后的复合语句以及所述第二选择判断语句生成第三选择判断语句。
步骤19,生成循环语句,并将所述第三选择判断语句加到所述循环语句中生成三维控制流平坦化代码。
步骤15至步骤19,首先将javascript源代码中函数所包含的复合语句进行分割,并把分割好的语句保存在一个中间语句块缓存中,然后在中间语句块缓存的基础上按照语句块数量进一步的划分,之后将中间语句块缓存按照一定的层次结构切分成多个小的语句块缓存,最后用多个switch语句多维嵌套的方式把多个小的语句块缓存中的语句按原有的代码执行路径生成平坦化代码。
本方案创新性地提出了使用中间语句块缓存保存复合语句分割后的基本语句,将平坦化算法和javascript抽象语法树中的细节进行隔离,降低了实现平坦化功能代码的复杂性。本方案生成多层级的平坦化代码,能够完全的打乱原有代码的执行路径,有效的提高的代码的安全性。
具体的,生成循环语句;
将所述全局语句块缓存中的变量定义和返回语句以及所述第二选择判断语句进行分组;
依据分组的结果生成所述第三选择判断语句。
本步骤的作用是用多个选择判断语句多维嵌套的方式把多个小的语句块缓存中的语句按原有的代码执行路径生成平坦化代码,从而实现对源代码的混淆处理,实现对源代码的有效保护。
下面请参阅图2,图2为本发明实施例中一种控制流平坦化的源代码混淆生成方法中javascript源代码预处理的流程图,具体流程如下所示。
步骤1.1开始。
步骤1.2使用fs模块的readFileSync方法读取一个JS源文件到内存中。
步骤1.3和步骤1.4使用espree模块的parse方法对步骤1.2读取的JS源码进行词法、语法、语义分析生成抽象语法树。
步骤1.5使用estraverse模块的replace方法遍历步骤1.4中生成的抽象语法树。在访问节点退出时语句块分割的过程是对遍历的方式是在访问过程中的访问对象访问者退出的时候作为访问节点的时机。
步骤1.6在遍历过程中,判断当前节点是否是复合语句,如果是则进入步骤1.7,否则进入步骤1.8。
步骤1.7对当前节点的复合语句进行语句分割处理。
步骤1.8如果是最后一个节点则结束遍历。
下面请参阅图3,图3为本发明实施例中一种控制流平坦化的源代码混淆生成方法中语句块分割的流程图,该过程的目的是把函数内的复合语句分割成五元组列表,具体流程如下所示。
步骤2.1开始。
步骤2.2获取节点在当前函数中的层级深度L,用作后续保存到语句基本块缓存map中的key;
步骤2.3根据复合语句节点的类型获取语句块分割器,复合语句节点的类型包括for语句、if语句、while语句、switch语句以及function语句。
步骤2.4使用分割器把当前复合节点分割成多条基本语句缓存到一个语句块中。具体的,分割器的作用是把复合语句按照语句执行顺序切分成一个五元组,它的结构如表1所示。
表1
一个复合语句可以分解成一个五元组列表,它有一个入口和多个出口。列表的第0号素就是语句执行的入口,当列表中某个元素的rid或lId等于-1时则表示它是语句的出口。
步骤2.5判断全局语句块缓存Map中是否包含当前节点深度的语句块?如果是则进入步骤2.6,否则进入步骤2.7。
步骤2.6用当前节点语句块替换原有全局语句块缓存Map中的语句块,然后进入步骤。
步骤2.7以L为key,当前节点语句块为value保存到全局语句块缓存Map中。
步骤2.8判断当前节点类型是否为函数声明/函数表达式?如果是则结束语句块分割,如果不是则进入步骤2.9。
步骤2.9获取前节点层级深度对应的语句块,然后进入步骤2.10。
步骤2.10进行控制平坦化过程。
下面参考图4至图7,分别为不同复合语句转换成五元组基本块的的过程,包括:
for语句分割过程如图4所示:init语句是五元组列表的第0个元素,它的id是0,rid指向1,node是初始化语句。接下来是控制循环条件的test语句,它的语句保存在test字段中,lId值为-1表示test语句如果为false则退出当前语句块。然后顺序的切分body中所有的语句。最后是update语句,它的后续语句id指向test语句构成一个循环体。
if语句分割过程如图5所示,test语句是五元组列表的第0个元素,当test表达式为true时执行body1中的语句,test表达式为false执行body2中的语句。因此这里test的rid指向body1,lid指向body2。每个body的最后一个语句的rid指向-1表示五元组列表的出口。
while语句分割过程如图6所示,test语句是五元组列表的第0个元素,当test的rid指向body中的第1个语句。body中的最后一个语句rid为-1表示出口。
switch语句分割过程是先把switch转换成if语句,然后再分割成五元组列表。
function语句分割过程如图7所示,它的body第1个语句是语句块执行入口,最后一个语句是执行出口。
需要提醒的是,上述步骤13的处理过程中,提供了一套增量式加权算法能自动计算每个维度节点的个数,该算法能够在计算过程中对每一维度都进行详细分析,并充分考虑各个维度之间的相互影响,从而在计算节点数量时对这些影响进行考虑并加以运算,使计算得到的每一维度的节点数量更为准确,为最终的代码生成提供有效数据,具体的算法如下所示:
1)遍历基础块节点列表,将变量定义和return语句节点保存到dec列表中,其他的语句保存到sta列表中。分离语句的原因是变量定义和return语句只能放到最外层(第0层)switch语句的case中,否则代码无法正常执行。
2)计算每一维switch语句中case语句的最大个数levelBaseCaseNum。首先设定当前每一维中switch语句case节点的最小权值levelShift是2,节点基数为2。
可以得出以下结论:
levelBaseCaseNum=Math.pow(2,levelShift)
3)计算第0层中dec列表中语句所消耗的节点个数wasterNodeNum。
wasterNodeNum=dec.length*Math.pow(2,levelShift)
4)计算sta列表节点分组后的余数levelZeroResidue,计算公式如下:
levelZeroResidue=dec.length%levelBaseCaseNum
5)计算分组后节点最大个数nodeSumNum,计算公式如下:
nodeSumNum=Math.pow(levelBaseCaseNum,3)
6)计算第1层switch语句中case的个数levelOneCaseNum,计算公式如下:
levelOneCaseNum=Math.floor(sta.length/levelBaseCaseNum)
7)计算第0层switch语句中case的个数levelZeroCaseNum,计算公式如下:
levelZeroCaseNum=Math.ceil(levelOneCaseNum/levelBaseCaseNum)
8)定义levelShift的增量约束,条件如下:
sta.length<(nodeSunNum-wasteNodeNum)
dec.length<(levelBaseCaseNum–levelZeroCaseNum)
当不满足上述条件时,switch语句case节点的最小权值levelShift加1,并执行一次步骤3)和步骤4)更新levelBaseCaseNum和levelZeroRosidue的值。
9)定义节点分组完成的约束,条件如下:
(levelZeroResidue+dec.length+levelZeroCaseNum)<=levelBaseCaseNum
10)如果步骤8)中的约束条件满足,则循环执行步骤5)~步骤8),否则判断步骤9)约束条件,如果不满足,则levelZeroResidue的个数减一,并更新第0层消耗节点的个数wasteNodeNum,公式如下所示:
wasteNodeNum=(dec.length+levelZeroResidue)*Math.pow(levelBaseCaseNum,2)否则多维平坦化过程结束,第2层的节点个数levelTwoCaseNum的值为:
levelTowCaseNum=levelBaseCaseNum
第1层节点个数levelOneCaseNum的值为:
levelOneCaseNum=Math.floor(sta.length/levelBaseCaseNum)
第0层节点个数levelZeroCaseNum的值为:
levelZeroCaseNum=Math.ceil(Math.ceil((sta.length-levelZeroResidue)/
levelBaseCaseNum)/levelBaseCaseNum)
上述步骤15的处理过程中,在所述控制平坦化处理后,遍历第2维度中的节点,每组语句块生成一个switch语句,每个switch语句对应一个case块;根据第1维度中节点的数量对第2维度中的switch语句进行分组,每组switch语句对应生成一个新switch语句并对应一个新case块;生成for语句,将基本语句的分发器代码添加到所述for语句中;
将所述全局语句块缓存Map中的变量定义和return语句以及所述新switch语句进行分组,得到的每一个组作为一个case块放置到switch语句中;将得到的switch语句添加到所述for语句中生成三维控制流平坦化代码。
基于与方法同样的发明构思,本发明实施例提供一种控制流平坦化的源代码混淆生成装置。
请参阅图8,图8为本发明实施例提供的一种控制流平坦化的源代码混淆生成装置的结构示意图,包括:
抽象语法树生成模块21,用于依据源代码生成抽象语法树;
第一判断模块22,用于判断所述抽象语法树的当前节点是否为一个复合语句;
语句分割模块23,用于当所述抽象语法树的当前节点是否为一个复合语句时对所述复合语句进行语句分割;
三维控制平坦化处理模块24,用于对所述语句分割后的复合语句进行三维控制平坦化处理,确定每一维度中节点的个数;
第一选择判断语句生成模块25,用于依据第二维度中的节点生成第一选择判断语句;
第一分组模块26,用于依据第一维度中的节点数量对所述第一选择判断语句进行分组;
第二选择判断语句生成模块27,用于根据每组所述第一选择判断语句对应生成第二选择判断语句;
循环语句生成模块28,用于生成循环语句;
第三选择判断语句生成模块29,用于依据所述语句分割后的复合语句以及所述第二选择判断语句生成第三选择判断语句;
三维控制流平坦化代码生成模块210,用于将所述第三选择判断语句加到所述循环语句中生成三维控制流平坦化代码。
基于与前述实施例中同样的发明构思,本发明实施例还提供一种控制流平坦化的源代码混淆生成设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现前文任一所述方法的步骤。
基于与前述实施例中同样的发明构思,本发明实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前文任一所述方法的步骤。
本发明实施例中提供的技术方案,至少具有如下技术效果或优点:
本发明实施例将javascript源代码中函数所包含的while/for/switch/if等复合语句进行彻底的分割,并把分割好的语句保存在一个中间语句块缓存中,然后在语句块缓存的基础上按照语句块数量进一步的划分,把语句块缓存按照一定的层次结构切分成多个小的语句块缓存,最后用多个switch语句多维嵌套的方式把多个小的语句块缓存中的语句按原有的代码执行路径生成平坦化代码。
进一步的,本发明实施例创新性地提出了使用中间语句块缓存保存复合语句分割后的基本语句,将平坦化算法和javascript抽象语法树中的细节进行隔离,降低了实现平坦化功能代码的复杂性。
进一步的,本发明实施例生成多层级的平坦化代码,能够完全的打乱原有代码的执行路径,有效的提高的代码的安全性。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、装置(模块、系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。
Claims (10)
1.一种控制流平坦化的源代码混淆生成方法,其特征在于,所述方法包括:
依据源代码生成抽象语法树;
判断所述抽象语法树的当前节点是否为一个复合语句;
若是,则对所述复合语句进行语句分割;
对所述语句分割后的复合语句进行三维控制平坦化处理,确定每一维度中的节点数量;其中,所述每一维度包括第一维度;
依据第二维度中的节点生成第一选择判断语句;
通过计算每一维度中选择判断语句的最大个数,确定所述第二维度中的节点数量;将全局语句块缓存中的变量定义和返回语句保存到第一列表中,其他语句保存到第二列表中,并根据所述第二列表长度和所述最大个数计算得到第一维度节点的个数;
依据第一维度中的节点数量对所述第一选择判断语句进行分组;
将每组所述第一选择判断语句生成相对应的第二选择判断语句;
依据所述语句分割后的复合语句以及所述第二选择判断语句生成第三选择判断语句;
生成循环语句,并将所述第三选择判断语句加到所述循环语句中生成三维控制流平坦化代码。
2.根据权利要求1所述的源代码混淆生成方法,其特征在于,所述对复合语句进行语句分割具体包括:
依据所述复合语句的类型确定对应的语句块分割器;
利用所述语句块分割器将对应的复合语句划分为基本语句;
将所述基本语句缓存到语句块中;
将所述语句块保存至所述全局语句块缓存中。
3.根据权利要求2所述的源代码混淆生成方法,其特征在于,所述三维控制平坦化处理具体包括:
对所述全局语句块缓存的原始索引列表进行乱序处理;
依据所述原始索引列表与所述乱序处理后的原始索引列表的映射关系排列对应节点的顺序;
依据所述节点的顺序更新所述节点的当前语句节点编号、后续语句节点编号以及条件后续节点编号;
依据所述全局语句块缓存中语句块的数量确定每一维度中节点的个数。
4.根据权利要求2所述的源代码混淆生成方法,其特征在于,所述将基本语句缓存到语句块中具体包括:
判断所述全局语句块缓存中是否包含所述复合语句的语句块;
如果包含则用所述复合语句的语句块替换所述全局语句块缓存中原有的语句块;
如果不包含则以所述复合语句的节点在所在函数中的深度为key,将所述语句块保存至所述全局语句块缓存中。
5.根据权利要求3所述的源代码混淆生成方法,其特征在于,所述确定每一维度中节点的个数,还包括:
根据所述第二列表长度、所述最大个数以及所述第二列表节点分组后的余数计算得到第零维度节点的个数。
6.根据权利要求2所述的源代码混淆生成方法,其特征在于,所述将对应的复合语句划分为基本语句具体包括:
所述语句块分割器按照语句执行顺序将对应的复合语句划分为五元组基本块;
所述五元组基本块包括语句节点编号、后续语句节点编号、语句节点、条件后续节点编号和测试语句节点。
7.根据权利要求5所述的源代码混淆生成方法,其特征在于,所述生成三维控制流平坦化代码具体包括:
生成循环语句;
将所述全局语句块缓存中的变量定义和返回语句以及所述第二选择判断语句进行分组;
依据分组的结果生成所述第三选择判断语句。
8.一种控制流平坦化的源代码混淆生成装置,其特征在于,包括:
抽象语法树生成模块,用于依据源代码生成抽象语法树;
第一判断模块,用于判断所述抽象语法树的当前节点是否为一个复合语句;
语句分割模块,用于当所述抽象语法树的当前节点是否为一个复合语句时对所述复合语句进行语句分割;
三维控制平坦化处理模块,用于对所述语句分割后的复合语句进行三维控制平坦化处理,确定每一维度中节点的个数;其中,所述每一维度包括第一维度;
第一选择判断语句生成模块,用于依据第二维度中的节点生成第一选择判断语句;通过计算每一维度中选择判断语句的最大个数,确定所述第二维度中的节点数量;将全局语句块缓存中的变量定义和返回语句保存到第一列表中,其他语句保存到第二列表中,并根据所述第二列表长度和所述最大个数计算得到第一维度节点的个数;
第一分组模块,用于依据第一维度中的节点数量对所述第一选择判断语句进行分组;
第二选择判断语句生成模块,用于根据每组所述第一选择判断语句对应生成第二选择判断语句;
第三选择判断语句生成模块,用于依据所述语句分割后的复合语句以及所述第二选择判断语句生成第三选择判断语句;
循环语句生成模块,用于生成循环语句;
三维控制流平坦化代码生成模块,用于将所述第三选择判断语句加到所述循环语句中生成三维控制流平坦化代码。
9.一种控制流平坦化的源代码混淆生成设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序以实现权利要求1至7任一所述的方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时以实现权利要求1至7任一所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911347739.9A CN113031930B (zh) | 2019-12-24 | 2019-12-24 | 一种控制流平坦化的源代码混淆生成方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911347739.9A CN113031930B (zh) | 2019-12-24 | 2019-12-24 | 一种控制流平坦化的源代码混淆生成方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113031930A CN113031930A (zh) | 2021-06-25 |
CN113031930B true CN113031930B (zh) | 2022-07-05 |
Family
ID=76451740
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911347739.9A Active CN113031930B (zh) | 2019-12-24 | 2019-12-24 | 一种控制流平坦化的源代码混淆生成方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113031930B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113254068B (zh) * | 2021-07-14 | 2021-10-22 | 苏州浪潮智能科技有限公司 | 一种控制流平坦化自动检测方法、装置 |
CN116956245A (zh) * | 2023-09-19 | 2023-10-27 | 安徽大学 | 一种基于控制流平坦化混淆的软件水印实现方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016104918A1 (ko) * | 2014-12-24 | 2016-06-30 | 고려대학교 산학협력단 | 코드 변환 방법 및 코드 변환 장치 |
CN109992935A (zh) * | 2019-03-15 | 2019-07-09 | 同盾控股有限公司 | 一种源代码保护方法及装置 |
CN110413283A (zh) * | 2019-08-02 | 2019-11-05 | 北京智游网安科技有限公司 | 基于编译器前端的混淆方法、存储介质及终端设备 |
CN110569628A (zh) * | 2019-09-09 | 2019-12-13 | 北京智游网安科技有限公司 | 一种代码的混淆方法以及装置、计算机设备、存储介质 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1569104A3 (en) * | 2004-01-09 | 2006-05-03 | Interuniversitair Microelektronica Centrum Vzw | An automated method for performing parallelization of sequential code and a computerized system adapted therefore |
US8584109B2 (en) * | 2006-10-27 | 2013-11-12 | Microsoft Corporation | Virtualization for diversified tamper resistance |
US9182956B2 (en) * | 2012-07-08 | 2015-11-10 | International Business Machines Corporation | Flattening conditional statements |
IN2015DE01753A (zh) * | 2015-06-11 | 2015-08-28 | Pradeep Varma | |
WO2018050335A1 (en) * | 2016-09-15 | 2018-03-22 | Telefonaktiebolaget Lm Ericsson (Publ) | Efficient obfuscation of program control flow |
-
2019
- 2019-12-24 CN CN201911347739.9A patent/CN113031930B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2016104918A1 (ko) * | 2014-12-24 | 2016-06-30 | 고려대학교 산학협력단 | 코드 변환 방법 및 코드 변환 장치 |
CN109992935A (zh) * | 2019-03-15 | 2019-07-09 | 同盾控股有限公司 | 一种源代码保护方法及装置 |
CN110413283A (zh) * | 2019-08-02 | 2019-11-05 | 北京智游网安科技有限公司 | 基于编译器前端的混淆方法、存储介质及终端设备 |
CN110569628A (zh) * | 2019-09-09 | 2019-12-13 | 北京智游网安科技有限公司 | 一种代码的混淆方法以及装置、计算机设备、存储介质 |
Non-Patent Citations (5)
Title |
---|
Christian S. Collberg.Watermarking, Tamper-Proofing, and ObfuscationÐTools for Software Protection.《IEEE TRANSACTIONS ON SOFTWARE ENGINEERING》.2002, * |
Manufacturing Cheap, Resilient, and Stealthy Opaque Constructs;Christian Collberg;《ACM》;19981231;全文 * |
一种JAVA控制流混淆方案;葛华等;《湖北第二师范学院学报》;20170215(第02期);全文 * |
基于LLVM的Android应用代码保护技术研究与实现;赵奇;《中国优秀硕士学位论文全文数据库信息科技辑》;20181130;全文 * |
基于控制变换的代码混淆技术研究;王蕊;《中国优秀硕士学位论文全文数据库信息科技辑》;20140830;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN113031930A (zh) | 2021-06-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102193810B (zh) | 模块间内联候选标识 | |
US8751823B2 (en) | System and method for branch function based obfuscation | |
CN113031930B (zh) | 一种控制流平坦化的源代码混淆生成方法及装置 | |
JP6365858B2 (ja) | データベースの選択的なスナップショットを生成するためのシステムおよび方法 | |
CN104538024A (zh) | 语音合成方法、装置及设备 | |
CN105224452B (zh) | 一种针对科学计算程序静态分析性能的预测代价优化方法 | |
CN106611037A (zh) | 用于分布式图计算的方法与设备 | |
Ritchie et al. | C3: Lightweight incrementalized MCMC for probabilistic programs using continuations and callsite caching | |
KR20140014090A (ko) | 기민 통신 오퍼레이터 | |
US20110145799A1 (en) | Path-sensitive dataflow analysis including path refinement | |
US20110167407A1 (en) | System and method for software data reference obfuscation | |
EP2804099A1 (en) | Apparatus and method managing power based on data | |
Renz-Wieland et al. | Dynamic parameter allocation in parameter servers | |
CN103793653B (zh) | 一种基于树优化的程序依赖关系分析方法及系统 | |
EP2195738A2 (en) | Dynamic pointer disambiguation | |
US20210142197A1 (en) | Methods and systems for diverse instance generation in artificial intelligence planning | |
KR20210149393A (ko) | 조합 최적화를 위한 강화학습 모델의 학습 장치 및 방법 | |
Kelefouras et al. | A methodology for speeding up fast fourier transform focusing on memory architecture utilization | |
CN116339716A (zh) | 一种流程图的分析方法 | |
CN104516823B (zh) | 一种数据存储方法和装置 | |
CN114968325A (zh) | 代码注释的生成方法及装置、处理器和电子设备 | |
CN105242978B (zh) | 多线程条件下cpu高速缓存行失效的处理方法及装置 | |
US11372832B1 (en) | Efficient hashing of data objects | |
CN109002684B (zh) | 一种区间信息分析方法 | |
KR101382362B1 (ko) | 복수의 실행 유닛을 이용한 구문 분석 방법 및 구문 분석 장치 |
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 |