编译结果处理方法、装置、存储介质、处理器及编译器与流程

文档序号:14120738阅读:181来源:国知局
编译结果处理方法、装置、存储介质、处理器及编译器与流程

本发明涉及编程语言、软件、反逆向工程领域,具体而言,涉及一种编译结果处理方法、装置、存储介质、处理器及编译器。



背景技术:

当今的计算机网络操作系统在代码设计时,更偏重于使用的方便性,有时容易忽略其本身的安全性,进而容易引发被hacker(黑客)攻击的事件,造成大量的信息泄露,从而引发了不必要的损失。

在lua编程中,为了防止他人破解由lua编写的软件,目前最常见的lua反编译方法是对源代码编译后的二进制文件进行整体加密,等到执行时,先对文件进行整体解密,然后再解析运行。然而,不管采用多复杂的算法对编译后的二进制文件进行加密,相应的解密函数、密钥也是要保存在对外发布的程序中的,否则程序就无法把二进制执行文件解密然后执行。这样就给了hacker有可乘之机,hacker根本不需要知道解密步骤,也不需要去找出密钥,只需要在程序把二进制执行文件解密之后,执行之前那一刻进行拦截,就可以取到解密后的二进制执行文件,进而通过逆向工程得出文本源代码。就好像先把菜谱锁在箱子里,然后把开锁步骤藏在用于烹饪的人工智能(artificialintelligence,简称为ai)机器人身上,我们把箱子和机器人打包卖给客户,我们只希望客户下命令给机器人,得到他想吃的,而不想泄漏我们的菜谱。虽然客户不知道打开箱子的步骤,但是客户可以在机器人打开箱子的瞬间进行拦截,复制出菜谱。箱子再结实,开锁步骤再复杂也无济于事,机器人终究都是要打开箱子,否则机器人就无法进行烹饪了。

针对相关技术中存在的由lua编写的软件容易被逆向工程出具有可读性的文本源代码,从而导致软件缺乏安全性的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种编译结果处理方法、装置、存储介质、处理器及编译器,以至少解决相关技术中存在的由lua编写的软件容易被逆向工程出具有可读性的文本源代码,从而导致软件缺乏安全性的问题。

根据本发明的一个实施例,提供了一种编译结果处理方法,包括:在对lua程序源代码进行编译时,对所述lua程序的函数的以下信息至少之一进行加密:局部变量名、函数定义所属的文件路径;将所述函数以及加密后的所述信息保存为编译结果。

可选地,对所述局部变量名进行加密包括:利用对称加密算法对所述局部变量名进行加密。

可选地,利用对称加密算法对所述局部变量名进行加密包括:利用以下至少之一的对称加密算法对所述局部变量名进行加密:数据加密标准des、高级加密标准aes、blowfish。

可选地,对所述函数定义所属的文件路径进行加密包括:利用对称加密算法对所述函数定义所属的文件路径进行加密。

可选地,利用对称加密算法对所述函数定义所属的文件路径进行加密包括:利用以下至少之一的对称加密算法对所述函数定义所属的文件路径进行加密:数据加密标准des、高级加密标准aes、blowfish。

根据本发明的另一个实施例,提供了一种编译结果处理装置,包括:加密模块,用于在对lua程序源代码进行编译时,对所述lua程序的函数的以下信息至少之一进行加密:局部变量名、函数定义所属的文件路径;保存模块,用于将所述函数以及加密后的所述信息保存为编译结果。

可选地,在对所述局部变量名进行加密时,所述加密模块用于:利用对称加密算法对所述局部变量名进行加密。

可选地,在对所述函数定义所属的文件路径进行加密时,所述加密模块用于:利用对称加密算法对所述函数定义所属的文件路径进行加密。

根据本发明的又一个实施例,还提供了一种存储介质,所述存储介质包括存储的程序,其中,所述程序运行时执行上述任一项所述的方法。

根据本发明的又一个实施例,还提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述任一项所述的方法。

根据本发明的又一个实施例,还提供了一种编译器,包括:一个或多个处理器,存储器,以及一个或多个程序,其中,所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述一个或多个程序包括用于执行上述任意一项所述的编译结果处理方法。

通过本发明,是对lua程序源代码进行编译时得到的函数的局部变量名和/或函数定义所属的文件路径进行加密的,而由于在解析编译后的函数时,是无需利用局部变量名以及函数定义所属的文件路径进行解析,因此,局部变量名和/或函数定义所属的文件路径的解密算法、密钥都是无需保存在编译结果中的,因此,即使反编译人员解析了编译后的函数,由于缺乏正确的局部变量名和/或函数定义所属的文件路径,无法阅读理解反编译出来的代码,解决了相关技术中存在的由lua编写的软件容易被逆向工程出具有可读性的文本源代码,从而导致软件缺乏安全性的问题,进而达到了提高软件安全性的效果。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的编译结果处理方法的流程图;

图2是文本源代码图;

图3是代码编译后生成的二进制指令;

图4是存在错误的文本源代码图;

图5是运行存在错误的文本代码后生成的二进制指令图;

图6是对文件路径和局部变量名加密后的代码片段;

