一种编译方法、装置、设备、介质和产品与流程

文档序号:31203207发布日期:2022-08-20 02:06阅读:68来源:国知局
一种编译方法、装置、设备、介质和产品与流程

1.本公开涉及计算机技术领域,尤其涉及一种编译方法、装置、设备、介质和产品。


背景技术:

2.随着计算机的不断发展,可以采用不同类型的语言(比如,解释型语言、编译型语言等)开发应用程序。
3.在采用解释型语言开发应用程序的时候,意味着在程序分发的时候需要携带源代码。通过阅读源代码对应用程序进行破解,从而对产品带来了极大的风险。因此,如何对避免源代码被阅读和篡改,是一个亟待解决的问题。


技术实现要素:

4.本公开提供一种编译方法、装置、设备、介质和产品,以解决现有技术中源代码被阅读和篡改的问题,能够提前对源代码进行编译、加密和隐藏,从而避免了源代码被阅读和篡改。
5.根据本公开的一方面,提供了一种编译方法,包括:
6.将预先获取的原始源代码编译成对应的原始字节码;其中,所述原始源代码为解释型语言;
7.根据所述原始字节码对应的加密字节码和预先获取的原生代码模板生成对应的动态链接库或静态链接库;
8.响应于程序的运行操作,读取并解密所述动态链接库或静态链接库中的加密字节码,得到解密字节码;
9.调用预先创建的代码运行器运行所述解密字节码。
10.根据本公开的另一方面,提供了一种编译装置,包括:
11.编译模块,用于将预先获取的原始源代码编译成对应的原始字节码;其中,所述原始源代码为解释型语言;
12.生成模块,用于根据所述原始字节码对应的加密字节码和预先获取的原生代码模板生成对应的动态链接库或静态链接库;
13.解密模块,用于响应于程序的运行操作,读取并解密所述动态链接库或静态链接库中的加密字节码,得到解密字节码;
14.调用运行模块,用于调用预先创建的代码运行器运行所述解密字节码。
15.根据本公开的另一方面,提供了一种电子设备,所述电子设备包括:
16.至少一个处理器;以及
17.与所述至少一个处理器通信连接的存储器;其中,
18.所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器能够执行本公开任一实施例所述的编译方法。
19.根据本公开的另一方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述计算机指令用于使处理器执行时实现本公开任一实施例所述的编译方法。
20.根据本公开的另一方面,提供了一种计算机程序产品,所述计算机程序产品包括计算机程序,所述计算机程序在被处理器执行时实现本公开任一实施例所述的编译方法。
21.本公开实施例的技术方案,通过将解释型语言的原始源代码预先编译成对应的原始字节码,然后对原始字节码进行加密,并根据加密字节码和预先获取的原生代码模板生成对应的动态链接库或静态链接库;然后在动态链接库或静态链接库中实现代码的解密和代码运行的逻辑,并调用代码运行器运行解密字节码,从而使得攻击者无法获取到源代码以及程序逻辑,以及无法对源代码和程序逻辑进行非法阅读和篡改。
22.应当理解,本部分所描述的内容并非旨在标识本公开的实施例的关键或重要特征,也不用于限制本公开的范围。本公开的其它特征将通过以下的说明书而变得容易理解。
附图说明
23.为了更清楚地说明本公开实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
24.图1为本公开实施例提供的一种编译方法的流程图;
25.图2为本公开实施例提供的另一种编译方法的流程图;
26.图3为本公开实施例提供的一种编译装置的结构示意图;
27.图4是本公开实施例提供的一种电子设备的结构示意图。
具体实施方式
28.为了使本技术领域的人员更好地理解本公开方案,下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分的实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本公开保护的范围。
29.需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“原始”、“加密”、“解密”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
30.在一实施例中,图1为本公开实施例提供的一种编译方法的流程图,本实施例可适用于对源代码进行保护的情况,该方法可以由编译装置来执行,该编译装置可以采用硬件和/或软件的形式实现,该编译装置可配置于电子设备中。如图1所示,该方法包括:
31.s110、将预先获取的原始源代码编译成对应的原始字节码。
32.其中,原始源代码为解释型语言。在实施例中,源代码指的是未编译的按照一定的程序设计语言规范书写的文本文件,是可读的计算机语言指令。在实施例中,原始源代码可以为解释型语言。在实施例中,可以通过预先配置的编译模块对原始源代码进行预先编译,得到对应的字节码,作为原始字节码。当然,在实际编译过程中,原始源代码所运行环境可以是不同的,对应的所采用的编译模块也可以是不同的。示例性地,在原始源代码所对应的运行环境为环境1,则可以采用编译模块1对原始源代码进行编译,得到对应的字节码;又如,在原始源代码所对应的运行环境为环境2,则可以采用编译模块2,对原始源代码进行编译,得到对应的字节码。需要说明的是,不同的运行环境,所采用的编译模块可以是相同类型的编译模块,也可以为不同类型的编译模块。
33.s120、根据原始字节码对应的加密字节码和预先获取的原生代码模板生成对应的动态链接库或静态链接库。
34.其中,加密字节码指的是对原始字节码进行加密得到的字节码。可以理解为,采用预设加密算法对原始字节码进行加密,得到对应的加密字节码。在实际加密过程中,可以根据原始源代码所对应的业务自定义加密算法,并通过加密算法对原始字节码进行加密,得到对应的加密字节码。
35.其中,原生代码模板指的是可以用于存储字节码的原生代码文件。示例性地,原生代码模板可以为c语言的代码文件,也可以为其它编程语言的代码文件。在实施例中,预先获取一个原生代码模板,然后将原始字节码所对应的所有加密字节码所对应文件的所有数据插入至预先获取的原生代码模板,编译得到对应的动态链接库或静态链接库。其中,动态链接库指的是dll文件;静态链接库指的是lib文件。
36.在实施例中,可以采用预先配置的原生代码生成器对原生代码模板进行编译,得到对应的动态链接库或静态链接库。
37.s130、响应于程序的运行操作,读取并解密动态链接库或静态链接库中的加密字节码,得到解密字节码。
38.在实施例中,读取动态链接库或静态链接库中的加密字节码,并采用预设解密算法对加密字节码进行解密,得到对应的解密字节码。需要说明的是,对原始字节码采用的预设加密算法,和对加密字节码采用的预设解密算法,可以是对称密钥,也可以采用非对称密钥等可逆的加密算法,对此并不进行限定。可以理解为,在采用对称密钥进行解密时,加密密钥和解密密钥是相同的;在采用非对称密钥进行解密时,加密密钥和解密密钥是不相同的。
39.s140、调用预先创建的代码运行器运行解密字节码。
40.其中,代码运行器指的是可以加载动态链接库或静态链接库的模块。在实施例中,可以在代码运行器中加载动态链接库或静态链接库,以调用运行函数对解密字节码进行运行。
41.本公开实施例的技术方案,通过将解释型语言的原始源代码预先编译成对应的原始字节码,然后对原始字节码进行加密,并将加密字节码存储至动态链接库或静态链接库;然后在动态链接库或静态链接库中实现代码的解密和代码运行的逻辑,并调用代码运行器运行解密字节码,从而使得攻击者无法获取到源代码以及程序逻辑,以及无法对源代码和
程序逻辑进行非法阅读和篡改。
42.在一实施例中,图2为本公开实施例提供的另一种编译方法的流程图,本实施例是在上述实施例的基础上,对上述步骤作进一步的说明。如图2所示,该方法包括:
43.s210、通过预先配置的字节码编译器对预先获取的原始源代码进行编译,得到对应的原始字节码。
44.其中,原始源代码为一个或多个原始源代码文件所对应的源代码。在实施例中,字节码编译器用于将所有源代码编译为字节码的工具。需要说明的是,字节码编译器也可以是一个代码运行器,其中,代码运行器用于对动态链接库或静态链接库进行加载和运行的工具。可以理解为,在代码运行器具备编译功能的情况下,可以将代码运行器作为字节码编译器。在实施例中,可以逐个对原始源代码文件进行编译,得到对应的原始字节码;也可以将多个原始源代码文件合并成一个文件进行编译,得到对应的原始字节码。在实施例中,利用所使用语言自带的字节码编译器或代码运行器中携带的编译功能,对原始源代码进行编译,得到对应的原始字节码。
45.需要说明的是,在原始源代码所对应的运行环境为特殊环境(比如,node.js)时,可以采用代码运行器对原始源代码进行编译,得到对应的原始字节码;而在原始源代码所对应的运行环境为常规环境时,可以直接采用字节码编译器对原始源代码进行编译,得到对应的原始字节码。
46.s220、确定加密字节码对应的预设元素类型的数组声明表达式。
47.其中,预设元素类型指的是预先配置的元素类型。示例性地,预设元素类型可以为char类型。在实施例中,可以将加密字节码所对应的数据读取至内存中,获取一个元素类型为char类型的数组,并将该数组存储于数组声明表达式中。示例性地,可以将加密字节码转换为[1,2,3,4]的字符串,然后将该字符串作为代码片段,并利用该代码片段生成对应的数据声明表达式。
[0048]
s230、对数组声明表达式和加密字节码所对应字节码的唯一标识名称进行处理,生成对应的代码片段。
[0049]
在一实施例中,s230包括:
[0050]
s2301、将加密字节码所对应字节码的唯一标识名称的字符串作为键,以及将数组声明表达式所创建的数组作为值。
[0051]
其中,字节码的唯一标识名称用于表征每个字节码的唯一标识。示例性地,字节码的唯一标识名称可以为字节码的文件相对路径。其中,文件相对路径指的是这个文件所在的路径引起的与其它文件的路径关系。在实施例中,将加密字节码所对应字节码的唯一标识名称作为键,并将数组声明表达式所创建的数组作为值。
[0052]
s2302、将键和值按照预设数据类型进行组合,得到对应的代码片段。
[0053]
其中,预设数据类型指的是hash map结构。示例性地,预设数据类型可以为c++标准库中的std:map,也可以是python中的dict。在实施例中,将加密字节码所对应字节码的唯一标识名称的字符串作为键,以及将数组声明表达式所创建的数组作为值,得到一个键值对,将该键和值按照预设数据类型进行组合,得到对应的代码片段。
[0054]
示例性地,假设以c++为例,将字节码保存在hashmap中,生成如下代码片段:
[0055]
std::map《std::string,
[0056]
std::vector《char》》map;
[0057]
map[“字节码1唯一标识符”]=字节码1内容;
[0058]
map[“字节码2唯一标识符”]=字节码2内容;
[0059]
s240、将代码片段插入至预先获取的原生代码模板,编译得到对应的动态链接库或静态链接库。
[0060]
在一实施例中,原生代码模板至少包括下述函数:加密字节码的获取函数;解密字节码的获取函数。在实施例中,原生代码模板需要具备获取加密字节码的功能,以及获取解密字节码的功能。在实施例中,可以通过自定义获取函数,实现加密字节码和解密字节码的获取功能,即自定义一个获取加密字节码的函数,以及自定义一个获取解密字节码的函数。
[0061]
其中,将代码片段插入至原生代码模板中可以动态插入代码的区域,并调用原生代码编译器,对已将代码片段动态插入的原生代码模板进行编译,得到对应的动态链接库或静态链接库。
[0062]
s250、根据加密字节码在动态链接库或静态链接库中的所处位置确定对应的读取方式。
[0063]
其中,读取方式指的是从动态链接库或静态链接库中读取加密字节码的方式。在实际操作过程中,加密字节码可以保存在不同的位置,相应的,加密字节码的读取方式也可以是不同的。示例性地,加密字节码可以保存在pe资源表中,也可以作为常量保存在可执行文件中。
[0064]
s260、按照读取方式读取动态链接库或静态链接库中的加密字节码。
[0065]
在实施例中,在加密字节码保存在pe资源表中的情况下,可以利用loadresource的方法读取解密字节码;在加密字节码作为一个常量保存在可执行文件中,则可以直接访问该常量,即可获取到加密字节码。
[0066]
s270、采用预设解密算法对加密字节码进行解密,得到解密字节码。
[0067]
其中,预设解密算法可以与预设加密算法是对称密钥,也可以是非对称密钥。当然,在预设解密算法和预设加密算法所采用的是对称密钥,则对加密字节码进行解密的密钥,与对原始字节码进行加密的密钥是相同的;在预设解密算法和预设加密算法所采用的是非对称密钥,则对加密字节码进行解密的密钥,与对原始字节码进行加密的密钥是不同的。
[0068]
s280、获取代码运行器加载动态链接库或静态链接库的运行函数。
[0069]
在实施例中,在采用代码运行器加载动态链接库或静态链接库的时候,代码运行器可以暴露一些运行函数,返回至所加载的动态链接库或静态链接库。
[0070]
s290、通过运行函数运行解密字节码。
[0071]
在实施例中,通过暴露的运行函数对解密字节码进行运行。当然,也可以通过运行函数运行源代码。
[0072]
本公开实施例的技术方案,在上述实施例的基础上,通过代码运行器加载动态链接库或静态链接库的同时所暴露的运行函数,触发对加密字节码的读取、解密和运行的步骤,从而实现了在动态链接库或静态链接库中实现代码的解密和代码运行的逻辑,并调用代码运行器运行解密字节码,从而使得攻击者无法获取到源代码以及程序逻辑,以及无法对源代码和程序逻辑进行非法阅读和篡改。
[0073]
在一实施例中,对代码加载器的实现过程进行说明。在实施例中,代码加载器指的是一个用原生语言(例如c++)开发的动态链接库或静态链接库。其作用有两个:存储加密后的字节码;解密并运行字节码。
[0074]
在实施例中,该代码加载器的具体实现过程包括:
[0075]
s10、读取自身所存储的加密字节码。
[0076]
在实施例中,加密字节码的读取方式有很多种,例如对于windows平台下的动态链接库,如果加密后的字节码被保存在pf资源表中,则可以利用load resource的方法讲行读取;如果是利用代码生成器,将加密后的字节码作为一个常量保存在原生程序代码中,则只要直接访问这个常量就能获取到加密后的字节码。
[0077]
s11、读取到加密后的字节码以后,对加密字节码进行解密,得到解密字节码。
[0078]
在实施例中,加解密方法有很多种,在本方案中可以根据业务做自定义,简单的比如异或加密,复杂的可以是高级加密标准(advanced encryption standard,aes)加密。
[0079]
s12、调用代码运行器,运行解密字节码。
[0080]
在实施例中,解释型语言是通过代码运行器运行的,代码运行器可以加载动态链接库或者在编译的时候加载静态链接库,代码运行器通常暴露一些函数给自身所加载的动态链接库或静态链接库用于运行源代码或者字节码。在本实施例中,利用暴露的运行函数运行解密字节码。
[0081]
在实施例中,代码加载器是以动态链接库或静态链接库的形式进行分发的,通常会暴露一个运行函数,用于触发上述的字节码读取、解密、运行的步骤。在实施例中,只要在程序运行宿主(类似electron或者node.js这种用于运行解释型语言的运行器)中加载“代码加载器”并执行上面所说的运行函数,就能运行程序逻辑。
[0082]
在一实施例中,对编译程序的过程进行说明。其中,编译程序指的是将程序源代码编译成可用的代码加载器的工具。在实施例中,编译程序由以下三个模块组成:字节码编译器;原生代码生成器;代码加载器的编译工具或者加工工具。
[0083]
其一,字节码编译器的作用是将所有源代码文件编译为字节码的工具。具体的,字节码编译器的实现过程包括:
[0084]
s21、如果有多个源代码文件,可以将代码合并成一个文件进行编译,也可以逐个对文件进行编译。
[0085]
s22、利用所使用语言自带的代码编译器或者运行器中携带的编译功能,将所有源代码编译为字节码。
[0086]
在实施例中,将源代码编译成字节码一般是代码编译器的工作,只不过一些特殊的运行环境,例如node.js,是通过编写代码在代码运行器中运行,以便将源代码编译成字节码。
[0087]
在一实施例中,基于字节码编译器产生的字节码文件,自动生成原生代码。对原生代码生成器的实现过程进行说明。具体的,采用原生代码生成器得到动态链接库或静态链接库的实现过程包括:
[0088]
首先,获取一个存储字节码的原生代码模板。
[0089]
在实施例中,原生代码模板一般是c语言的代码文件,也可以是其他编程语言的文件,模板的内容为对应编程语言中的如下内容:
[0090]
其一,定义一个获取加密后字节码的函数,内部实现为:
[0091]
定义一个散列表;一个可以动态插入代码的区域,代码内容是往散列表中添加一个键值对;返回散列表。
[0092]
其二,定义一个获取解密后字节码的函数,内部实现为:
[0093]
调用获取加密后字节码函数、获取加密后的字节码;利用解密方法,对字节码进行解密,获得原始字节码;返回原始字节码
[0094]
其中,其他代码内容是“代码加载器”的实现代码。
[0095]
然后,将所有字节码文件的数据读取至内存中,将获得一个元素类型为char类型的数组,将数组转换为所使用的原生编程语言中的数组声明表达式(例如在c语言中可以转换为[1,2,3,4]的字符串。
[0096]
然后,将数组声明表达式和字节码的唯一标识名称(比如,可以为字节码文件的相对路径)进行处理,生成一个往散列表中插入数据的代码片段,内容是将字节码的唯一标识名称作为键,以及将数组声明表达式所创建的数组作为值。接着将代码片段插入原生代码模板中的“可以动态插入代码的区域”。
[0097]
最后,调用原生代码编译器,编译处理后的原生代码模板,编译出动态链接库或静态链接库。
[0098]
如此一来,只要在代码运行器中加载“代码加载器”,并调用“运行函数”,就能正常运行程序代码逻辑了。在程序分发的时候,只需要分发“代码运行器”、“代码加载器”即可,代码加载器中包含加密字节码,开且解密逻辑是难以反编译的。并且字节码相比源代码来说更难以阅读和解析,也起到了保护源代码的作用。
[0099]
在一实施例中,图3为本公开实施例提供的一种编译装置的结构示意图。如图3所示,该装置包括:编译模块310、生成模块320、解密模块330和调用运行模块340。
[0100]
其中,编译模块310,用于将预先获取的原始源代码编译成对应的原始字节码;其中,所述原始源代码为解释型语言;
[0101]
生成模块320,用于根据所述原始字节码对应的加密字节码和预先获取的原生代码模板生成对应的动态链接库或静态链接库;
[0102]
解密模块330,用于响应于程序的运行操作,读取并解密所述动态链接库或静态链接库中的加密字节码,得到解密字节码;
[0103]
调用运行模块340,用于调用预先创建的代码运行器运行所述解密字节码。
[0104]
需要说明的是,解密模块330和调用运行模块340作为逻辑单元,可以包含在动态链接库或静态链接库中。可以理解为,通过动态链接库或静态链接库中包含的解密模块330对加密字节码进行解密,得到解密字节码;然后通过动态链接库或静态链接库中包含的调用运行模块340调用代码运行器运行解密字节码。
[0105]
可选的,编译模块310具体用于:通过预先配置的字节码编译器或代码运行器对预先获取的原始源代码进行编译,得到对应的原始字节码;其中,所述原始源代码为一个或多个原始源代码文件所对应的源代码。
[0106]
可选的,生成模块320,包括:
[0107]
确定单元,用于确定所述加密字节码对应的预设元素类型的数组声明表达式;
[0108]
生成单元,用于对所述数组声明表达式和所述加密字节码所对应字节码的唯一标
识名称进行处理,生成对应的代码片段;
[0109]
编译单元,用于将所述代码片段插入至预先获取的原生代码模板,编译得到对应的动态链接库或静态链接库。
[0110]
可选地,解密模块330,包括:
[0111]
第一确定单元,用于根据所述加密字节码在动态链接库或静态链接库中的所处位置确定对应的读取方式;
[0112]
读取单元,用于按照所述读取方式读取所述动态链接库或静态链接库中的加密字节码;
[0113]
解密单元,用于采用预设解密算法对所述加密字节码进行解密,得到解密字节码。
[0114]
可选地,调用运行模块340,包括:
[0115]
获取单元,用于获取代码运行器加载动态链接库或静态链接库的运行函数;
[0116]
运行单元,用于通过所述运行函数运行所述解密字节码。
[0117]
可选地,生成单元,包括:
[0118]
确定子单元,用于将所述加密字节码所对应字节码的唯一标识名称的字符串作为键,以及将所述数组声明表达式所创建的数组作为值;
[0119]
生成子单元,用于将所述键和所述值按照预设数据类型进行组合,得到对应的代码片段。
[0120]
可选地,所述原生代码模板至少包括下述函数:加密字节码的获取函数;解密字节码的获取函数。
[0121]
本公开实施例所提供的编译装置可执行本公开任意实施例所提供的编译方法,具备执行方法相应的功能模块和有益效果。
[0122]
在一实施例中,图4是本公开实施例提供的一种电子设备的结构示意图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备(如头盔、眼镜、手表等)和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
[0123]
如图4所示,电子设备10包括至少一个处理器11,以及与至少一个处理器11通信连接的存储器,如只读存储器(rom)12、随机访问存储器(ram)13等,其中,存储器存储有可被至少一个处理器执行的计算机程序,处理器11可以根据存储在只读存储器(rom)12中的计算机程序或者从存储单元18加载到随机访问存储器(ram)13中的计算机程序,来执行各种适当的动作和处理。在ram 13中,还可存储电子设备10操作所需的各种程序和数据。处理器11、rom 12以及ram 13通过总线14彼此相连。输入/输出(i/o)接口15也连接至总线14。
[0124]
电子设备10中的多个部件连接至i/o接口15,包括:输入单元16,例如键盘、鼠标等;输出单元17,例如各种类型的显示器、扬声器等;存储单元18,例如磁盘、光盘等;以及通信单元19,例如网卡、调制解调器、无线通信收发机等。通信单元19允许电子设备10通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
[0125]
处理器11可以是各种具有处理和计算能力的通用和/或专用处理组件。处理器11的一些示例包括但不限于中央处理单元(cpu)、图形处理单元(gpu)、各种专用的人工智能
(ai)计算芯片、各种运行机器学习模型算法的处理器、数字信号处理器(dsp)、以及任何适当的处理器、控制器、微控制器等。处理器11执行上文所描述的各个方法和处理,例如编译方法。
[0126]
在一些实施例中,编译方法可被实现为计算机程序,其被有形地包含于计算机可读存储介质,例如存储单元18。在一些实施例中,计算机程序的部分或者全部可以经由rom 12和/或通信单元19而被载入和/或安装到电子设备10上。当计算机程序加载到ram 13并由处理器11执行时,可以执行上文描述的编译方法的一个或多个步骤。备选地,在其他实施例中,处理器11可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行编译方法,包括:将预先获取的原始源代码编译成对应的原始字节码;其中,所述原始源代码为解释型语言;根据所述原始字节码对应的加密字节码和预先获取的原生代码模板生成对应的动态链接库或静态链接库;响应于程序的运行操作,读取并解密所述动态链接库或静态链接库中的加密字节码,得到解密字节码;调用预先创建的代码运行器运行所述解密字节码。
[0127]
本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、场可编程门阵列(fpga)、专用集成电路(asic)、专用标准产品(assp)、芯片上系统的系统(soc)、负载可编程逻辑设备(cpld)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。
[0128]
用于实施本公开的方法的计算机程序可以采用一个或多个编程语言的任何组合来编写。这些计算机程序可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器,使得计算机程序当由处理器执行时使流程图和/或框图中所规定的功能/操作被实施。计算机程序可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
[0129]
在本公开的上下文中,计算机可读存储介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的计算机程序。计算机可读存储介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。备选地,计算机可读存储介质可以是机器可读信号介质。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或快闪存储器)、光纤、便捷式紧凑盘只读存储器(cd-rom)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
[0130]
为了提供与用户的交互,可以在电子设备上实施此处描述的系统和技术,该电子设备具有:用于向用户显示信息的显示装置(例如,crt(阴极射线管)或者lcd(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给电子设备。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
[0131]
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(lan)、广域网(wan)、区块链网络和互联网。
[0132]
计算系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,又称为云计算服务器或云主机,是云计算服务体系中的一项主机产品,以解决了传统物理主机与vps服务中,存在的管理难度大,业务扩展性弱的缺陷。
[0133]
根据本公开的一个或多个实施例,【示例1】提供了一种编译方法,包括:
[0134]
将预先获取的原始源代码编译成对应的原始字节码;其中,所述原始源代码为解释型语言;
[0135]
根据所述原始字节码对应的加密字节码和预先获取的原生代码模板生成对应的动态链接库或静态链接库;
[0136]
响应于程序的运行操作,读取并解密所述动态链接库或静态链接库中的加密字节码,得到解密字节码;
[0137]
调用预先创建的代码运行器运行所述解密字节码。
[0138]
根据本公开的一个或多个实施例,【示例2】提供了示例1的方法,所述将预先获取的原始源代码编译成对应的原始字节码,包括:
[0139]
通过预先配置的字节码编译器或代码运行器对预先获取的原始源代码进行编译,得到对应的原始字节码;其中,所述原始源代码为一个或多个原始源代码文件所对应的源代码。
[0140]
根据本公开的一个或多个实施例,【示例3】提供了示例1的方法,所述根据所述原始字节码对应的加密字节码和预先获取的原生代码模板生成对应的动态链接库或静态链接库,包括:
[0141]
确定所述加密字节码对应的预设元素类型的数组声明表达式;
[0142]
对所述数组声明表达式和所述加密字节码所对应字节码的唯一标识名称进行处理,生成对应的代码片段;
[0143]
将所述代码片段插入至预先获取的原生代码模板,编译得到对应的动态链接库或静态链接库。
[0144]
根据本公开的一个或多个实施例,【示例4】提供了示例1的方法,所述读取并解密所述动态链接库或静态链接库中的加密字节码,得到解密字节码,包括:
[0145]
根据所述加密字节码在动态链接库或静态链接库中的所处位置确定对应的读取方式;
[0146]
按照所述读取方式读取所述动态链接库或静态链接库中的加密字节码;
[0147]
采用预设解密算法对所述加密字节码进行解密,得到解密字节码。
[0148]
根据本公开的一个或多个实施例,【示例5】提供了示例1或示例2的方法,所述调用预先创建的代码运行器运行所述解密字节码,包括:
[0149]
获取代码运行器加载动态链接库或静态链接库的运行函数;
[0150]
通过所述运行函数运行所述解密字节码。
[0151]
根据本公开的一个或多个实施例,【示例6】提供了示例3的方法,所述对所述数组声明表达式和所述原始字节码所对应字节码的唯一标识名称进行处理,生成对应的代码片段,包括:
[0152]
将所述原始字节码所对应字节码的唯一标识名称的字符串作为键,以及将所述数组声明表达式所创建的数组作为值;
[0153]
将所述键和所述值按照预设数据类型进行组合,得到对应的代码片段。
[0154]
根据本公开的一个或多个实施例,【示例7】提供了示例1-6任一的方法,所述原生代码模板至少包括下述函数:加密字节码的获取函数;解密字节码的获取函数。
[0155]
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开的技术方案所期望的结果,本文在此不进行限制。
[0156]
上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的精神和原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1