CN110096264A - 一种代码运行方法及装置 - Google Patents
一种代码运行方法及装置 Download PDFInfo
- Publication number
- CN110096264A CN110096264A CN201910354380.1A CN201910354380A CN110096264A CN 110096264 A CN110096264 A CN 110096264A CN 201910354380 A CN201910354380 A CN 201910354380A CN 110096264 A CN110096264 A CN 110096264A
- Authority
- CN
- China
- Prior art keywords
- code
- character
- intermediate code
- character string
- source code
- 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
- 238000000034 method Methods 0.000 title claims abstract description 58
- 238000011022 operating instruction Methods 0.000 claims abstract description 9
- 238000004458 analytical method Methods 0.000 claims description 39
- 230000000877 morphologic effect Effects 0.000 claims description 15
- 238000004590 computer program Methods 0.000 claims description 7
- 230000001681 protective effect Effects 0.000 abstract description 11
- 238000010586 diagram Methods 0.000 description 10
- 230000006870 function Effects 0.000 description 4
- 230000004044 response Effects 0.000 description 4
- 238000004364 calculation method Methods 0.000 description 2
- 230000006399 behavior Effects 0.000 description 1
- 238000004422 calculation algorithm Methods 0.000 description 1
- 235000013399 edible fruits Nutrition 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000007717 exclusion Effects 0.000 description 1
- 241000894007 species Species 0.000 description 1
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/121—Restricting unauthorised execution of programs
- G06F21/125—Restricting unauthorised execution of programs by manipulating the program code, e.g. source code, compiled code, interpreted code, machine code
-
- 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
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Multimedia (AREA)
- Technology Law (AREA)
- Computer Hardware Design (AREA)
- Computing Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本申请实施例公开了一种代码运行方法及装置,用于解决JavaScript代码防护力度低的问题。其中,该方法包括:当检测到用于运行源代码的运行指令时,启动解析引擎;通过所述解析引擎调用中间代码,所述中间代码为所述源代码编译后的代码;运行所述中间代码。采用本申请实施例,可以提高代码的防护能力,能够应用于较高要求的场景。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种代码运行方法及装置。
背景技术
随着当今计算机编程技术的发展,JavaScript语言因其灵活性大、语法简单易学等特点,在网页的开发中得到了广泛的应用,成为当前应用最广的编程语言之一。
由于JavaScript语言是一种解释型脚本语言,程序源代码不需要提前编译,在程序运行的时候才被翻译成机器语言。所以,其源代码常常会被恶意分析而受到劫持,故技术人员常常采用无意义的字符串替换源代码中的变量名和方法名以实现对源代码的防护。但是,这种做法防护力度低。因此,如何实现对JavaScript源代码高强度的防护成为了亟需解决的问题。
发明内容
本申请实施例提供一种代码运行方法及装置,用于解决JavaScript代码防护力度低的问题。
第一方面,本申请实施例提供一种代码运行方法,该方法包括:
当检测到用于运行源代码的运行指令时,启动解析引擎;
通过所述解析引擎调用中间代码,所述中间代码为所述源代码编译后的代码;
运行所述中间代码。
在一种可能的实现方式中,所述方法还包括:
对所述源代码进行词法分析和语法分析,得到抽象语法树;
遍历所述抽象语法树,得到所述源代码对应的中间代码。
在一种可能的实现方式中,所述遍历所述抽象语法树,得到所述源代码对应的中间代码包括:
获取所述抽象语法树中每个数据节点代表的字符;
根据字符类型与字符串的对应关系获取所述字符对应的字符串;
根据获取的字符串生成中间代码。
在一种可能的实现方式中,所述根据获取的字符串生成中间代码包括:
在第一字符串和第二字符串之间添加分隔符,得到中间代码,所述第一字符串为获取的字符中的第一字符对应的字符串,所述第二字符串为获取的字符中的第二字符对应的字符串,所述第一字符是与所述第二字符相邻的前一个字符。
在一种可能的实现方式中,所述运行所述中间代码包括:
根据所述分隔符和所述中间代码确定字符串;
根据所述对应关系和所述字符串确定所述源代码中变量的计算规则和取值;
根据所述计算规则和所述取值运行所述中间代码。
在一种可能的实现方式中,所述方法还包括:
以栈的方式存储所述取值。
第二方面,本申请实施例提供了一种代码运行装置,该装置包括:
启动单元,用于当检测到用于运行源代码的运行指令时,启动解析引擎;
调用单元,用于通过所述解析引擎调用中间代码,所述中间代码为所述源代码编译后的代码;
运行单元,用于运行所述中间代码。
在一种可能的实现方式中,所述装置还包括:
分析单元,用于对所述源代码进行词法分析和语法分析,得到抽象语法树;
遍历单元,用于遍历所述抽象语法树,得到所述源代码对应的中间代码。
在一种可能的实现方式中,所述遍历单元,具体用于:
获取所述抽象语法树中每个数据节点代表的字符;
根据字符类型与字符串的对应关系获取所述字符对应的字符串;
根据获取的字符串生成中间代码。
在一种可能的实现方式中,所述遍历单元,具体用于:
在第一字符串和第二字符串之间添加分隔符,得到中间代码,所述第一字符串为获取的字符中的第一字符对应的字符串,所述第二字符串为获取的字符中的第二字符对应的字符串,所述第一字符是与所述第二字符相邻的前一个字符。
在一种可能的实现方式中,所述运行单元,具体用于:
根据所述分隔符和所述中间代码确定字符串;
根据所述对应关系和所述字符串确定所述源代码中变量的计算规则和取值;
根据所述计算规则和所述取值运行所述中间代码。
在一种可能的实现方式中,所述装置还包括:
存储单元,用于以栈的方式存储所述取值。
第三方面,本申请实施例提供了一种电子设备,该电子设备包括处理器和存储器,该处理器和存储器相互连接。该存储器用于存储支持该终端设备执行上述第一方面和/或第一方面任一种可能的实现方式提供的方法的计算机程序,该计算机程序包括程序指令,该处理器被配置用于调用上述程序指令,执行上述第一方面和/或第一方面任一种可能的实施方式所提供的方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序包括程序指令,该程序指令当被处理器执行时使该处理器执行上述第一方面和/或第一方面任一种可能的实施方式所提供的方法。
在本申请实施例中,在代码的运行过程中,通过源代码运行之前对源代码的编译,生成了一段中间代码,避免了源代码被恶意分析而受到劫持,提高了源代码的防护能力。同时在中间代码后面插入了一段用于运行中间代码的解析引擎,通过运行解析引擎调用执行中间代码,得到源代码的运行结果,用中间代码和解析引擎代码替换源代码在不影响运行速度的情况下,很大程度的提高了代码的防护能力,并且能应用于高要求的场景。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种代码运行方法的一流程示意图;
图2是本申请实施例提供的一种代码运行方法的另一流程示意图;
图3是本申请实施例提供的一种编译器的流程示意图;
图4是本申请实施例提供的一种解析引擎的示意图;
图5是本申请实施例提供的一种代码运行装置的结构示意图;
图6是本申请实施例提供的电子设备的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。
应当理解,当在本说明书和所附权利要求书中使用时,术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
还应当理解,在此本申请说明书中所使用的术语仅仅是出于描述特定实施例的目的而并不意在限制本申请。如在本申请说明书和所附权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。
还应当进一步理解,在本申请说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
如在本说明书和所附权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”。类似地,短语“如果确定”或“如果检测到[所描述条件或事件]”可以依据上下文被解释为意指“一旦确定”或“响应于确定”或“一旦检测到[所描述条件或事件]”或“响应于检测到[所描述条件或事件]”。
请参阅图1,图1是本申请实施例提供的一种代码运行方法的一流程示意图。如图1所示,该代码运行方法包括:
101、当检测到用于运行源代码的运行指令时,启动解析引擎。
本申请实施例中,代码运行装置可以包括服务器、移动手机、平板电脑、个人数字助理(Personal Digital Assistant,PDA)、移动互联网设备(Mobile Internet Device,MID)、智能穿戴设备(如智能手表、智能手环)等各种电子设备,能够处理JavaScript语言的脚本的设备。
对程序来说,计算机需要一个"翻译",即把程序代码变成计算机可以理解的语言,由于JavaScript语言是一种解释型脚本语言,解释型语言的程序不需要在运行前编译,在运行程序的时候才翻译,专门的解释器负责在每个语句执行的时候解释程序代码,因此,JavaScript的源代码常常因为在运行的时候才被编译和运行,所以不能做到高强度的防护。而如果需要运行JavaScript语言的脚本,通常需要使用JavaScript引擎,一般会附带在网页浏览器中。
而本申请实施例中,将源代码按照预设的方式进行编译,生成了中间代码,而按照生成中间代码的方式,对应有一个运行中间代码的解析引擎,用生成的中间代码与解析引擎的代码块替换源代码块,从而完成防护。
例如,在浏览器中附带JavaScript引擎,能运行JavaScript语言,得到运行结果。若是将所有源代码都直接放浏览器运行,则很容易被恶意分析而受到劫持。而在本申请中,浏览器附带的JavaScript引擎可以运行解析引擎的代码,不能直接运行由源代码生成的中间代码,从而达到了对源代码防护的目的。
在一种可能的实现方式中,可以人为预先确定需防护的源代码块。可以将所有的源代码都按照预设的方式生成中间代码,也可以将比较重要的代码作为需防护的代码块。
当检测到用于运行源代码的运行指令时,实际上中间代码是没有办法被运行的,所以会运行解析引擎的代码和未生成中间代码的JavaScript源代码即未防护的代码部分,当运行解析引擎时,解析引擎会调用中间代码并运行,生成运行结果。可以理解的是,解析引擎通过解析中间代码得到源代码的运行规则,可以运行得到的是与直接运行源代码运行结果相同。
102、通过上述解析引擎调用中间代码,上述中间代码为上述源代码编译后的代码。
具体地,本申请中的解析引擎的功能类似于JavaScript的引擎,能够处理按照预设的方法生成的中间代码,并得到运行结果。可以理解的是,中间代码是根据源代码编译而成的,而编译器是由开发人员设计的,编译器可以是JavaScript语言写的,也可以是C++,这里不做限定。而一种编译器,对应一种中间代码的生成方案,而不同生成方式的中间代码对应不同的解析引擎。
在一种可能的实现方式中,解析引擎是一个专门处理中间代码的虚拟机,具体结构可以如图4所示,主要包含三个部分:系统栈(System Stack)、计算栈(calculatestack)、中央处理器(Central Processing Unit,CPU)。其中,系统栈相当于变量的内存,而计算栈相当于寄存器。通过对中间码的分析,得到操作指令所涉及的数据,存储在系统栈中。可以理解的是,操作指令所涉及的数据就是读取的变量的值。当有变量需要被运算的时,会被读取到计算栈中进行计算,计算过程中的中间值存储在计算栈中,而计算结束后,所有读取到计算栈的变量以及计算结果会回写到系统栈中,而进行计算的是解析引擎的中央处理器。
在一种可能的实现方式中,替换源代码的代码有两段,一段是中间代码,一段是解析引擎的代码。这两段代码可以是中间代码在前,解析引擎代码在后,也可以是解析引擎在前,中间代码在后,还可以是解析引擎有中间代码的地址,可以调用执行中间代码,本申请不做限定。
103、运行上述中间代码。
在一种可能的实现方式中,中间代码由源代码编译而成,根据源代码中的字符类型与字符串的对应关系获取上述字符对应的字符串,从而得到的中间代码,因此,每一个源代码的字符或字符串都对应一个预设的字符串,将所有预设的字符整合起来,得到中间代码。不同的中间代码之间添加有分隔符,以便于解析引擎的执行。而解析引擎根据分隔符和中间代码确定源代码对应的变量取值以及计算规则,进行计算可以得到中间代码的运行结果。
例如,源代码中的a=i+j×k是被防护的代码块中的一部分,经过编译后得到的中间代码可以是load_a|load_i|load_j|load_k|mul|add|store_a,在运行过程中,解析引擎可根据分隔符|确定源代码对应的字符串为load_a、load_i、load_j、load_k、mul、add、store_a。解析引擎第一步执行中间代码load_a,为读取变量a的操作,即将a的值读取到计算栈的栈顶;第二步执行中间代码load_i,即将i的值读取到计算栈的栈顶;第三步和第四步执行中间代码load_j以及load_k,为将j和k的值依次读取到计算栈的栈顶;第五步执行中间代码mul,从当前计算栈的栈顶依次取出两个变量j和k,并进行乘法计算,得到j×k的值,并压回栈顶,即当前栈顶的值为top=j×k;第六步执行中间代码add,从当前计算栈的栈顶依次取出当前栈顶的值top以及i,并进行加法计算后压回栈顶,即当前栈顶的值为top=i+top;第七步执行中间码store_a,将当前栈顶的值写入到变量a中,即a=i+j×k,计算结束,并将计算结果写回系统栈中。
上述运行过程,计算步骤、中间代码以及计算栈的计算结果可参见表1。
步骤 | 中间代码 | 计算栈 |
1 | load_a | a |
2 | load_i | a,i |
3 | load_j | a,i,j |
4 | load_k | a,i,j,k |
5 | mul | a,i,top=(j×k) |
6 | add | a,top=(i+top) |
7 | store_a | NA |
表1
在表格的第一列为运行的步骤,在表格的第二列为根据分隔符和中间代码确定的源代码对应的字符串,在表格的第三列为计算栈和栈中运算的值,可以理解的是,栈顶是计算栈中最右边的一个值,在运行结果后将a的值写回系统栈中,结束计算。
在本申请实施例中,在代码的运行过程中,通过源代码运行之前对源代码的编译,生成了一段中间代码,避免了源代码被恶意分析而受到劫持,提高了源代码的防护能力。同时在中间代码后面插入了一段用于运行中间代码的解析引擎,通过运行解析引擎调用执行中间代码,得到源代码的运行结果,用中间代码和解析引擎代码替换源代码在不影响运行速度的情况下,很大程度的提高了代码的防护能力,并且能应用于高要求的场景。
请参阅图2,图2是本申请实施例提供的一种代码运行方法的另一流程示意图。如图2所示,该代码运行方法包括:
201、对上述源代码进行词法分析和语法分析,得到抽象语法树。
在一种可能的实现方式中,对源代码进行编译,编译的步骤有三个:词法分析、语法分析以及生成抽象语法树。
词法分析(lexical analysis)是计算机科学中将字符序列转换为单词(token)序列的过程。进行词法分析的程序或者函数叫做词法分析器(Lexical analyzer,简称Lexer)。词法分析主要是对源程序进行编译预处理(去除注释、无用的回车换行找到包含的文件等)之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别是标识符、保留字、常数、运算符、界符。以便为下面的语法分析和语义分析做准备。可以说词法分析面向的对象是单个的字符,目的是把它们组成有效的单词(字符串)。即词法分析的步骤可以分三步:第一步:打开源文件,读取文件内容,直至遇上’$’文件结束符,然后读取结束;第二步:对读取的文件进行预处理,从头到尾进行扫描,去除//和/**/的内容,以及一些无用的、影响程序执行的符号如换行符、回车符、制表符等;第三步:对源文件从头到尾进行扫描,从头开始扫描,这个时候扫描程序首先要询问当前的字符是不是空格,若是空格,则继续扫描下一个字符,直至不是空格,然后询问这个字符是不是字母,若是则进行标识符和保留字的识别,若这个字符为数字,则进行数字的判断;否则,依次对这个字符可能的情况进行判断,若是将所有可能都走了一遍还是不知道这个字符对应的是什么,则认定为错误符号,输出该错误符号,然后结束。每次成功识别了一个单词后,单词都会存在token[]中。然后确定这个单词的种别码,最后进行下一个单词的识别。
在词法分析后,对生成的单词序列语法分析。语法分析(Syntax analyze)是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.,对词法分析的结果进行校验,判断是否符合语法规则,如变量名是否合法,左右括号是否匹配等等,语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入,生成抽象语法树。其中,语法分析生成抽象语法树的方向可以是自顶向下,也可以自底向上,本申请不做限定,可由开发人员设定。
在语法分析之后,生成抽象语法树,即为完成编译。抽象语法树(AST,abstractsyntax code)是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。
整个编译的过程如图3所示,以源代码a=i+j×k为例,源代码经过词法分析后,得到了多个源代码中的字符,如图3中左下部分,字符分别是a,=,i,+,j,×,k。经过语法分析之后,得到语法分析树,如图3中右边部分,是一个二叉树的结构。
202、遍历上述抽象语法树,得到上述源代码对应的中间代码。
在一种可能的实现方式中,在对源代码进行词法分析和语法分析后,得到了抽象语法树,接下来就是遍历抽象语法树,根据抽象语法树中每个数据节点代表的字符,获取到对应的字符串,根据字符串得到中间代码。其中,对应的字符串由开发人员确定,可以人为设置,例如,当前字符的类型为变量,即确定为读取变量的操作,对应的字符串可以是“load_”,也可以是“loading_”等等。
具体地,对抽象语法树的遍历可以是先序遍历(preorder traversal),也可以是中序遍历(inorder traversal),还可以是后序遍历(postorder traversal)。先序遍历是在抽象语法树数据节点非空的情况下,依次执行如下操作:访问根结点、遍历左子树、遍历右子树;中序遍历是在抽象语法树的数据节点非空的情况下,遍历左子树、访问根结点、遍历右子树;而后序遍历则是在抽象语法树数据节点非空的情况下,遍历左子树、遍历右子树、访问根结点,本申请对遍历的方式不做限定。可以理解的是,生成中间代码的方式应对应一种解析引擎的执行方式。
例如,对于图3中的抽象语法树,以后序遍历的方式为例进行讲解,第一步:遍历左子树的数据节点,即“a”,而“a”的字符类型为变量,即确定当前操作为读取变量a的操作,而预设读取变量的字符对应的字符串为“load_”,则生成的该数据节点对应的字符串为“load_a”。
第二步:遍历右子树的数据节点,本来该遍历“+”,但由于“+”的数据节点存在子数据节点,则先遍历“+”数据节点的左子树数据节点,即“i”,“i”的字符类型也为变量,即确定当前操作为读取变量i的操作,则生成的该数据节点对应的字符串为“load_i”。
第三步:遍历“×”的左子树的数据节点,即“j”,“j”的字符类型也为变量,即确定当前操作为读取变量j的操作,则生成的该数据节点对应的字符串为“load_j”。
第四步:遍历右子树的数据节点,即“k”,“k”的字符类型也为变量,即确定当前操作为读取变量k的操作,则生成的该数据节点对应的字符串为“load_k”。
第五步:遍历第一根节点“×”,“×”的字符类型为操作符,即确定当前操作为乘法操作,因此,对应的字符串可以是“mul”。
第六步:由于“×”没有对应的右子树数据节点,所以遍历第二根节点,即“+”,“+”的字符类型为操作符,即确定当前操作为加法操作,因此,对应的字符串可以是“add”。
第七步:由于“+”没有对应的右子树数据节点,所以遍历第三根节点,即“=”,“=”的字符类型也为操作符,即确定当前操作为赋值操作,左值为a,则可以确定对应的字符串可以为“store_a”。遍历结束。
上述遍历的过程,遍历步骤、符号以及对应生成的字符串的遍历流程可参见表2。
遍历步骤 | 符号 | 生成的字符串 |
1 | a | load_a |
2 | i | load_i |
3 | j | load_j |
4 | k | load_k |
5 | × | mul |
6 | + | add |
7 | = | store_a |
表2
在遍历结束后,得到一系列源代码对应的字符串,如load_a、load_i、load_j、load_k、mul、add、store_a,在得到每一个源代码的字符对应的字符串之后,在源代码中第一字符对应的字符串和第二字符对应的字符串中添加分隔符,其中第一字符串和第二字符串是按照遍历顺序得到的相邻的两个字符串,其中,第一字符串是第二字符串遍历顺序中前一个字符串,对应源代码中,在上述举例的计算式子中,第一字符也是第二字符在源代码中相邻的前一个字符。
分隔符可以是“|”,也可以是“-”,本申请不做限定,分隔符可以是每得到一个对应的字符串,则在后方添加一个分隔符,也可以是在得到源代码对应的所有字符串后,依次添加分隔符。以“|”是分隔符为例,上述得到的中间代码可以是load_a|load_i|load_j|load_k|mul|add|store_a。
在本申请实施例中,在代码的运行过程中,通过源代码运行之前对源代码的编译,生成了一段中间代码,避免了源代码被恶意分析而受到劫持,提高了源代码的防护能力。同时在中间代码后面插入了一段用于运行中间代码的解析引擎,通过运行解析引擎调用执行中间代码,得到源代码的运行结果,用中间代码和解析引擎代码替换源代码在不影响运行速度的情况下,很大程度的提高了代码的防护能力,并且能应用于高要求的场景。
请参阅图5,图5是本申请实施例提供的一种代码运行装置的结构示意图。如图5所示,该代码运行装置5000包括:
启动单元501,用于当检测到用于运行源代码的运行指令时,启动解析引擎;
调用单元502,用于通过上述解析引擎调用中间代码,上述中间代码为上述源代码编译后的代码;
运行单元503,用于运行上述中间代码。
在一种可能的实现方式中,上述代码运行装置5000还包括:
分析单元504,用于对上述源代码进行词法分析和语法分析,得到抽象语法树;
遍历单元505,用于遍历上述抽象语法树,得到上述源代码对应的中间代码。
在一种可能的实现方式中,上述遍历单元305,具体用于:
获取上述抽象语法树中每个数据节点代表的字符;
根据字符类型与字符串的对应关系获取上述字符对应的字符串;
根据获取的字符串生成中间代码。
在一种可能的实现方式中,上述遍历单元505,具体用于:
在第一字符串和第二字符串之间添加分隔符,得到中间代码,上述第一字符串为获取的字符中的第一字符对应的字符串,上述第二字符串为获取的字符中的第二字符对应的字符串,上述第一字符是与上述第二字符相邻的前一个字符。
在一种可能的实现方式中,上述运行单元503,具体用于:
根据上述分隔符和上述中间代码确定字符串;
根据上述对应关系和上述字符串确定上述源代码中变量的计算规则和取值;
根据上述计算规则和上述取值运行上述中间代码。
在一种可能的实现方式中,上述代码运行装置5000还包括:
存储单元506,用于以栈的方式存储上述取值。
在本申请实施例中,在代码的运行过程中,通过源代码运行之前对源代码的编译,生成了一段中间代码,避免了源代码被恶意分析而受到劫持,提高了源代码的防护能力。同时在中间代码后面插入了一段用于运行中间代码的解析引擎,通过运行解析引擎调用执行中间代码,得到源代码的运行结果,用中间代码和解析引擎代码替换源代码在不影响运行速度的情况下,很大程度的提高了代码的防护能力,并且能应用于高要求的场景。
可以理解的是,本实施例的服务器的启动单元501、调用单元502、运行单元503、分析单元504、遍历单元505、存储单元506的功能可以根据上述方法实施例中的方法具体实现,其具体实现过程可以参照上述方法实施例的相关描述,此处不再赘述。
请参阅图6,图6是本申请实施例提供的电子设备的结构示意图。如图6所示,本实施例中的电子设备可以包括:一个或多个处理器601和存储器602。上述处理器601和存储器602通过总线603连接。存储器602用于存储计算机程序,该计算机程序包括程序指令,处理器601用于执行存储器602存储的程序指令,其中,处理器601被配置用于调用程序指令执行以下步骤:
当检测到用于运行源代码的运行指令时,启动解析引擎;
通过上述解析引擎调用中间代码,上述中间代码为上述源代码编译后的代码;
运行上述中间代码。
在一种可能的实现方式中,上述处理器601还被调用执行如下步骤:
对上述源代码进行词法分析和语法分析,得到抽象语法树;
遍历上述抽象语法树,得到上述源代码对应的中间代码。
在一种可能的实现方式中,上述处理器601遍历上述抽象语法树,得到上述源代码对应的中间代码包括:
获取上述抽象语法树中每个数据节点代表的字符;
根据字符类型与字符串的对应关系获取上述字符对应的字符串;
根据获取的字符串生成中间代码。
在一种可能的实现方式中,上述处理器601根据获取的字符串生成中间代码包括:
在第一字符串和第二字符串之间添加分隔符,得到中间代码,上述第一字符串为获取的字符中的第一字符对应的字符串,上述第二字符串为获取的字符中的第二字符对应的字符串,上述第一字符是与上述第二字符相邻的前一个字符。
在一种可能的实现方式中,上述处理器601运行上述中间代码包括:
根据上述分隔符和上述中间代码确定字符串;
根据上述对应关系和上述字符串确定上述源代码中变量的计算规则和取值;
根据上述计算规则和上述取值运行上述中间代码。
在一种可能的实现方式中,上述处理器601还被调用执行以下步骤:
以栈的方式存储上述取值。
应当理解,在一些可行的实施方式中,上述处理器601可以是中央处理单元(central processing unit,CPU),该处理器还可以是其他通用处理器、数字信号处理器(digital signal processor,DSP)、专用集成电路(application specific integratedcircuit,ASIC)、现成可编程门阵列(field-programmable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
该存储器602可以包括只读存储器和随机存取存储器,并向处理器601提供指令和数据。存储器602的一部分还可以包括非易失性随机存取存储器。例如,存储器602还可以存储设备类型的信息。
具体实现中,上述终端设备可通过其内置的各个功能模块执行如上述图1至图3中各个步骤所提供的实现方式,具体可参见上述各个步骤所提供的实现方式,在此不再赘述。
在本申请实施例中,在代码的运行过程中,通过源代码运行之前对源代码的编译,生成了一段中间代码,避免了源代码被恶意分析而受到劫持,提高了源代码的防护能力。同时在中间代码后面插入了一段用于运行中间代码的解析引擎,通过运行解析引擎调用执行中间代码,得到源代码的运行结果,用中间代码和解析引擎代码替换源代码在不影响运行速度的情况下,很大程度的提高了代码的防护能力,并且能应用于高要求的场景。
本申请实施例还提供一种计算机可读存储介质,该计算机可读存储介质存储有计算机程序,该计算机程序包括程序指令,该程序指令被处理器执行时实现图1至图3中各个步骤所提供的方法,具体可参见上述各个步骤所提供的实现方式,在此不再赘述。
上述计算机可读存储介质可以是前述任一实施例提供的任务处理装置或者上述终端设备的内部存储单元,例如电子设备的硬盘或内存。该计算机可读存储介质也可以是该电子设备的外部存储设备,例如该电子设备上配备的插接式硬盘,智能存储卡(smartmedia card,SMC),安全数字(secure digital,SD)卡,闪存卡(flash card)等。上述计算机可读存储介质还可以包括磁碟、光盘、只读存储记忆体(read-only memory,ROM)或随机存储记忆体(randomaccessmemory,RAM)等。进一步地,该计算机可读存储介质还可以既包括该电子设备的内部存储单元也包括外部存储设备。该计算机可读存储介质用于存储该计算机程序以及该电子设备所需的其他程序和数据。该计算机可读存储介质还可以用于暂时地存储已经输出或者将要输出的数据。
本申请的权利要求书和说明书及附图中的术语“第一”、“第二”等是用于区别不同对象,而不是用于描述特定顺序。此外,术语“包括”和“具有”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置展示该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。在本申请说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
以上所揭露的仅为本申请较佳实施例而已,当然不能以此来限定本申请之权利范围,因此依本申请权利要求所作的等同变化,仍属本申请所涵盖的范围。
Claims (10)
1.一种代码运行方法,其特征在于,包括:
当检测到用于运行源代码的运行指令时,启动解析引擎;
通过所述解析引擎调用中间代码,所述中间代码为所述源代码编译后的代码;
运行所述中间代码。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
对所述源代码进行词法分析和语法分析,得到抽象语法树;
遍历所述抽象语法树,得到所述源代码对应的中间代码。
3.根据权利要求2所述的方法,其特征在于,所述遍历所述抽象语法树,得到所述源代码对应的中间代码包括:
获取所述抽象语法树中每个数据节点代表的字符;
根据字符类型与字符串的对应关系获取所述字符对应的字符串;
根据获取的字符串生成中间代码。
4.根据权利要求3所述的方法,其特征在于,所述根据获取的字符串生成中间代码包括:
在第一字符串和第二字符串之间添加分隔符,得到中间代码,所述第一字符串为获取的字符中的第一字符对应的字符串,所述第二字符串为获取的字符中的第二字符对应的字符串,所述第一字符是与所述第二字符相邻的前一个字符。
5.根据所述权利要求4所述的方法,其特征在于,所述运行所述中间代码包括:
根据所述分隔符和所述中间代码确定字符串;
根据所述对应关系和所述字符串确定所述源代码中变量的计算规则和取值;
根据所述计算规则和所述取值运行所述中间代码。
6.根据权利要求5所述的方法,其特征在于,所述方法还包括:
以栈的方式存储所述取值。
7.一种代码运行装置,其特征在于,包括:
启动单元,用于当检测到用于运行源代码的运行指令时,启动解析引擎;
调用单元,用于通过所述解析引擎调用中间代码,所述中间代码为所述源代码编译后的代码;
运行单元,用于运行所述中间代码。
8.根据权利要求7所述的装置,其特征在于,所述装置还包括:
分析单元,用于对所述源代码进行词法分析和语法分析,得到抽象语法树;
遍历单元,用于遍历所述抽象语法树,得到所述源代码对应的中间代码。
9.一种电子设备,其特征在于,包括处理器和存储器,所述处理器和存储器相互连接;
所述存储器用于存储计算机程序,所述计算机程序包括程序指令,所述处理器被配置用于调用所述程序指令,执行如权利要求1-6任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时使所述处理器执行如权利要求1-6任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910354380.1A CN110096264A (zh) | 2019-04-29 | 2019-04-29 | 一种代码运行方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910354380.1A CN110096264A (zh) | 2019-04-29 | 2019-04-29 | 一种代码运行方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110096264A true CN110096264A (zh) | 2019-08-06 |
Family
ID=67446326
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910354380.1A Pending CN110096264A (zh) | 2019-04-29 | 2019-04-29 | 一种代码运行方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110096264A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110647360A (zh) * | 2019-08-20 | 2020-01-03 | 百度在线网络技术(北京)有限公司 | 协处理器的设备执行代码的处理方法、装置、设备及计算机可读存储介质 |
CN111026401A (zh) * | 2019-12-05 | 2020-04-17 | 杭州有赞科技有限公司 | 一种移动端热修复方法 |
CN111209004A (zh) * | 2019-12-30 | 2020-05-29 | 北京健康之家科技有限公司 | 代码转换方法及装置 |
CN114610643A (zh) * | 2022-03-23 | 2022-06-10 | 一点灵犀信息技术(广州)有限公司 | 代码性能检测方法、装置和电子设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130055223A1 (en) * | 2011-08-25 | 2013-02-28 | Myezapp Inc. | Compiler with Error Handling |
CN103631632A (zh) * | 2013-11-29 | 2014-03-12 | 华为技术有限公司 | 移植方法及源到源编译器 |
US8850416B1 (en) * | 2005-03-11 | 2014-09-30 | Appcelerator, Inc. | System and method for creating target byte code |
CN105069355A (zh) * | 2015-08-26 | 2015-11-18 | 厦门市美亚柏科信息股份有限公司 | webshell变形的静态检测方法和装置 |
CN109255209A (zh) * | 2017-07-13 | 2019-01-22 | 阿里巴巴集团控股有限公司 | 一种数据处理方法、装置、设备和存储介质 |
-
2019
- 2019-04-29 CN CN201910354380.1A patent/CN110096264A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8850416B1 (en) * | 2005-03-11 | 2014-09-30 | Appcelerator, Inc. | System and method for creating target byte code |
US20130055223A1 (en) * | 2011-08-25 | 2013-02-28 | Myezapp Inc. | Compiler with Error Handling |
CN103631632A (zh) * | 2013-11-29 | 2014-03-12 | 华为技术有限公司 | 移植方法及源到源编译器 |
CN105069355A (zh) * | 2015-08-26 | 2015-11-18 | 厦门市美亚柏科信息股份有限公司 | webshell变形的静态检测方法和装置 |
CN109255209A (zh) * | 2017-07-13 | 2019-01-22 | 阿里巴巴集团控股有限公司 | 一种数据处理方法、装置、设备和存储介质 |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110647360A (zh) * | 2019-08-20 | 2020-01-03 | 百度在线网络技术(北京)有限公司 | 协处理器的设备执行代码的处理方法、装置、设备及计算机可读存储介质 |
CN110647360B (zh) * | 2019-08-20 | 2022-05-03 | 百度在线网络技术(北京)有限公司 | 协处理器的设备执行代码的处理方法、装置、设备及计算机可读存储介质 |
CN111026401A (zh) * | 2019-12-05 | 2020-04-17 | 杭州有赞科技有限公司 | 一种移动端热修复方法 |
CN111209004A (zh) * | 2019-12-30 | 2020-05-29 | 北京健康之家科技有限公司 | 代码转换方法及装置 |
CN111209004B (zh) * | 2019-12-30 | 2023-09-01 | 北京水滴科技集团有限公司 | 代码转换方法及装置 |
CN114610643A (zh) * | 2022-03-23 | 2022-06-10 | 一点灵犀信息技术(广州)有限公司 | 代码性能检测方法、装置和电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112100054B (zh) | 一种面向数据管控的程序静态分析方法和系统 | |
CN110096264A (zh) | 一种代码运行方法及装置 | |
CN108614707A (zh) | 静态代码检查方法、装置、存储介质和计算机设备 | |
CN109491658A (zh) | 计算机可执行代码数据的生成方法及装置 | |
CN111124479B (zh) | 配置文件的解析方法、系统及电子设备 | |
CN112231068B (zh) | 使用领域专用语言的自定义逻辑方法、系统和可读介质 | |
US5822592A (en) | Method and system for determining source code location | |
CN113987405A (zh) | 一种基于ast的数学表达式计算算法 | |
Uhl et al. | An attribute grammar for the semantic analysis of Ada | |
CN113508385B (zh) | 使用子例程图谱进行形式语言处理的方法和系统 | |
CN111381828A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
Koskimies et al. | The design of a language processor generator | |
CN111381826A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
KR102614967B1 (ko) | 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법 | |
CN114895914A (zh) | 日志输出代码的生成方法、装置、电子设备及存储介质 | |
CN110737431B (zh) | 软件开发方法、开发平台、终端设备及存储介质 | |
Bianchi et al. | An efficient verifier of truly concurrent properties | |
CN111381814A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
CN110244954A (zh) | 一种应用程序的编译方法及设备 | |
CN111381827A (zh) | 生成代码文件的语法树的方法、装置及电子设备 | |
Lu et al. | A formal methodology using attributed grammars for multiprocessing-system software development. I. Design representation | |
CN116069633B (zh) | 代码的检验方法、装置、电子设备及存储介质 | |
CN113971028B (zh) | 数据处理方法、装置、设备、存储介质及计算机程序产品 | |
Jordan et al. | The Development of Lexer and Parser as parts of compiler for GAMA32 processor’s instruction-set using Python | |
CN112860262B (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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20190806 |