图7是对局部变量名加密后的代码片段;

图8是对文件路径和局部变量名加密后的源代码;

图9是逆向工程反编译文件路径和局部变量名后得到的明文代码;

图10是解密traceback后的明文代码;

图11是根据本发明实施例的编译结果处理装置的结构框图。

具体实施方式

下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。

在本发明实施例中,针对相关技术中存在的由lua编写的软件容易被逆向工程出具有可读性的文本源代码,从而导致软件缺乏安全性的问题,提出一种编译结果处理方法、装置、存储介质、处理器及编译器。下面结合实施例对本发明进行说明:

图1是根据本发明实施例的编译结果处理方法的流程图,如图1所示,该流程包括如下步骤:

步骤s102,在对lua程序源代码进行编译时,对所述lua程序的函数的以下信息至少之一进行加密:局部变量名(也可称为local变量名)、函数定义所属的文件路径;

步骤s104,将上述函数以及上述加密后的上述信息保存为编译结果。

其中,执行上述步骤的主体可以是编译器,可选地,可以由软件系统中的编译系统来执行。

在上述实施例中,是对lua程序源代码进行编译时,对所述lua程序的函数的局部变量名和/或函数定义所属的文件路径进行加密的,而由于在解析编译后的函数时,是无需利用局部变量名以及函数定义所属的文件路径进行解析,因此,局部变量名和/或函数定义所属的文件路径的解密算法、密钥都是无需保存在编译结果中的,因此,即使反编译人员解析了编译后的函数,由于缺乏正确的局部变量名和/或函数定义所属的文件路径,无法阅读理解反编译出来的代码,解决了相关技术中存在的由lua编写的软件容易被逆向工程出具有可读性的文本源代码,从而导致软件缺乏安全性的问题,进而达到了提高软件安全性的效果。

在上述实施例中,通过对lua程序的函数的局部变量名和/或函数定义所属的文件路径进行加密,使得不法分子(例如,hacker)即使拿到编译后的二进制执行文件,也无法通过逆向工程还原出具有可读性的文本源代码。并且,由于编译后的二进制执行文件保留了加密形式的局部变量名和/或函数定义所属的文件路径,在出现运行错误时,对traceback中的路径、变量名进行解密即可得到可阅读格式的函数调用链,不会影响合法的错误定位。其中,逆向工程是指通过对编译链接后的二进制的可执行程序进行反编译,还原出文本源代码,推导出他人软件产品的原理算法。traceback是指程序运行过程中的某一时刻,函数的调用关系,栈、变量等相关信息。

在本发明实施例中,在lua的语法中,变量有两种:全局变量(也可称为global变量)、局部变量。全局变量在运行时,是按名字访问;局部变量运行时,是按地址访问的。由于编译器在编译阶段就分配好每个局部变量的注册地址(也可称为register地址)(即在lua运行栈上的位置),在运行时是不需要局部变量的名字的,如图2和图3所示,图3中两个框中的指令片段分别对应图2的两个框中的文本代码(其中,图3中上边的框对应于图2中的上边的框,图3中的下边的框对应图2中的下边的框)。从图3中的上边的框中的指令片段可以明显看出,图2中的locala,b,c,d的地址分别为register0,1,2,3。而图2和图3中的下边的框中的代码虽然稍微复杂,但是除了map这个全局变量是从全局_env中按名访问,其他的局部变量(target、itemtype、amount)都已编好地址。标准的官方lua编译器,是以明文的方式,把定义所属文件路径和local变量名以明文的方式保存在编译结果中。

由于运行时并不需要局部变量的名字,lua官方编译器提供了一个strip(stripdebuginformation,去除调试信息)选项,可以去掉二进制编译结果中的局部变量名,以及每个代码段对应的文件路径(对应于上述的函数定义所属的文件路径)。strip去掉局部变量名、代码段的文件路径后,hacker反编译得到的文本代码中,没有局部变量名字,无法阅读,也就无法还原出原理算法。但是strip会导致一个麻烦的问题:在出现运行时错误时,无法得到错误发生时的函数调用链信息,也无法查看到变量名。这样就无法对运行时出现错误的代码进行定位,这是不能接受的。以图4的代码为例,第6行出现了笔误,getamount漏掉了字母u,在运行时,会抛出错信息,对出错信息进行处理,可以得到图5所示的traceback。如果编译时打开strip选项,则运行出错时,无法得到出错时的代码文件路径"test/abc.lua",也得不到targettype、total等变量的名字,无法定位错误。在本发明实施例中,程序在解析执行编译后的二进制文件前,无需先解密函数的局部变量名和函数定义所属的文件路径,所以解密的算法、密钥无需保存在对外发布的程序中(本实施例是以对函数的局部变量名和函数定义所属的文件路径都进行了加密为例进行说明的)。hacker反编译后看到的文件路径及局部变量名全部都是混淆后的,也无法知道使用的是何种加密算法,无法还原出正确的变量名,因此,也就无法阅读理解反编译出来的文本代码。因此,通过对代码文件路径、局部变量名加密,使得hacker即使拿到编译后的二进制执行文件,也无法逆向工程还原出具有可读性的文本源代码。以烹饪机器人为例,本发明实施例是将菜谱进行了混淆处理,使得菜谱只有机器人能理解,而自然人拿到也无法看明白。在本实施例中,由于在程序运行出错时,客户端生成的traceback(程序运行过程中的某一时刻,函数的调用关系,栈、变量等相关信息)是通过网络传输给开发人员查看的,所以对代码文件路径、局部变量名的解密无需在客户端在进行,也就无需将解密步骤、密钥放在客户端。

