CN109948309A - 一种代码保护方法、装置、计算机设备和存储介质 - Google Patents
一种代码保护方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN109948309A CN109948309A CN201910212434.0A CN201910212434A CN109948309A CN 109948309 A CN109948309 A CN 109948309A CN 201910212434 A CN201910212434 A CN 201910212434A CN 109948309 A CN109948309 A CN 109948309A
- Authority
- CN
- China
- Prior art keywords
- code
- random number
- software
- predicate
- bit
- 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.)
- Pending
Links
Landscapes
- Storage Device Security (AREA)
Abstract
本发明适用于软件保护技术领域,尤其涉及一种代码保护方法、装置、计算机设备和存储介质。所述方法包括以下步骤:获取软件代码,确定所述软件代码中的变量依赖关系;将所述变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数;根据所述代码伪随机数构造不透明谓词,并将所述不透明谓词插入所述软件代码中,得到所述软件代码对应的软件混淆代码,以保护所述软件代码。本发明利用伪随机数生成算法构造出更复杂的不透明谓词,最后将不透明谓词安全地插入到软件代码中,进一步提高了代码混淆的强度,加强了代码保护的安全性。
Description
技术领域
本发明属于软件保护技术领域,尤其涉及一种代码保护方法、装置、计算机设备和存储介质。
背景技术
随着计算机技术和移动终端技术的迅速发展,软件开发者利用各种技术编写了各式各样功能的应用软件程序,给人们的工作和生活提供了大大的便利,人们对这些程序的依赖程度也越来越高。但与此同时,软件程序也容易遭受恶意攻击。攻击者通过对软件程序进行逆向分析、篡改和盗版,不仅损害了开发者的合法权益,还会严重危害用户的隐私和财产安全。因此为了抵抗恶意攻击,许多软件开发者利用代码混淆来保护软件代码。
目前,现有的代码混淆技术通常只是在保留软件程序原来功能的情况下,对软件程序代码进行一系列的修改和变换,安全性还不够高,攻击者可以利用许多逆向分析技术对混淆后的代码进行自动化分析,还原代码原始的控制逻辑,进而破解软件代码。
可见,现有技术中的代码混淆技术仅是对软件代码的简单的修改和变换,安全性能不足,无法满足日益提高的网络安全需求。
发明内容
本发明实施例的目的在于提供一种代码保护方法,旨在解决现有技术中的代码混淆技术仅是对软件代码的简单的修改和变换,安全性能不足,无法满足日益提高的网络安全需求的问题。
本发明实施例是这样实现的,一种代码保护方法,所述方法包括:
获取软件代码,确定所述软件代码中的变量依赖关系;
将所述变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数;
根据所述代码伪随机数构造不透明谓词,并将所述不透明谓词插入所述软件代码中,得到所述软件代码对应的软件混淆代码,以保护所述软件代码。
本发明实施例的另一目的在于提供一种代码保护装置,所述装置包括:
变量依赖关系分析模块,用于获取软件代码,确定所述软件代码中的变量依赖关系;
伪随机数生成模块,用于将所述变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数;
谓词插入模块,用于根据所述代码伪随机数构造不透明谓词,并将所述不透明谓词插入所述软件代码中,得到所述软件代码对应的软件混淆代码,以保护所述软件代码。
本发明实施例的另一目的在于提供一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行本发明实施例中所述代码保护方法的步骤。
本发明实施例的另一目的在于提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行本发明实施例中所述代码保护方法的步骤。
本发明利用软件代码的变量作为伪随机数生成算法的种子,在软件运行时驱动伪随机数生成算法产生伪随机数;再通过对伪随机数进行各种位操作,构造出更复杂的不透明谓词;最后将不透明谓词安全地插入到软件代码中,进一步提高了代码混淆的强度,加强了代码保护的安全性。
附图说明
图1为本发明实施例提供的代码保护方法的流程图;
图2为本发明实施例提供的选择伪随机数生成算法的流程图;
图3为本发明实施例提供的生成代码伪随机数的流程图;
图4为本发明实施例提供的构造不透明谓词的流程图;
图5为本发明实施例提供的选取不透明谓词插入位置的流程图;
图6为本发明另一实施例提供的代码克隆和变异的流程图;
图7为本发明实施例提供的代码保护装置的结构框图;
图8为本发明实施例提供的代码保护装置中伪随机数生成模块的结构框图;
图9为本发明实施例提供的代码保护装置中谓词插入模块的结构框图;
图10为本发明实施例提供的谓词插入模块中的谓词插入单元的结构框图;
图11为本发明另一实施例提供的谓词插入模块中的谓词插入单元的结构框图;
图12为一个实施例中计算机设备的内部结构框图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
可以理解,本申请所使用的术语“第一”、“第二”等可在本文中用于描述各种元件,但除非特别说明,这些元件不受这些术语限制。这些术语仅用于将第一个元件与另一个元件区分。举例来说,在不脱离本申请的范围的情况下,可以将第一xx脚本称为第二xx脚本,且类似地,可将第二xx脚本称为第一xx脚本。
在本发明实施例中,提供的代码保护方法可以应用于终端或计算机设备中。
终端可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。终端以及计算机设备可以通过网络进行连接,本发明在此不做限制。
计算机设备可以是独立的物理服务器或终端,也可以是多个物理服务器构成的服务器集群,可以是提供云服务器、云数据库、云存储和CDN等基础云计算服务的云服务器。
实施例一
如图1所示,在一个实施例中,提出了一种代码保护方法,本实施例主要以该方法应用于计算机设备来举例说明。一种代码保护方法,具体可以包括以下步骤:
步骤S101,获取软件代码,确定软件代码中的变量依赖关系。
在本发明实施例中,软件代码是程序员用开发工具所支持的语言写出来的源文件,属于一组有序的数字或字母的排列,是代表客观实体及其属性的符号。本发明实施例的软件程序代码包括但不限于C、C++、Java等编程语言的源代码和Windows PE、Linux ELF等各种平台的二进制代码。
在本发明实施例中,确定软件代码中的变量依赖关系通常使用程序静态分析的方式进行,对软件代码进行静态分析主要是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性,并且分析出代码中各个变量之间对相应输入的依赖关系,以便将所有包含输入依赖的变量进行保存,用于后续处理。
在本发明实施例中,变量依赖关系主要是指代码变量中的输入输出之间存在关联,则认为输入和输出的变量相互依赖。具体的,比如下列程序:
int functionA(int a,int b){
int c=a+1;
int d=c*b;
…
};
在上述代码中,变量a和b作为代码的输入,则经过静态代码分析后可知:变量c依赖于输入变量a,变量d依赖于输入变量a和b。
步骤S102,将变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数。
在本发明实施例中,伪随机数是用确定性的算法计算出来自[0,1]均匀分布的随机数序列。并不真正的随机,但具有类似于随机数的统计特征,如均匀性、独立性等。在计算伪随机数时,若使用的伪随机数种子不变,那么伪随机数的数序也不变。
在一个实施例中,如图2所示,执行步骤S102之前,还包括:
步骤S201,随机选取预设的伪随机数生成算法,预设的伪随机数生成算法至少包括线性同余方法、梅森旋转算法和密码学安全伪随机数生成算法中的一种或几种。
在本发明实施例中,通过随机选取伪随机数生成算法,可以提高不透明谓词生成手段的多样性,提高不透明谓词识别的难度,从而提高代码保护的安全性。
在一个实施例中,如图3所示,步骤S102具体可以包括以下步骤:
步骤S301,随机选取变量依赖关系中的代码变量,并将代码变量进行比特变换,得到代码变量变换值,代码变量变换值比特长度与选取的伪随机数生成算法要求的随机数种子比特长度一致。
步骤S302,将代码变量变换值作为随机数种子进行伪随机数生成运算,得到代码伪随机数。
在本发明实施例中,对所选代码变量进行比特变换可以是比特拓展或比特截断,使其比特长度能够满足伪随机数生成算法的要求,然后将变换后变量作为选定的伪随机数生成算法的种子。
例如,若选择PRNG算法(pseudorandom noise generator,伪随机噪声发生器)作为伪随机数生成算法,PRNG算法需要64比特的随机数种子,则可以选取两个32比特的变量a和b,首尾连接成64比特变量作为随机数种子,最终构造的伪随机数生成算法可记为PRNG(a,b),进而根据不同的代码变量可以得到不同的代码伪随机数。
步骤S103,根据代码伪随机数构造不透明谓词,并将不透明谓词插入软件代码中,得到软件代码对应的软件混淆代码,以保护软件代码。
在一个实施例中,如图4所示,步骤S103具体可以包括以下步骤:
步骤S401,将代码伪随机数串联成预设比特长度的比特序列。
在本发明实施例中,比特序列的预设长度可根据安全性要求选择,预设长度越长,获得的比特序列越长,得到的位运算结果的真假性更稳定,获得的不透明谓词被分析的几率越低。
具体的,串联代码伪随机数可以利用简易的驱动程序将两个或多个代码伪随机数进行比特变换,比如:
在上述代码中,nums数组是驱动代码开辟的内存空间,for循环调用PRNG算法生成伪随机数,同时将算法生成的结果存放在内存中,nums数组内存储的数据即为驱动代码最终所生成的比特序列。上述例子中,将8个变量进行串联,如果一个变量的比特长度为32比特,则得到的比特序列长度为256比特。
步骤S402,将比特序列进行位运算,得到位运算结果。
在本发明实施例中,将生成出的比特序列进行位操作可以是按位与、按位或、按位异或、移位等操作。
在本发明实施例中,可以是将比特序列中从高位到低位相邻的两个比特值进行位运算,并将运算结果与下一个低位比特值进行相同的位运算,直到比特序列中的所有比特值位运算完毕,得到位运算结果。
步骤S403,将位运算结果与0或1构建等式和/或不等式;
步骤S404,判断等式和/或不等式的真假性,若等式和/或不等式恒为真或假,则将等式和/或不等式作为不透明谓词插入软件代码中,得到软件代码对应的软件混淆代码。
例如,将比特序列的所有位进行自身按位与,将其结果与0进行比较。沿用上面的例子,示例代码如下:
在上述代码中,result变量初始化为1,然后把result和nums数组中的所有数进行按位与,最终得到的result相当于比特序列中所有比特从高位到低位相邻两个比特之间按位与,并将结果与比特序列中的下一低位比特进行相同按位与计算的结果。进一步的,在本发明实施例中,把result和0进行比较,得到的等式result==0和不等式result!=0作为谓词p1和p2。
在本发明实施例中,判断的过程依据伪随机数的性质进行,由于伪随机数的比特呈均匀分布,即在上例中,几乎不可能出现256个连续的全1比特,而谓词p1为假当且仅当nums中所有比特全为1,因此上例中的谓词p1恒为真,谓词p2恒为假。又因为不透明谓词是指程序运行中真假恒定的谓词,因此上述方法构造的谓词p1和p2可作为不透明谓词使用。从而,最终可以得到n个恒为真的不透明谓词P1,P2,…,Pn。
在一个实施例中,如图5所示,步骤S404具体可以包括以下步骤:
步骤S501,随机选取软件代码中的分支语句位置和/或非分支语句位置。
在本发明实施例中,分支语句只要是指一些条件语句,比如C语言中的if-else语句、switch语句等,用于调用分支程序;非分支语句则是程序除分支语句外的主干流程程序。
在本发明实施例中,选取软件代码中的分支语句位置和非分支语句位置可以使用静态代码分析进行。具体的,比如使用控制流分析或数据流分析,其中,控制流分析是一类用于分析程序控制流结构的静态分析技术,目的在于生成程序的控制流图,在编译器设计、程序分析、程序理解等领域都有重要应用。对程序的控制流分析是对源程序或者源程序的中间表示形式的直接操作,形成控制流图,进而便于选取插入谓词的位置。
步骤S502,在分支语句位置和/或非分支语句位置中插入临时分支语句,并将临时分支语句的分支条件作为临时谓词进行标记。
在本发明实施例中,临时谓词可以是预设的分支语句,比如if语句,只作为临时占位,谓词的真假性可以任意选取。
步骤S503,将等式和/或不等式作为不透明谓词替换临时谓词,得到软件代码对应的软件混淆代码。
在一个实施例中,如图6所示,步骤S503执行前,具体还可以包括以下步骤:
步骤S601,将临时分支语句的分支条件为真的代码片段进行代码克隆,得到克隆代码片段。
在本发明实施例中,代码克隆也称为重复代码、拷贝-粘贴代码,相当于将代码片段进行复制。
步骤S602,将克隆代码片段的程序运算语句进行算法随机变异,并将变异后的克隆代码片段插入临时分支语句的分支条件为假的临时分支语句之后。
在本发明实施例中,算法随机变异可以是将加法操作变成减法操作、乘法操作变成除法操作等,变异前后代码片段的长度基本保持不变,但变异使代码的功能发生了较大的改变。
比如,本发明通过以下例子进行说明:
若代码克隆前的代码为如下形式:
if(B1){
int c=a+1;
}
则经过代码克隆并且进行算法变异后的代码可为如下形式:
在执行完上述过程之后,进一步执行步骤S503时,则可以将等式和/或不等式作为不透明谓词替换克隆和变异后的代码中的临时谓词,得到软件混淆代码。沿用上面的例子,将临时分支语句的分支条件中的n个谓词B1,B2,…,Bn替换成所构造的不透明谓词P1,P2,…,Pn。替换时保证真假分支的顺序不发生改变,最终得到的混淆代码为:
从而得到软件代码对应的软件混淆代码,实现代码的混淆保护。
本发明提供的一种代码保护方法,利用软件代码的变量作为伪随机数生成算法的种子,在软件运行时驱动伪随机数生成算法产生伪随机数;再通过对伪随机数进行各种位操作,构造出更复杂的不透明谓词;最后将不透明谓词安全地插入到软件代码中,进一步提高了代码混淆的强度,加强了代码保护的安全性。
实施例二
如图7所示,在一个实施例中,提供了一种代码保护装置,该代码保护装置可以集成于上述的计算机设备中,具体可以包括:
变量依赖关系分析模块710,用于获取软件代码,确定软件代码中的变量依赖关系。
在本发明实施例中,软件代码是程序员用开发工具所支持的语言写出来的源文件,属于一组有序的数字或字母的排列,是代表客观实体及其属性的符号。本发明实施例的软件程序代码包括但不限于C、C++、Java等编程语言的源代码和Windows PE、Linux ELF等各种平台的二进制代码。
在本发明实施例中,确定软件代码中的变量依赖关系通常使用程序静态分析的方式进行,对软件代码进行静态分析主要是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性,并且分析出代码中各个变量之间对相应输入的依赖关系,以便将所有包含输入依赖的变量进行保存,用于后续处理。
在本发明实施例中,变量依赖关系主要是指代码变量中的输入输出之间存在关联,则认为输入和输出的变量相互依赖。具体的,比如下列程序:
int functionA(int a,int b){
int c=a+1;
int d=c*b;
…
};
在上述代码中,变量a和b作为代码的输入,则经过静态代码分析后可知:变量c依赖于输入变量a,变量d依赖于输入变量a和b。
伪随机数生成模块720,用于将变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数。
在本发明实施例中,伪随机数是用确定性的算法计算出来自[0,1]均匀分布的随机数序列。并不真正的随机,但具有类似于随机数的统计特征,如均匀性、独立性等。在计算伪随机数时,若使用的伪随机数种子不变,那么伪随机数的数序也不变。
在一个实施例中,如图8所示,伪随机数生成模块720包括:
伪随机数生成算法选择单元721,用于随机选取预设的伪随机数生成算法,预设的伪随机数生成算法至少包括线性同余方法、梅森旋转算法和密码学安全伪随机数生成算法中的一种或几种。
在本发明实施例中,通过随机选取伪随机数生成算法,可以提高不透明谓词生成手段的多样性,提高不透明谓词识别的难度,从而提高代码保护的安全性。
在一个实施例中,如图8所示,伪随机数生成模块720还包括:
代码变量变换单元722,用于随机选取变量依赖关系中的代码变量,并将代码变量进行比特变换,得到代码变量变换值,代码变量变换值比特长度与选取的伪随机数生成算法要求的随机数种子比特长度一致。
伪随机数生成单元723,用于将代码变量变换值作为随机数种子进行伪随机数生成运算,得到代码伪随机数。
在本发明实施例中,对所选代码变量进行比特变换可以是比特拓展或比特截断,使其比特长度能够满足伪随机数生成算法的要求,然后将变换后变量作为选定的伪随机数生成算法的种子。
例如,若选择PRNG算法(pseudorandom noise generator,伪随机噪声发生器)作为伪随机数生成算法,PRNG算法需要64比特的随机数种子,则可以选取两个32比特的变量a和b,首尾连接成64比特变量作为随机数种子,最终构造的伪随机数生成算法可记为PRNG(a,b),进而根据不同的代码变量可以得到不同的代码伪随机数。
谓词插入模块730,用于根据代码伪随机数构造不透明谓词,并将不透明谓词插入软件代码中,得到软件代码对应的软件混淆代码,以保护软件代码。
在一个实施例中,如图9所示,谓词插入模块730包括:
比特序列生成单元731,用于将代码伪随机数串联成预设比特长度的比特序列。
在本发明实施例中,比特序列的预设长度可根据安全性要求选择,预设长度越长,获得的比特序列越长,得到的位运算结果的真假性更稳定,获得的不透明谓词被分析的几率越低。
具体的,串联代码伪随机数可以利用简易的驱动程序将两个或多个代码伪随机数进行比特变换,比如:
在上述代码中,nums数组是驱动代码开辟的内存空间,for循环调用PRNG算法生成伪随机数,同时将算法生成的结果存放在内存中,nums数组内存储的数据即为驱动代码最终所生成的比特序列。上述例子中,将8个变量进行串联,如果一个变量的比特长度为32比特,则得到的比特序列长度为256比特。
比特运算单元732,用于将比特序列进行位运算,得到位运算结果。
在本发明实施例中,将生成出的比特序列进行位操作可以是按位与、按位或、按位异或、移位等操作。
在本发明实施例中,可以是将比特序列中从高位到低位相邻的两个比特值进行位运算,并将运算结果与下一个低位比特值进行相同的位运算,直到比特序列中的所有比特值位运算完毕,得到位运算结果。
式子构建单元733,用于将位运算结果与0或1构建等式和/或不等式;
谓词插入单元734,用于判断等式和/或不等式的真假性,若等式和/或不等式恒为真或假,则将等式和/或不等式作为不透明谓词插入软件代码中,得到软件代码对应的软件混淆代码。
例如,将比特序列的所有位进行自身按位与,将其结果与0进行比较。沿用上面的例子,示例代码如下:
在上述代码中,result变量初始化为1,然后把result和nums数组中的所有数进行按位与,最终得到的result相当于比特序列中所有比特从高位到低位相邻两个比特之间按位与,并将结果与比特序列中的下一低位比特进行相同按位与计算的结果。进一步的,在本发明实施例中,把result和0进行比较,得到的等式result==0和不等式result!=0作为谓词p1和p2。
在本发明实施例中,判断的过程依据伪随机数的性质进行,由于伪随机数的比特呈均匀分布,即在上例中,几乎不可能出现256个连续的全1比特,而谓词p1为假当且仅当nums中所有比特全为1,因此上例中的谓词p1恒为真,谓词p2恒为假。又因为不透明谓词是指程序运行中真假恒定的谓词,因此上述方法构造的谓词p1和p2可作为不透明谓词使用。从而,最终可以得到n个恒为真的不透明谓词P1,P2,…,Pn。
在一个实施例中,如图10所示,谓词插入单元734包括:
位置选取子单元1001,用于随机选取软件代码中的分支语句位置和/或非分支语句位置。
在本发明实施例中,分支语句只要是指一些条件语句,比如C语言中的if-else语句、switch语句等,用于调用分支程序;非分支语句则是程序除分支语句外的主干流程程序。
在本发明实施例中,选取软件代码中的分支语句位置和非分支语句位置可以使用静态代码分析进行。具体的,比如使用控制流分析或数据流分析,其中,控制流分析是一类用于分析程序控制流结构的静态分析技术,目的在于生成程序的控制流图,在编译器设计、程序分析、程序理解等领域都有重要应用。对程序的控制流分析是对源程序或者源程序的中间表示形式的直接操作,形成控制流图,进而便于选取插入谓词的位置。
临时分支语句插入子单元1002,用于在分支语句位置和/或非分支语句位置中插入临时分支语句,并将临时分支语句的分支条件作为临时谓词进行标记。
在本发明实施例中,临时谓词可以是预设的分支语句,比如if语句,只作为临时占位,谓词的真假性可以任意选取。
谓词替换子单元1003,用于将等式和/或不等式作为不透明谓词替换临时谓词,得到软件代码对应的软件混淆代码。
在一个实施例中,如图11所示,谓词插入单元734还可以包括:
代码克隆子单元1101,用于将临时分支语句的分支条件为真的代码片段进行代码克隆,得到克隆代码片段。
在本发明实施例中,代码克隆也称为重复代码、拷贝-粘贴代码,相当于将代码片段进行复制。
代码变异子单元1102,用于将克隆代码片段的程序运算语句进行算法随机变异,并将变异后的克隆代码片段插入临时分支语句的分支条件为假的临时分支语句之后。
在本发明实施例中,算法随机变异可以是将加法操作变成减法操作、乘法操作变成除法操作等,变异前后代码片段的长度基本保持不变,但变异使代码的功能发生了较大的改变。
比如,本发明通过以下例子进行说明:
若代码克隆前的代码为如下形式:
if(B1){
int c=a+1;
}
则经过代码克隆并且进行算法变异后的代码可为如下形式:
在执行完上述过程之后,可以将等式和/或不等式作为不透明谓词替换克隆和变异后的代码中的临时谓词,得到软件混淆代码。沿用上面的例子,将临时分支语句的分支条件中的n个谓词B1,B2,…,Bn替换成所构造的不透明谓词P1,P2,…,Pn。替换时保证真假分支的顺序不发生改变,最终得到的混淆代码为:
从而得到软件代码对应的软件混淆代码,实现代码的混淆保护。
本发明提供的一种代码保护装置,利用软件代码的变量作为伪随机数生成算法的种子,在软件运行时驱动伪随机数生成算法产生伪随机数;再通过对伪随机数进行各种位操作,构造出更复杂的不透明谓词;最后将不透明谓词安全地插入到软件代码中,进一步提高了代码混淆的强度,加强了代码保护的安全性。
另外,图12示出了一个实施例中计算机设备的内部结构图。该计算机设备具体可以是终端。如图12所示,该计算机设备包括该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、输入装置和显示屏。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质存储有操作系统,还可存储有计算机程序,该计算机程序被处理器执行时,可使得处理器实现代码保护方法。该内存储器中也可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行代码保护方法。计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图12中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,本申请提供的代码保护装置可以实现为一种计算机程序的形式,计算机程序可在如图12所示的计算机设备上运行。计算机设备的存储器中可存储组成该代码保护装置的各个程序模块,比如,图7所示的变量依赖关系分析模块710、伪随机数生成模块720和谓词插入模块730。各个程序模块构成的计算机程序使得处理器执行本说明书中描述的本申请各个实施例的代码保护方法中的步骤。
例如,图12所示的计算机设备可以通过如图7所示的代码保护装置中的变量依赖关系分析模块710执行步骤S101。计算机设备可通过伪随机数生成模块720执行步骤S102。计算机设备可通过谓词插入模块730执行步骤S103。
在一个实施例中,提出了一种计算机设备,所述计算机设备包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取软件代码,确定软件代码中的变量依赖关系。
将变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数。
根据代码伪随机数构造不透明谓词,并将不透明谓词插入软件代码中,得到软件代码对应的软件混淆代码,以保护软件代码。
在一个实施例中,提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时,使得处理器执行以下步骤:
获取软件代码,确定软件代码中的变量依赖关系。
将变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数。
根据代码伪随机数构造不透明谓词,并将不透明谓词插入软件代码中,得到软件代码对应的软件混淆代码,以保护软件代码。
应该理解的是,虽然本发明各实施例的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,各实施例中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种代码保护方法,其特征在于,所述方法包括以下步骤:
获取软件代码,确定所述软件代码中的变量依赖关系;
将所述变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数;
根据所述代码伪随机数构造不透明谓词,并将所述不透明谓词插入所述软件代码中,得到所述软件代码对应的软件混淆代码,以保护所述软件代码。
2.根据权利要求1所述的方法,其特征在于,所述将所述变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数之前,还包括:
随机选取预设的伪随机数生成算法,所述预设的伪随机数生成算法至少包括线性同余方法、梅森旋转算法和密码学安全伪随机数生成算法中的一种或几种。
3.根据权利要求2所述的方法,其特征在于,所述将所述变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数,具体包括:
随机选取所述变量依赖关系中的代码变量,并将所述代码变量进行比特变换,得到代码变量变换值,所述代码变量变换值比特长度与选取的所述伪随机数生成算法要求的随机数种子比特长度一致;
将所述代码变量变换值作为随机数种子进行伪随机数生成运算,得到代码伪随机数。
4.根据权利要求1所述的方法,其特征在于,所述根据所述代码伪随机数构造不透明谓词,并将所述不透明谓词插入所述软件代码中,得到所述软件代码对应的软件混淆代码,具体包括:
将所述代码伪随机数串联成预设比特长度的比特序列;
将所述比特序列进行位运算,得到位运算结果;
将所述位运算结果与0或1构建等式和/或不等式;
判断所述等式和/或所述不等式的真假性,若所述等式和/或所述不等式恒为真或假,则将所述等式和/或所述不等式作为不透明谓词插入所述软件代码中,得到所述软件代码对应的软件混淆代码。
5.根据权利要求4所述的方法,其特征在于,所述将所述比特序列进行位运算,得到位运算结果,具体为:
将所述比特序列中从高位到低位相邻的两个比特值进行位运算,并将运算结果与下一个低位比特值进行相同的位运算,直到所述比特序列中的所有比特值位运算完毕,得到位运算结果。
6.根据权利要求4所述的方法,其特征在于,所述将所述等式和/或所述不等式作为不透明谓词插入所述软件代码中,具体包括:
随机选取所述软件代码中的分支语句位置和/或非分支语句位置;
在所述分支语句位置和/或所述非分支语句位置中插入临时分支语句,并将所述临时分支语句的分支条件作为临时谓词进行标记;
将所述等式和/或所述不等式作为不透明谓词替换所述临时谓词,得到所述软件代码对应的软件混淆代码。
7.根据权利要求6所述的方法,其特征在于,所述将所述等式和/或所述不等式作为不透明谓词替换所述临时谓词,得到软件混淆代码之前,还包括:
将所述临时分支语句的分支条件为真的代码片段进行代码克隆,得到克隆代码片段;
将所述克隆代码片段的程序运算语句进行算法随机变异,并将变异后的所述克隆代码片段插入所述临时分支语句的分支条件为假的临时分支语句之后。
8.一种代码保护装置,其特征在于,所述装置包括:
变量依赖关系分析模块,用于获取软件代码,确定所述软件代码中的变量依赖关系;
伪随机数生成模块,用于将所述变量依赖关系中的代码变量进行伪随机数生成运算,得到代码伪随机数;
谓词插入模块,用于根据所述代码伪随机数构造不透明谓词,并将所述不透明谓词插入所述软件代码中,得到所述软件代码对应的软件混淆代码,以保护所述软件代码。
9.一种计算机设备,其特征在于,包括存储器和处理器,所述存储器中存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行权利要求1至7中任一项权利要求所述代码保护方法的步骤。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行权利要求1至7中任一项权利要求所述代码保护方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910212434.0A CN109948309A (zh) | 2019-03-20 | 2019-03-20 | 一种代码保护方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910212434.0A CN109948309A (zh) | 2019-03-20 | 2019-03-20 | 一种代码保护方法、装置、计算机设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109948309A true CN109948309A (zh) | 2019-06-28 |
Family
ID=67011229
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910212434.0A Pending CN109948309A (zh) | 2019-03-20 | 2019-03-20 | 一种代码保护方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109948309A (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111143790A (zh) * | 2019-12-13 | 2020-05-12 | 广州华多网络科技有限公司 | 代码混淆方法、装置、设备及存储介质 |
CN112199667A (zh) * | 2020-09-30 | 2021-01-08 | 常熟理工学院 | 软件保护方法、装置、设备及存储介质 |
CN112541188A (zh) * | 2019-09-20 | 2021-03-23 | 武汉斗鱼网络科技有限公司 | 阻止应用程序代码被静态分析的方法及装置 |
CN113949713A (zh) * | 2021-10-15 | 2022-01-18 | 佳缘科技股份有限公司 | 一种基于数据漂移的动态存储方法、存储介质和计算机设备 |
CN114491680A (zh) * | 2021-12-28 | 2022-05-13 | 山东赤子城网络技术有限公司 | 一种获取iOS终端设备唯一标识符的方法和系统 |
-
2019
- 2019-03-20 CN CN201910212434.0A patent/CN109948309A/zh active Pending
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112541188A (zh) * | 2019-09-20 | 2021-03-23 | 武汉斗鱼网络科技有限公司 | 阻止应用程序代码被静态分析的方法及装置 |
CN112541188B (zh) * | 2019-09-20 | 2022-05-13 | 武汉斗鱼网络科技有限公司 | 阻止应用程序代码被静态分析的方法及装置 |
CN111143790A (zh) * | 2019-12-13 | 2020-05-12 | 广州华多网络科技有限公司 | 代码混淆方法、装置、设备及存储介质 |
CN111143790B (zh) * | 2019-12-13 | 2022-07-12 | 广州方硅信息技术有限公司 | 代码混淆方法、装置、设备及存储介质 |
CN112199667A (zh) * | 2020-09-30 | 2021-01-08 | 常熟理工学院 | 软件保护方法、装置、设备及存储介质 |
CN113949713A (zh) * | 2021-10-15 | 2022-01-18 | 佳缘科技股份有限公司 | 一种基于数据漂移的动态存储方法、存储介质和计算机设备 |
CN114491680A (zh) * | 2021-12-28 | 2022-05-13 | 山东赤子城网络技术有限公司 | 一种获取iOS终端设备唯一标识符的方法和系统 |
CN114491680B (zh) * | 2021-12-28 | 2023-03-24 | 山东赤子城网络技术有限公司 | 一种获取iOS终端设备唯一标识符的方法和系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109948309A (zh) | 一种代码保护方法、装置、计算机设备和存储介质 | |
Liao et al. | Soliaudit: Smart contract vulnerability assessment based on machine learning and fuzz testing | |
Wichelmann et al. | Microwalk: A framework for finding side channels in binaries | |
Weiser et al. | {DATA}–differential address trace analysis: Finding address-based {Side-Channels} in binaries | |
Bayrak et al. | Sleuth: Automated verification of software power analysis countermeasures | |
Robert et al. | Introducing monte carlo methods with r | |
JP5643894B2 (ja) | サイドチャネル攻撃および反復起動攻撃に耐える動的可変タイミング演算パスのシステムおよび方法 | |
US8645930B2 (en) | System and method for obfuscation by common function and common function prototype | |
Liu et al. | Security in approximate computing and approximate computing for security: Challenges and opportunities | |
US9721120B2 (en) | Preventing unauthorized calls to a protected function | |
Machemie et al. | SmartCM a smart card fault injection simulator | |
US9313022B2 (en) | Homomorphic cryptography modeling in support of privacy policies | |
CN117375792B (zh) | 侧信道检测的方法和装置 | |
CN110190951A (zh) | 一种针对des算法l寄存器翻转的功耗攻击方法及系统 | |
Zhang et al. | Memory-based high-level synthesis optimizations security exploration on the power side-channel | |
Ibrahim et al. | Microarchitectural leakage templates and their application to cache-based side channels | |
Tsoupidi et al. | Securing optimized code against power side channels | |
Luo et al. | Code confusion in white box crowdsourced software testing | |
Tillich et al. | SCA-resistant embedded processors: The next generation | |
Rodríguez et al. | A modular and optimized toolbox for side-channel analysis | |
CN110413284A (zh) | 词法分析方法、装置、计算机设备和存储介质 | |
CN115794109A (zh) | 源代码编译方法、密文计算指令码执行方法及装置 | |
Yan et al. | SPIDER: Speeding up Side-Channel Vulnerability Detection via Test Suite Reduction | |
Jeong et al. | A data type inference method based on long short-term memory by improved feature for weakness analysis in binary code | |
Guo et al. | Research on Key Data Structure Localization Technology of Buffer Overflow Vulnerability |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
WD01 | Invention patent application deemed withdrawn after publication | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20190628 |