CN109948308A - 代码安全保护方法、装置、电子设备和计算机可读存储介质 - Google Patents
代码安全保护方法、装置、电子设备和计算机可读存储介质 Download PDFInfo
- Publication number
- CN109948308A CN109948308A CN201910190218.0A CN201910190218A CN109948308A CN 109948308 A CN109948308 A CN 109948308A CN 201910190218 A CN201910190218 A CN 201910190218A CN 109948308 A CN109948308 A CN 109948308A
- Authority
- CN
- China
- Prior art keywords
- virtual machine
- instruction
- different types
- code
- code security
- 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
- Devices For Executing Special Programs (AREA)
Abstract
本公开实施例提供了一种代码安全保护方法、装置、电子设备和计算机可读存储介质,该方法包括:将脚本语言的原始代码转换为不同类型的虚拟指令;将该不同类型的虚拟指令编码为虚拟机字节码,该虚拟机字节码包括用于标记指令类型的第一部分和用于标记指令数据的第二部分;将该虚拟机字节码与虚拟机解释器合并为第一可执行文件。本公开实施例提高了脚本语言代码的保密性和对抗性,防止原始代码通过传统的反向工程被非法获取。
Description
技术领域
本公开涉及计算机安全技术领域,具体而言,涉及一种代码安全保护方法、装置、电子设备和计算机可读存储介质。
背景技术
代码混淆是将计算机程序代码转换成一种功能上等价,但是难以阅读和理解的形式,主要目的是为了保护原始代码,阻止反向工程。例如,将原始代码中的各种元素,如变量、函数、类的名字改成无意义的名字,或者打乱代码的格式,或者重写代码中的部分逻辑,或者添加垃圾代码已达到隐藏真实代码的目的。对于动态脚本语言而言,其原始代码的混淆还可以基于文本变换将代码变换成另一种文本形式,再在运行时动态执行。
但是,本公开的发明人发现,上述混淆方法无法完全阻止脚本语言的原始代码通过反向工程被获取。
发明内容
在下文中将给出关于本公开实施例的简要概述,以便提供关于本公开实施例的某些方面的基本理解。应当理解,此概述并不是关于本公开实施例的穷举性概述。它并不是意图确定本公开实施例的关键或重要部分,也不是意图限定本公开实施例的范围。其目的仅仅是以简化的形式给出某些概念,以此作为稍后论述的更详细描述的前序。
根据本公开内容的第一方面,提供一种代码安全保护方法,包括:
将脚本语言的原始代码转换为不同类型的虚拟指令;
将该不同类型的虚拟指令编码为虚拟机字节码,该虚拟机字节码包括用于标记指令类型的第一部分和用于标记指令数据的第二部分;
将该虚拟机字节码与虚拟机解释器合并为第一可执行文件。
根据本公开内容的第二方面,提供一种代码安全保护装置,包括:
转换模块,被配置为将脚本语言的原始代码转换为不同类型的虚拟指令;
编码模块,被配置为将该不同类型的虚拟指令编码为虚拟机字节码,该虚拟机字节码包括用于标记指令类型的第一部分和用于标记指令数据的第二部分;
合并模块,被配置为将该虚拟机字节码与虚拟机解释器合并为第一可执行文件。
根据本公开内容的第三方面,提供一种电子设备,包括存储器和处理器;其中,该存储器存储有计算机程序,该计算机程序被该处理器执行以实现前述方法。
根据本公开内容的第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现前述方法。
本公开实施例通过虚拟指令编码将脚本语言的原始代码转化为语义等价的虚拟机字节码,并将虚拟机字节码绑定到自定义的虚拟机解释器进行解释执行,从而提高了脚本语言代码的保密性和对抗性,防止原始代码通过传统的反向工程被非法获取。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为根据本公开一实施例的代码安全保护方法的流程示意图;
图2是根据本公开实施例的16位二进制指令编码的示例图;
图3为根据图1所述代码安全保护方法的子流程示意图;
图4为根据图2所述代码安全保护方法的子流程示意图;
图5为根据本公开另一实施例的代码安全保护方法的流程示意图;
图6为根据本公开另一实施例的代码安全保护方法的流程示意图;
图7为根据本公开另一实施例的代码安全保护方法的流程示意图;
图8为根据本公开一实施例的代码安全保护装置100的结构示意图;
图9为根据图8所述代码安全保护装置的子结构示意图;
图10为根据图9所述代码安全保护装置的子结构示意图;
图11为根据本公开另一实施例的代码安全保护装置200的结构示意图;
图12为根据本公开另一实施例的代码安全保护装置300的结构示意图;
图13为根据本公开另一实施例的代码安全保护装置400的结构示意图;
图14为适于用来实现本公开实施例的代码安全保护方法的电子设备500的结构示意图;
图15为适于用来实现本公开实施例的代码安全保护方法的计算机系统600的结构示意图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本公开实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
图1为根据本公开一实施例的代码安全保护方法的流程示意图。如图1所示,本公开实施例的代码安全保护方法包括以下步骤:
步骤101,将脚本语言的原始代码转换为不同类型的虚拟指令;
步骤102,将该不同类型的虚拟指令编码为虚拟机字节码,该虚拟机字节码包括用于标记指令类型的第一部分和用于标记指令数据的第二部分;
步骤103,将该虚拟机字节码与虚拟机解释器合并为第一可执行文件。
如前所述,现有的代码混淆方法无法完全阻止脚本语言的原始代码被反向工程获取。
有鉴于此,本公开实施例基于虚拟机保护技术设计了一套自定义的虚拟指令集,通过将脚本语言的原始代码转换成语义等价的虚拟机字节码,并采用自定义的虚拟机解释器对虚拟机字节码进行解释执行。本公开的虚拟指令集和虚拟指令编码方式无法利用现有的代码反编译或者逆向工具来进行解析,从而确保了传统的反向工程手段无法获取脚本语言的原始代码。
虚拟机保护VMP(VM Protect)是将计算机程序中的部分代码转化为虚拟机(VM)上运行的虚拟机字节码,通过虚拟机进行解释执行,从而保护程序代码免被破解的代码保护技术。虚拟机保护技术常用于APP程序的加固保护,使App得到更高安全级别的保护,运行更加稳定,但是很少被用于前端Web开发的脚本语言的安全保护上。
本公开实施例参考汇编语言的指令设计以及脚本语言代码的语言特性,设计了包括通用指令和脚本语言专用指令在内的虚拟指令集。以下以JavaScript脚本语言为例,对本公开实施例涉及的虚拟指令集和指令编码方式进行示例性描述。
1、虚拟指令集
1.1、通用指令
本公开实施例的虚拟指令集参考汇编语言的指令设计,构建了多个通用指令,示例如下:
1)HALT指令
HALT指令是终止指令的执行。
2)LOAD指令
LOAD指令是加载数据指令。
3)STORE指令
STORE指令是存储数据指令。
4)CALL指令
CALL指令是子程序调用指令
5)RET指令
RET指令是子程序的返回指令。
6)JMP指令
JMP指令是无条件跳转指令,用于在程序执行中跳转到指定位置。
7)CMP指令
CMP指令是比较指令。
8)PUSH指令
PUSH指令是实现入栈操作指令
9)CAL指令
CAL指令是运算指令,与现有的虚拟机指令设计不同的是,本公开实施例将所有运算操作统一设计为一个CAL指令,所有运算操作都转换成二元操作,并赋值给寄存器。
上述通用指令中,LOAD指令、STORE指令、PUSH指令可以称为数据指令,HALT指令、CALL指令、RET指令、JMP指令可以称为控制指令,CMP指令和CAL指令可以称为运算指令。
1.2、脚本语言专用指令
本公开实施例针对脚本语言的特性,构建了脚本语言的专用指令,以JavaScript专用指令为例,示例说明如下:
1)SCALL指令
SCALL指令用于调用非自定义方法,如DOM方法、Windows对象方法等。
2)MEMBER指令
MEMBER指令用于变量的成员操作,如读取成员变量或设置成员变量。
3)FUNC指令
FUNC指令用于将函数作为参数传值。
4)OBJ指令
OBJ指令用于构建脚本语言对象,例如JavaScript对象。
5)EXP指令
EXP指令用于设置异常捕获。
6)THROW指令
THROW指令用于抛出异常。
需要说明的是,上述指令仅仅是示意性地描述了本公开实施例的针对个别脚本语言的部分虚拟指令的示例,实际上,本公开实施涉及的虚拟指令集中的通用指令和脚本语言专用指令可以包括但不限于上述示例的指令。
2、指令编码
本公开实施例中,将每条虚拟指令编码为二进制字节码,优选地,作为示例,二进制字节码可以采用int16的16位二进制数来表示。
图2是根据本公开实施例的16位二进制指令编码的示例图。如图2所示,每条指令对应的16位二进制数编码中高4位表示指令类型,低12位表示指令数据。高4位的指令类型可以包括2^4=16种指令,低12位的指令数据字段可以针对不同的指令类型采用不同的编码方式。
图2中示出了LOAD指令的指令编码示例,如图2所示,对于LOAD指令,即加载数据指令,一共有两种类型的LOAD指令:1)将数据从内存地址中加载到寄存器;2)将立即数加载到寄存器。
其中,该16位二进制编码格式中,
第15位到第12位,表示指令类型,其中,LOAD类型可以以0x1表示;
第11位,表示标志位flag,flag=0表示从内存地址加载数据,flag=1表示将立即数加载到寄存器;
第10位到第9位,表示寄存器号,2位可以表示2^2=4个寄存器;
第8位到第0位,表示数据地址或者立即数,取决于标志位flag的取值,如果标志位值是0则表示数据地址,9位可以表示2^9=512个地址;如果标志位值是1则表示立即数,9位可以表示int9的数。
虚拟指令的设计需要考虑指令参数如何传递。基于寄存器的指令比较高效,参数可以直接编码到指令当中,完成一个操作只需要一条指令即可,而基于栈的指令,通常除了指令本身外,还需要额外的参数入栈指令,这使得完成一个操作需要多个指令时间,效率相对比较底下,优点是其指令比较简洁,实现也比较简单,没有额外的分配寄存器任务。
为了增加虚拟机解释器的执行效率,又不导致指令长度过大,从而导致转换后的字节码膨胀,本公开采用寄存器和参数栈的组合架构,当指令参数较少时,直接使用寄存器传递指令参数;当指令参数超过限制时,超过的部分参数通过栈传递。这样,既保证了指令的执行效率,又保证了指令限制在有限长度内。在可选的实施方式中,本公开采用4个寄存器和1个参数栈的组合架构。
图2仅示意性地描述了LOAD指令的编码,其他的指令的编码类似,通过本公开实施例的指令编码,现有的反编译或者逆向工具很难直接用于解析和分析指令。
返回到图1所示实施例,步骤101中,本公开实施例首先将脚本语言的原始代码转换为不同类型的虚拟指令。优先地,这种不同类型的虚拟指令可以包括上述的通用指令以及脚本语言专用指令。
在可选的实施方式中,如图3所示,步骤101中将脚本语言的原始代码转换为不同类型的虚拟指令可以采用以下步骤实现:
步骤301,将脚本语言的原始代码解析为抽象语法树。
抽象语法树AST(Abstract Syntax Tree)指的是源代码语法所对应的树状结构。一种编程语言的源代码,可以通过构建语法树的形式将源代码中的语句映射到树中的每一个节点上。对于JavaScript的原始代码而言,可以通过JavaScript解析器把原始代码转换成抽象语法树AST。
步骤302,将该抽象语法树进行指令拆分,转换为包含不同类型的虚拟指令的集合。
本公开实施例中,通过虚拟指令集配套的编译器,对已经解析得到的抽象语法树AST中的每一个语句(statement)进行解析,将每一个语句块(block)进行指令拆分,拆分的过程中根据不同语句的结构对应映射到不同的虚拟指令的集合。
将上述拆分出来的虚拟指令的集合按照前述的指令编码方式,对应不同的指令类型将该虚拟指令的集合编码成int16的数组,数组中的每一个元素就是一条虚拟指令的int16的二进制编码表示。
在可选的实施方式中,如图4所示,上述步骤302中将该抽象语法树进行指令拆分,转换为包含不同类型的虚拟指令的集合还可以包括:
步骤401,将抽象语法树中的静态数据存储至静态数据数组;
步骤402,将该静态数据在该静态数据数组中的索引号作为该静态数据的静态数据地址;
步骤403,基于该静态数据地址来构造该虚拟指令。
本公开实施例中,对于抽象语法树AST的语句中的静态变量,编译器在遍历抽象语法树AST的过程中,会将遇到的静态变量或者静态字符提取出来直接存储到静态数据数组中vm.staticData。
示例性的,以下以语句var a=document.getElementById(“id”)为例进行描述:
编译器将会提取出“id”作为静态变量,通过执行vm.staticData.push(“id”),将“id”存入静态数据数组中;并将该静态变量在静态数据数组中的索引号返回,作为该静态变量的静态数据地址,即addr=len(vm.staticData)。
编译器在解析上述语句时,document.getElementById函数调用参数将直接采用该静态数据地址来构造指令,上述语句转换为本公开的虚拟指令的集合如下:
PUSH static#0
MEMBER static#1
SCALL flag=0#2
其中,上述指令中包含的静态数据地址#0、#1、#2对应的静态数据数组的内容如下:
[”getElementById”,”document”,”id”]
随后,将上述转换后的虚拟指令集合编码成int16的二进制虚拟机字节码如下:
0x9000
0xA001
0x8002
其中,0x9、0xA、0x8分别表示指令PUSH、MEMBER、SCALL的指令类型,000、001、002分别表示上述转换后的虚拟指令涉及的指令数据字段,即标志位均为0,寄存器均为0号,数据地址分别为0x0、0x1、0x2。
基于本公开的虚拟指令集和指令编码的机制,本公开实施例通过步骤101和步骤102将原始的JavaScript代码转换为对应的虚拟指令的虚拟机字节码,随后,步骤103中,编译器将转换后的虚拟机字节码与虚拟机解释器合并为可执行的JS文件。
编译器通过将虚拟机解释器和上述生成的虚拟机字节码绑定成一个可执行的JS文件。可选的,可以将虚拟机字节码的int16数组,转化成base64编码的字符串,然后传入vm.run()方法中。
图5为根据本公开另一实施例的代码安全保护方法的流程示意图。如图5所示,本公开实施例的代码安全保护方法,在图1所示实施例基础上,还包括以下步骤:
步骤104,通过浏览器加载运行该第一可执行文件,利用该虚拟机解释器从该虚拟机字节码解析出该不同类型的虚拟指令,对该不同类型的虚拟指令进行执行。
本公开的虚拟机解释器用来解析和执行虚拟机字节码,主要是通过二进制运算来解析指令,并按照不同的指令类型对应的流程来执行指令。具体原理描述如下:
1、解析指令
为了解析出指令,首先需要识别指令类型。根据前述的指令编码方式,虚拟机解释器将字节码的高4位取出,得到指令类型,例如:指令的字节码为0x1008,高4位为0x1也就表示当前指令是一个LOAD指令。
接着,按照前述介绍的LOAD指令的编码方式,可能有两种方式,一种将数据从内存地址中加载到寄存器,另一种是将立即数加载到寄存器,这取决于标志位flag的值。因此,需要取出第11位标志位的值。
还是以上述指令字节码0x1008举例,第11位的值是0x0,也就表示当前指令是一个加载内存地址到寄存器的LOAD指令。
其次,取出寄存器号,第10位到第9位为0x0,表示第0号寄存器。
最后,取出地址值,第8位到第0位为0x8,表示内存地址0x8。
由上述解析步骤可以得出,0x1008这条指令的意义是将内存地址为0x8的数据加载到第0号寄存器中。
2、执行指令
指令的执行也和指令的解析类似,按照指令类型的不同有着不同的执行方式。虚拟机解释器先初始化指令指针为0,并取出当前指令,根据指令类型以及不同的标志位flag的状态对应执行不同的逻辑,并将指针指向下一条指令,直到执行到HALT指令终止程序。下面根据不同类型的指令的示例来详细阐明本公开的虚拟指令如何执行的。
1)数据指令
数据指令指的是数据的存储、读取等指令。以LOAD指令为例,执行时,首先判断当前指令的标志位flag(解析后存储于属性变量this.flag);
如果标志位flag是0,则将vm.data中对应的地址数据(this.addr)取出来,并赋值给对应编号的寄存器this.reg,即vm.register[this.reg]=vm.data[this.addr];如果标志位flag是1,则将立即数(this.imm)的值赋值给对应编号的寄存器this.reg,即vm.register[this.reg]=this.imm。
和LOAD指令类似,STORE存储指令的执行过程如下:首先将对应编号的寄存器this.reg中的值取出vm.register[this.reg],并存放到内存地址this.addr对应的虚拟机data数组中,地址就是data数组的索引号,即vm.data[this.addr]=vm.register[this.reg]。
2)控制指令
控制指令指的是控制程序执行流程的指令,例如JMP跳转指令,用来跳转到指定位置执行。以JMP指令为例,执行时,首先判断当前指令的标志位flag,然后根据不同的标志位值执行不同的程序跳转。以标志位flag为0举例,JMP指令将虚拟机指令指针vm.ip指向当前需要跳转的地址上,虚拟机执行下一个指令则从该地址上取指令,从而实现了程序流程的跳转。本公开实施例也可以设置标志位的值来用于不同状态的跳转判断,如按照CMP比较指令的状态来判断是否跳转以及如何跳转,具体执行原理类似,这里就不再赘述。
3)运算指令
运算指令指的是执行数据运算的指令。以CAL指令为例,可以通过设置不同的标志位flag的值来实现多种不同的运算类型。执行加法运算的标志位可以设置为0,执行操作示例如下:
将对应编号this.reg1的寄存器中的数据取出,与对应编号this.reg2的寄存器中的数据做加法运算,并将结果存储在对应编号this.reg0的寄存器中,如下:
vm.register[this.reg0]=vm.register[this.reg1]+vm.register[this.reg2]。
4)脚本语言专用指令
脚本语言专用指令是本公开实施例针对脚本语言的语言特性构建的专用指令。以下以JavaScript专用指令的执行为例进行说明。
以SCALL超级调用指令为例,SCALL也有很多标志位flag的状态,这里以标志位flag=0的情况举例。该指令执行时,首先根据指令中的立即数this.imm中表示的当前栈中参数的个数,依次将对应的参数进行出栈vm.stack.pop(),再从编号为this.reg的寄存器中取出调用的对象,然后传入参数来调用对应的方法,并将返回结果存入编号为3的寄存器中,即返回结果存储至最后一个寄存器中。如下:
vm.register[3]=vm.register[this.reg](args[0],args[1])。
图6为根据本公开另一实施例的代码安全保护方法的流程示意图。如图6所示,本公开实施例的代码安全保护方法,在图1所示实施例基础上,还包括以下步骤:
步骤105,对该第一可执行文件进行压缩、混淆或加密处理,得到第二可执行文件。
本公开实施例中,为了进一步保护虚拟机解释器的逻辑,通过对步骤103中合并生成的第一可执行文件进行二次安全保护,即压缩、混淆或加密处理,进一步增加理解和破解该虚拟指令的难度,并且最终生成的可执行文件的尺寸大小缩小,节省了内存空间。
本步骤中,对第一可执行文件进行压缩、混淆或加密处理的方式可以是已有的压缩、混淆或加密处理方式,本公开不做具体限制,只要实现本公开实施例中对第一可执行文件进行二次安全保护的压缩、混淆或加密处理的技术均包含在本公开保护的范围中。
在可选的实施方式中,在选择通过压缩第一可执行文件来生成第二可执行文件时,可以使用uglifyjs压缩工具将合并了虚拟机解释器和虚拟机字节码的可执行文件(vm.js)进行二次压缩,最终生成的可执行JS文件(vm.min.js),在前端浏览器中加载运行,可以与原始代码功能等效。
图7为根据本公开另一实施例的代码安全保护方法的流程示意图。如图7所示,本公开实施例的代码安全保护方法,在图6所示实施例基础上,还包括以下步骤:
步骤106,通过浏览器加载运行该第二可执行文件,利用该虚拟机解释器从该虚拟机字节码解析出该不同类型的虚拟指令,对该不同类型的虚拟指令进行执行。
该步骤106与图5中步骤104的区别在于浏览器记载运行第二可执行文件时,虚拟机解释器需要对第二可执行文件进行解压、反混淆或解密处理,其对虚拟指令的解析和执行原理相同。
在可选的实施方式中,在步骤104和106的执行过程中,虚拟机解释器可以检测每条虚拟指令执行的时间间隔,当该时间间隔大于预定阈值时,终止该虚拟指令的执行。
本实施方式,通过基于指令执行的时间差来识别是否存在debug调试,从而识别是否存在非法的源代码获取。
与现有的代码混淆方法相比,本公开实施例提供的代码安全保护方法,利用自定义的虚拟指令集和虚拟机解释器,将脚本语言的原始代码转换为不同指令类型的虚拟机字节码,并且将该虚拟机字节码与虚拟机解释器合并为可执行文件,供前端浏览器记载运行,从而提高了脚本语言代码的保密性和对抗性,防止原始代码通过传统的反向工程被非法获取。
图8为根据本公开一实施例的代码安全保护装置100的结构示意图。如图8所示,本公开实施例的代码安全保护装置包括:
转换模块801,被配置为将脚本语言的原始代码转换为不同类型的虚拟指令;
编码模块802,被配置为将所述不同类型的虚拟指令编码为虚拟机字节码,所述虚拟机字节码包括用于标记指令类型的第一部分和用于标记指令数据的第二部分;
合并模块803,被配置为将所述虚拟机字节码与虚拟机解释器合并为第一可执行文件。
在可选的实施方式中,如图9所示,转换模块801可以包括以下子模块:
语法分析子模块901,被配置为将脚本语言的原始代码解析为抽象语法树;
指令转换子模块902,被配置为将该抽象语法树进行指令拆分,转换为包含不同类型的虚拟指令的集合。
在可选的实施方式中,如图10所示,指令转换子模块902还可以包括:
数据解析子模块1001,被配置为将抽象语法树中的静态数据存储至静态数据数组;
数据地址子模块1002,被配置为将该静态数据在该静态数据数组中的索引号作为该静态数据的静态数据地址;
指令构建子模块1003,被配置为基于该静态数据地址来构造该虚拟指令。
图11为根据本公开另一实施例的代码安全保护装置200的结构示意图。如图11所示,本公开实施例的代码安全保护装置,在图8所示实施例基础上,还包括以下模块:
执行模块804,被配置为通过浏览器加载运行该第一可执行文件,利用该虚拟机解释器从该虚拟机字节码解析出该不同类型的虚拟指令,对该不同类型的虚拟指令进行执行。
图12为根据本公开另一实施例的代码安全保护装置300的结构示意图。如图12所示,本公开实施例的代码安全保护装置,在图8所示实施例基础上,还包括以下模块:
二次保护模块805,被配置为对该第一可执行文件进行压缩、混淆或加密处理,得到第二可执行文件。
图13为根据本公开另一实施例的代码安全保护装置400的结构示意图。如图13所示,本公开实施例的代码安全保护装置,在图12所示实施例基础上,还包括以下模块:
执行模块806,被配置为通过浏览器加载运行该第二可执行文件,利用该虚拟机解释器从该虚拟机字节码解析出该不同类型的虚拟指令,对该不同类型的虚拟指令进行执行。
在可选的实施方式中,该执行模块804或806还可以包括:检测子模块,被配置为虚拟机解释器可以检测每条虚拟指令执行的时间间隔,当该时间间隔大于预定阈值时,终止该虚拟指令的执行。
本公开提供的代码安全保护装置的各实施例中涉及的虚拟指令、指令编码以及指令的解释执行方式参见前述代码安全保护方法的各实施例描述的内容,在此不再赘述。
图14为适于用来实现本公开实施例的代码安全保护方法的电子设备500的结构示意图。如图14所示,所述电子设备500包括存储器1401和处理器1402;
其中,所述存储器1401用于存储计算机程序,其中,该计算机程序被处理器1402执行以实现本公开任一实施例的代码安全保护方法。
图15为适于用来实现本公开实施例的代码安全保护方法的计算机系统600的结构示意图。
如图15所示,计算机系统600包括中央处理单元(CPU)1501,其可以根据存储在只读存储器(ROM)1502中的程序或者从存储部分1508加载到随机访问存储器(RAM)1503中的程序而执行上述实施方式中的各种处理。在RAM1503中,还存储有系统1500操作所需的各种程序和数据。CPU1501、ROM1502以及RAM1503通过总线1504彼此相连。输入/输出(I/O)接口1505也连接至总线1504。
以下部件连接至I/O接口1505:包括键盘、鼠标等的输入部分1506;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分1507;包括硬盘等的存储部分1508;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分1509。通信部分1509经由诸如因特网的网络执行通信处理。驱动器1510也根据需要连接至I/O接口1505。可拆卸介质1511,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1510上,以便于从其上读出的计算机程序根据需要被安装入存储部分1508。
根据本公开的实施方式,上文描述的方法可以被实现为计算机软件程序。例如,本公开实施例还提供一种计算机程序产品,其包括有形地包含在机器可读介质上的计算机程序,所述计算机程序包含用于执行本公开实施例的代码安全保护方法的程序代码。在该实施方式中,该计算机程序可以通过通信部分1509从网络上被下载和安装,和/或从可拆卸介质1511被安装。
另一方面,本公开实施例还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施方式中所述设备或系统中所包含的计算机可读存储介质;也可以是单独存在,未装配入设备中的计算机可读存储介质。计算机可读存储介质存储有一个或者一个以上程序,所述程序被一个或者一个以上的处理器用来执行描述于本公开的方法。
应注意到,本公开的附图中的流程图和框图,每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,依据所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
本公开实施方式中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定。
还应注意到,相似的标号和字母在附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释,此外,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
最后应说明的是,以上所述实施例仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。
Claims (24)
1.一种代码安全保护方法,其特征在于,包括:
将脚本语言的原始代码转换为不同类型的虚拟指令;
将所述不同类型的虚拟指令编码为虚拟机字节码,所述虚拟机字节码包括用于标记指令类型的第一部分和用于标记指令数据的第二部分;
将所述虚拟机字节码与虚拟机解释器合并为第一可执行文件。
2.根据权利要求1所述的代码安全保护方法,其特征在于,所述将脚本语言的原始代码转换为不同类型的虚拟指令包括:
将所述脚本语言的原始代码解析为抽象语法树;
将所述抽象语法树进行指令拆分,转换为包含不同类型的虚拟指令的集合。
3.根据权利要求2所述的代码安全保护方法,其特征在于,所述将所述抽象语法树进行指令拆分,转换为包含不同类型的虚拟指令的集合包括:
将所述抽象语法树中的静态数据存储至静态数据数组;
将所述静态数据在所述静态数据数组中的索引号作为所述静态数据的静态数据地址;
基于所述静态数据地址来构造所述虚拟指令。
4.根据权利要求1所述的代码安全保护方法,其特征在于,所述方法还包括:通过浏览器加载运行所述第一可执行文件,利用所述虚拟机解释器从所述虚拟机字节码解析出所述不同类型的虚拟指令,对所述不同类型的虚拟指令进行执行。
5.根据权利要求1所述的代码安全保护方法,其特征在于,所述方法还包括:
对所述第一可执行文件进行压缩、混淆或加密处理,得到第二可执行文件。
6.根据权利要求5所述的代码安全保护方法,其特征在于,所述方法还包括:通过浏览器加载运行所述第二可执行文件,利用所述虚拟机解释器从所述虚拟机字节码解析出所述不同类型的虚拟指令,对所述不同类型的虚拟指令进行执行。
7.根据权利要求4或6所述的代码安全保护方法,其特征在于,所述不同类型的虚拟指令包括通用指令和脚本语言专用指令。
8.根据权利要求7所述的代码安全保护方法,其特征在于,所述虚拟机字节码包括16位二进制编码,其中,所述16位二进制编码中指定位数的高位字段构成所述第一部分,所述16位二进制编码中除所述指定位数的高位字段以外的剩余字段构成所述第二部分。
9.根据权利要求8所述的代码安全保护方法,其特征在于,所述第二部分包括标志字段、寄存器字段和数据字段,其中,所述数据字段包括数据地址或立即数。
10.根据权利要求9所述的代码安全保护方法,其特征在于,所述对所述不同类型的虚拟指令进行执行包括:
所述虚拟机解释器根据所述虚拟机字节码中所述第一部分中的指令类型和所述第二部分中的标志字段执行不同的逻辑。
11.根据权利要求10所述的代码安全保护方法,其特征在于,所述方法还包括:
所述虚拟机解释器检测每条虚拟指令执行的时间间隔,当所述时间间隔大于预定阈值时,终止所述虚拟指令的执行。
12.一种代码安全保护装置,其特征在于,包括:
转换模块,被配置为将脚本语言的原始代码转换为不同类型的虚拟指令;
编码模块,被配置为将所述不同类型的虚拟指令编码为虚拟机字节码,所述虚拟机字节码包括用于标记指令类型的第一部分和用于标记指令数据的第二部分;
合并模块,被配置为将所述虚拟机字节码与虚拟机解释器合并为第一可执行文件。
13.根据权利要求12所述的代码安全保护装置,其特征在于,所述转换模块包括:
语法分析子模块,被配置为将所述脚本语言的原始代码解析为抽象语法树;
指令转换子模块,被配置为将所述抽象语法树进行指令拆分,转换为包含不同类型的虚拟指令的集合。
14.根据权利要求13所述的代码安全保护装置,其特征在于,所述指令转换子模块包括:
数据解析子模块,被配置为将所述抽象语法树中的静态数据存储至静态数据数组;
数据地址子模块,被配置为将所述静态数据在所述静态数据数组中的索引号作为所述静态数据的静态数据地址;
指令构建子模块,被配置为基于所述静态数据地址来构造所述虚拟指令。
15.根据权利要求12所述的代码安全保护装置,其特征在于,所述装置还包括:
执行模块,被配置为通过浏览器加载运行所述第一可执行文件,利用所述虚拟机解释器从所述虚拟机字节码解析出所述不同类型的虚拟指令,对所述不同类型的虚拟指令进行执行。
16.根据权利要求12所述的代码安全保护装置,其特征在于,所述装置还包括:
二次保护模块,被配置为对所述第一可执行文件进行压缩、混淆或加密处理,得到第二可执行文件。
17.根据权利要求16所述的代码安全保护装置,其特征在于,所述装置还包括:
执行模块,被配置为通过浏览器加载运行所述第二可执行文件,利用所述虚拟机解释器从所述虚拟机字节码解析出所述不同类型的虚拟指令,对所述不同类型的虚拟指令进行执行。
18.根据权利要求15或17所述的代码安全保护装置,其特征在于,所述不同类型的虚拟指令包括通用指令和脚本语言专用指令。
19.根据权利要求18所述的代码安全保护装置,其特征在于,所述虚拟机字节码包括16位二进制编码,其中,所述16位二进制编码中指定位数的高位字段构成所述第一部分,所述16位二进制编码中除所述指定位数的高位字段以外的剩余字段构成所述第二部分。
20.根据权利要求19所述的代码安全保护装置,其特征在于,所述第二部分包括标志字段、寄存器字段和数据字段,其中,所述数据字段包括数据地址或立即数。
21.根据权利要求20所述的代码安全保护装置,其特征在于,所述执行模块包括:
指令判断子模块,被配置为所述虚拟机解释器根据所述虚拟机字节码中所述第一部分中的指令类型和所述第二部分中的标志字段执行不同的逻辑。
22.根据权利要求21所述的代码安全保护装置,其特征在于,所述装置还包括:
检测子模块,被配置为所述虚拟机解释器检测每条虚拟指令执行的时间间隔,当所述时间间隔大于预定阈值时,终止所述虚拟指令的执行。
23.一种电子设备,其特征在于,包括存储器和处理器;其中,所述存储器存储有计算机程序,所述计算机程序被所述处理器执行以实现如权利要求1-11任一项所述方法。
24.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现如权利要求1-11任一项所述方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910190218.0A CN109948308A (zh) | 2019-03-13 | 2019-03-13 | 代码安全保护方法、装置、电子设备和计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910190218.0A CN109948308A (zh) | 2019-03-13 | 2019-03-13 | 代码安全保护方法、装置、电子设备和计算机可读存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN109948308A true CN109948308A (zh) | 2019-06-28 |
Family
ID=67008731
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910190218.0A Pending CN109948308A (zh) | 2019-03-13 | 2019-03-13 | 代码安全保护方法、装置、电子设备和计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109948308A (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110457869A (zh) * | 2019-07-23 | 2019-11-15 | Oppo广东移动通信有限公司 | 程序编译加密方法、装置、存储介质及电子设备 |
CN110516447A (zh) * | 2019-08-21 | 2019-11-29 | 上海连尚网络科技有限公司 | 一种识别终端模拟器的方法与设备 |
CN110555291A (zh) * | 2019-08-06 | 2019-12-10 | 苏宁云计算有限公司 | 网页脚本代码保护方法及装置 |
CN110750789A (zh) * | 2019-10-18 | 2020-02-04 | 杭州奇盾信息技术有限公司 | 解混淆方法、装置、计算机设备和存储介质 |
CN110990797A (zh) * | 2019-11-29 | 2020-04-10 | 珠海豹趣科技有限公司 | 一种数据处理方法、装置及计算机可读存储介质 |
CN111381938A (zh) * | 2020-05-29 | 2020-07-07 | 支付宝(杭州)信息技术有限公司 | 一种基于基础指令集执行区块链中智能合约的方法及系统 |
CN112199163A (zh) * | 2020-10-16 | 2021-01-08 | 常熟理工学院 | 分析解释例程的虚拟指令方法、装置、设备及存储介质 |
CN113391877A (zh) * | 2021-05-12 | 2021-09-14 | 联合汽车电子有限公司 | 刷新脚本解析系统 |
CN113626773A (zh) * | 2020-05-06 | 2021-11-09 | 上海蜚语信息科技有限公司 | 一种基于中间语言的代码保护方法 |
CN115048623A (zh) * | 2022-04-01 | 2022-09-13 | 上海任意门科技有限公司 | 用于加密代码的方法、计算设备和存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150205626A1 (en) * | 2011-05-12 | 2015-07-23 | Microsoft Technology Licensing, Llc | Emulating mixed-code programs using a virtual machine instance |
CN105046117A (zh) * | 2015-06-30 | 2015-11-11 | 西北大学 | 一种具有指令集随机化的代码虚拟化软件保护系统 |
CN108614960A (zh) * | 2018-05-11 | 2018-10-02 | 西北大学 | 一种基于前端字节码技术的JavaScript虚拟化保护方法 |
CN108932406A (zh) * | 2017-05-18 | 2018-12-04 | 北京梆梆安全科技有限公司 | 虚拟化软件保护方法和装置 |
-
2019
- 2019-03-13 CN CN201910190218.0A patent/CN109948308A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150205626A1 (en) * | 2011-05-12 | 2015-07-23 | Microsoft Technology Licensing, Llc | Emulating mixed-code programs using a virtual machine instance |
CN105046117A (zh) * | 2015-06-30 | 2015-11-11 | 西北大学 | 一种具有指令集随机化的代码虚拟化软件保护系统 |
CN108932406A (zh) * | 2017-05-18 | 2018-12-04 | 北京梆梆安全科技有限公司 | 虚拟化软件保护方法和装置 |
CN108614960A (zh) * | 2018-05-11 | 2018-10-02 | 西北大学 | 一种基于前端字节码技术的JavaScript虚拟化保护方法 |
Non-Patent Citations (1)
Title |
---|
匡开圆: "基于WebAssembly的JavaScript代码虚拟化保护方法研究与实现", 《中国优秀硕士学位论文全文数据库信息科技辑》 * |
Cited By (15)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110457869A (zh) * | 2019-07-23 | 2019-11-15 | Oppo广东移动通信有限公司 | 程序编译加密方法、装置、存储介质及电子设备 |
WO2021022927A1 (zh) * | 2019-08-06 | 2021-02-11 | 苏宁云计算有限公司 | 网页脚本代码保护方法及装置 |
CN110555291A (zh) * | 2019-08-06 | 2019-12-10 | 苏宁云计算有限公司 | 网页脚本代码保护方法及装置 |
CN110555291B (zh) * | 2019-08-06 | 2021-08-27 | 苏宁云计算有限公司 | 网页脚本代码保护方法及装置 |
CN110516447A (zh) * | 2019-08-21 | 2019-11-29 | 上海连尚网络科技有限公司 | 一种识别终端模拟器的方法与设备 |
CN110750789A (zh) * | 2019-10-18 | 2020-02-04 | 杭州奇盾信息技术有限公司 | 解混淆方法、装置、计算机设备和存储介质 |
CN110750789B (zh) * | 2019-10-18 | 2021-07-20 | 杭州奇盾信息技术有限公司 | 解混淆方法、装置、计算机设备和存储介质 |
CN110990797A (zh) * | 2019-11-29 | 2020-04-10 | 珠海豹趣科技有限公司 | 一种数据处理方法、装置及计算机可读存储介质 |
CN113626773A (zh) * | 2020-05-06 | 2021-11-09 | 上海蜚语信息科技有限公司 | 一种基于中间语言的代码保护方法 |
CN113626773B (zh) * | 2020-05-06 | 2024-04-02 | 上海蜚语信息科技有限公司 | 一种基于中间语言的代码保护方法 |
CN111381938A (zh) * | 2020-05-29 | 2020-07-07 | 支付宝(杭州)信息技术有限公司 | 一种基于基础指令集执行区块链中智能合约的方法及系统 |
CN112199163A (zh) * | 2020-10-16 | 2021-01-08 | 常熟理工学院 | 分析解释例程的虚拟指令方法、装置、设备及存储介质 |
CN112199163B (zh) * | 2020-10-16 | 2021-12-28 | 常熟理工学院 | 分析解释例程的虚拟指令方法、装置、设备及存储介质 |
CN113391877A (zh) * | 2021-05-12 | 2021-09-14 | 联合汽车电子有限公司 | 刷新脚本解析系统 |
CN115048623A (zh) * | 2022-04-01 | 2022-09-13 | 上海任意门科技有限公司 | 用于加密代码的方法、计算设备和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109948308A (zh) | 代码安全保护方法、装置、电子设备和计算机可读存储介质 | |
CN108614960B (zh) | 一种基于前端字节码技术的JavaScript虚拟化保护方法 | |
CN108681457B (zh) | 基于代码下沉与残码解释的Android应用程序保护方法 | |
CN108932406B (zh) | 虚拟化软件保护方法和装置 | |
CN110704063B (zh) | 编译和执行智能合约的方法及装置 | |
US8090959B2 (en) | Method and apparatus for protecting .net programs | |
CN112052006B (zh) | 一种软件代码编译方法及系统 | |
CN110688122B (zh) | 编译和执行智能合约的方法及装置 | |
CN110704064B (zh) | 编译和执行智能合约的方法及装置 | |
CN103177199A (zh) | 网页应用代码保护方法及系统和执行的提速方法及系统 | |
CN112597454A (zh) | 代码混淆方法、代码运行方法、装置、介质与设备 | |
CN110414261A (zh) | 一种数据脱敏方法、装置、设备及可读存储介质 | |
CN113704706B (zh) | 代码加固方法、装置 | |
CN112052433B (zh) | 一种Jar文件的虚拟化保护方法、终端及存储介质 | |
CN110309631B (zh) | 一种编程语言结构混淆处理方法、智能终端及存储介质 | |
CN103176807A (zh) | 网页应用执行的提速方法及系统 | |
CN111597514B (zh) | 安卓源代码保护方法和装置 | |
KR101356676B1 (ko) | 컴퓨팅 환경에서 표현식을 번역하는 방법, 소프트웨어 및시스템 | |
CN106557350B (zh) | 应用程序安装包中java字节码转换方法、装置及设备 | |
Casset | Development of an embedded verifier for java card byte code using formal methods | |
Juričić | Detecting source code similarity using low-level languages | |
CN113721928B (zh) | 一种基于二进制分析的动态库裁剪方法 | |
CN113849781B (zh) | Go语言源代码混淆方法、系统、终端及存储介质 | |
CN114416108B (zh) | 基于Android资源文件索引表对抗反编译的方法、系统及装置 | |
Haijiang et al. | Nightingale: Translating embedded VM code in x86 binary executables |
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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190628 |