在一个可选实施例中,对编译得到的函数的局部变量名进行加密包括:利用对称加密算法对上述局部变量名进行加密。

在一个可选实施例中,利用对称加密算法对上述函数的局部变量名进行加密包括:利用以下至少之一的对称加密算法对上述函数的局部变量名进行加密:数据加密标准des、高级加密标准aes、blowfish。

在一个可选实施例中,对上述函数定义所属的文件路径进行加密包括:利用对称加密算法对上述函数定义所属的文件路径进行加密。

在一个可选实施例中,利用对称加密算法对上述函数定义所属的文件路径进行加密包括:利用以下至少之一的对称加密算法对上述函数定义所属的文件路径进行加密:数据加密标准des、高级加密标准aes、blowfish。

下面以对函数的局部变量名和函数定义所属的文件路径都进行了加密为例进行具体说明:在标准编译器完成编译后对文件路径(即,函数定义所属的文件路径,可以简称为文件路径)和局部变量名加密,加密后的完整代码片段见图6和图7,其中source字段表示代码的文件路径(即图5中的"test/abc.lua")。locvars是个数组,数组的每一个元素代表一个局部变量名,structlocvar的varname字段就是变量的名字。在lua标准的编译过程中,对source、locvars的赋值由dumpfunction函数完成,本发明在dumpfunction完成之后,可以使用对称加密算法(常见的des、aes、blowfish等中的任意一种)对proto.source,proto.locvars[].varname进行加密。

在上述实施例中,函数定义所属的文件路径、局部变量名都不参与二进制的解析执行,这两者主要用于运行时的错误定位。对图8所示的源代码进行文件路径及局部变量名加密后,逆向工程反编译后得到的明文代码如图9,可以看出,由于运行结果均是乱码,从而使得阅读理解难度大大增加,hacker很难看出该函数的真实作用。由于在运行出错时,客户端生成的traceback是通过网络传输给开发人员查看的,所以对代码文件路径、局部变量名的解密无需在客户端在进行,也就无需将解密步骤、密钥放在客户端。图4所示的源代码在在文件路径、局部变量名加密后代码段的运行时报错traceback如图10所示,"icb0zxn0l2fiyy5sdwegia"是文件路径"test/abc.lua"的加密形式,"vxnlck9iaia"是local变量userobj加密形式,……。使用与编译时进行加密相同的算法、密钥,就能将图10的traceback解密成图5的明文格式。由于编译后的二进制执行文件保留了代码文件路径、局部变量名,在出现运行时错误时,对traceback中的路径、变量名进行解密即可得到可阅读格式的函数调用链,不影响错误定位。

在本实施例中还提供了一种编译结果处理装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。

图11是根据本发明实施例的编译结果处理装置的结构框图,如图11所示,该装置包括:

加密模块112,用于在对lua程序源代码进行编译时,对所述lua程序的函数的以下信息至少之一进行加密:局部变量名、函数定义所属的文件路径;保存模块114,连接至上述加密模块112,用于将上述函数以及上述函数的加密后的上述信息保存为编译结果。

在一个可选的实施例中,在对编译得到的函数的局部变量名进行加密时,上述加密模块112可以利用对称加密算法对所述局部变量名进行加密。

在一个可选地实施例中,上述加密模块112可以通过如下方式利用对称加密算法对所述函数的局部变量名进行加密:利用以下至少之一的对称加密算法对所述函数的局部变量名进行加密:数据加密标准des、高级加密标准aes、blowfish。

在一个可选的实施例中,在对上述函数定义所属的文件路径进行加密时,上述加密模块112可以利用对称加密算法对上述函数定义所属的文件路径进行加密。

在一个可选地实施例中,上述加密模块112可以通过如下方式利用对称加密算法对上述函数定义所属的文件路径进行加密:利用以下至少之一的对称加密算法对上述函数定义所属的文件路径进行加密:数据加密标准des、高级加密标准aes、blowfish。

需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。

本发明的实施例还提供了一种存储介质,该存储介质包括存储的程序,其中,上述程序运行时执行上述任一项所述的方法。

可选地,在本实施例中,上述存储介质可以包括但不限于:u盘、只读存储器(read-onlymemory,简称为rom)、随机存取存储器(randomaccessmemory,简称为ram)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

本发明的实施例还提供了一种处理器,该处理器用于运行程序,其中,该程序运行时执行上述任一项方法中的步骤。

本发明的实施例还提供了一种编译器,包括:一个或多个处理器(可以和前述的处理器相同),存储器,以及一个或多个程序,其中,所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述一个或多个程序包括用于执行上述任意一项所述的编译结果处理方法。

显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1