一种基于应用安装包文件的代码转换方法及装置
技术领域
本发明涉及计算机技术领域,具体涉及一种基于应用安装包文件的代码转换方法及装置。
背景技术
目前,移动应用的种类和功能越来越繁多,随着科技的发展,编写的代码、数据以及应用等越来越容易被黑客恶意攻破,因此,保证用户所使用的应用安全成为使用应用时面临的最大问题。现有技术中,在不破坏应用的情况下,往往可以采取针对打包好的应用安装包文件进行加固保护,在一定的程度上防止编写完成的代码被反编译分析,保障源码的安全,进而保障应用的安全。
但是,上述现有技术存在如下不足:现有的移动应用大多数都是采用Java语言进行编译,采用上述现有技术在对移动应用进行加固保护时,往往在待保护应用的Java层进行加密保护,但是反编译工具很容易对Java层的语言进行反编译,从而不能有效地保障应用的安全。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的基于应用安装包文件的代码转换方法。
根据本发明的一个方面,提供了一种基于应用安装包文件的代码转换方法,方法包括:对应用安装包文件进行反编译,得到抽象语法树;按照预设的转换规则对抽象语法树的节点中的内容进行处理,得到与待保护代码相对应的转换代码;按照预设的加密规则对转换代码进行加密处理,得到加密转换代码;针对待保护代码所对应的程序代码进行代码替换处理,得到替换后的程序代码;根据加密转换代码以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
可选地,按照预设的加密规则对转换代码进行加密处理,得到加密转换代码的步骤具体包括:按照预设的程序执行顺序在转换代码的相应位置处插入预设加密处理的调用代码,得到第一代码;对第一代码进行编译,在编译得到的文件中将与转换代码相对应的二进制文件提取出来,并将编译得到的文件被提取出二进制文件之后所得到的文件确认为应用编译文件;在运行应用编译文件的过程中,当运行到预设加密处理的调用代码时,根据预设加密处理的处理代码以及二进制文件完成加密处理,根据加密处理结果确定加密转换代码。
可选地,按照预设的加密规则对转换代码进行加密处理,得到加密转换代码的步骤之后,方法进一步包括:预先构建第一指定格式的文件,将加密转换代码写入第一指定格式的文件中;则根据加密转换代码以及替换后的程序代码打包生成经过代码转换的应用安装包文件进一步包括:根据写入加密转换代码的第一指定格式的文件以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
可选地,方法进一步包括:预先构建第二指定格式的文件,将预设加密处理的处理代码存储在第二指定格式的文件中;则当运行到预设加密处理的调用代码时,根据预设加密处理的处理代码以及二进制文件完成加密处理进一步包括:当运行到预设加密处理的调用代码时,跳转至第二指定格式的文件以完成加密处理。
可选地,预设加密处理包括:还原处理、擦除处理;
预先按照预设的程序执行顺序在转换代码的相应位置处插入预设加密处理的调用代码,得到第一代码的步骤进一步包括:在转换代码之前插入还原处理的调用代码,以及在转换代码之后插入擦除处理的调用代码,得到第一代码。
可选地,当运行到预设加密处理的调用代码时,跳转至第二指定格式的文件以完成加密处理的步骤具体包括:当运行到还原处理的调用代码时,跳转至第二指定格式的文件以执行还原处理;或者,当运行到擦除处理的调用代码时,跳转至第二指定格式的文件以执行擦除处理。
可选地,当运行到还原处理的调用代码时,跳转至第二指定格式的文件以执行还原处理的步骤之前,方法进一步包括:将二进制文件放置于还原处理的处理代码中,得到还原处理代码,将还原处理代码进行编译,并将编译得到的文件保存至第二指定格式的文件中。
可选地,跳转至第二指定格式的文件以执行还原处理进一步包括:跳转至第二指定格式的文件以执行将二进制文件恢复至内存区域中相应的位置的步骤。
可选地,跳转至第二指定格式的文件执行还原处理的步骤之前,方法进一步包括:调用系统函数修改内存区域中的内存数据的执行权限。
可选地,跳转至第二指定格式的文件以执行擦除处理进一步包括:跳转至第二指定格式的文件以执行将内存区域中的还原处理所恢复的与转换代码相对应的二进制文件设置为预设数值的步骤。
可选地,在完成擦除处理之后,方法进一步包括:当调用还原处理代码时,执行利用系统函数获取第一代码中调用还原处理代码的返回地址,根据返回地址将还原处理代码中的二进制文件对所对应的预设数值进行替换的步骤。
可选地,根据写入加密转换代码的第一指定格式的文件以及替换后的程序代码打包生成经过代码转换的应用安装包文件进一步包括:在抽象语法树中添加用于加载写入加密转换代码的第一指定格式的文件的静态代码块;根据写入加密转换代码的第一指定格式的文件、添加了静态代码块的抽象语法树以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
可选地,针对待保护代码所对应的程序代码进行代码替换处理,得到替换后的程序代码的步骤具体包括:针对待保护代码所对应的程序代码,将待保护代码替换为本地代码,并擦除程序代码中待保护代码所对应的方法数据,得到替换后的程序代码。
可选地,按照预设的转换规则对抽象语法树的节点中的内容进行处理的步骤之前,方法进一步包括:根据待保护代码的类型将抽象语法树划分为多个节点。
可选地,当待保护代码的类型为表达式类型时,根据待保护代码的类型将抽象语法树划分为多个节点进一步包括:基于抽象语法树的类型,根据待保护代码中的表达式中的各个变量将抽象语法树划分为多个节点;
或者,当待保护代码的类型为多维数组类型时,根据待保护代码的类型将抽象语法树划分为多个节点进一步包括:根据本地接口将多维数组进行变换,根据变换之后的多维数组将抽象语法树划分为多个节点。
可选地,第一指定格式的文件包括:ELF文件,二指定格式的文件包括:ELF文件。
可选地,对应用安装包文件进行反编译,得到抽象语法树进一步包括:对应用安装包文件进行过滤处理,对过滤后的应用安装包文件进行反编译,得到待保护代码对应的抽象语法树。
根据本发明的另一方面,提供了一种基于应用安装包文件的代码转换装置,装置包括:反编译模块,适于对应用安装包文件进行反编译,得到抽象语法树;代码转换模块,适于按照预设的转换规则对抽象语法树的节点中的内容进行处理,得到与待保护代码相对应的转换代码;加密模块,适于按照预设的加密规则对转换代码进行加密处理,得到加密转换代码;替换处理模块,适于针对待保护代码所对应的程序代码进行代码替换处理,得到替换后的程序代码;生成模块,适于根据加密转换代码以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
可选地,加密模块进一步适于:按照预设的程序执行顺序在转换代码的相应位置处插入预设加密处理的调用代码,得到第一代码;对第一代码进行编译,在编译得到的文件中将与转换代码相对应的二进制文件提取出来,并将编译得到的文件被提取出二进制文件之后所得到的文件确认为应用编译文件;在运行应用编译文件的过程中,当运行到预设加密处理的调用代码时,根据预设加密处理的处理代码以及二进制文件完成加密处理,根据加密处理结果确定加密转换代码。
可选地,装置进一步包括:第一文件构建模块,适于预先构建第一指定格式的文件,将加密转换代码写入第一指定格式的文件中;生成模块进一步适于:根据写入加密转换代码的第一指定格式的文件以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
可选地,装置进一步包括:第二文件构建模块,适于预先构建第二指定格式的文件,将预设加密处理的处理代码存储在第二指定格式的文件中;
则加密模块进一步适于:当运行到预设加密处理的调用代码时,跳转至第二指定格式的文件以完成预设加密处理。
可选地,预设加密处理包括:还原处理、擦除处理;
则加密模块进一步适于:在转换代码之前插入还原处理的调用代码,以及在转换代码之后插入擦除处理的调用代码,得到第一代码。
可选地,加密模块进一步适于:当运行到还原处理的调用代码时,跳转至第二指定格式的文件以执行还原处理;或者,当运行到擦除处理的调用代码时,跳转至第二指定格式的文件以执行擦除处理。
可选地,加密模块进一步适于:将二进制文件放置于还原处理的处理代码中,得到还原处理代码,将还原处理代码进行编译,并将编译得到的文件保存至第二指定格式的文件中。
可选地,加密模块进一步适于:跳转至第二指定格式的文件以执行将二进制文件恢复至内存区域中相应的位置的步骤。
可选地,装置进一步包括:权限修改模块,适于调用系统函数修改内存区域中的内存数据的执行权限。
可选地,加密模块进一步适于:跳转至第二指定格式的文件以执行将内存区域中的还原处理所恢复的与转换代码相对应的二进制文件设置为预设数值的步骤。
可选地,装置进一步包括:执行模块,适于在完成擦除处理之后,当调用还原处理代码时,执行利用系统函数获取第一代码中调用还原处理代码的返回地址,根据返回地址将还原处理代码中的二进制文件对所对应的预设数值进行替换的步骤。
可选地,生成模块进一步适于:在抽象语法树中添加用于加载写入加密转换代码的第一指定格式的文件的静态代码块;
根据写入加密转换代码的第一指定格式的文件、添加了静态代码块的抽象语法树以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
可选地,替换处理模块进一步适于:针对待保护代码所对应的程序代码,将待保护代码替换为本地代码,并擦除程序代码中待保护代码所对应的方法数据,得到替换后的程序代码。
可选地,代码转换模块进一步适于:根据待保护代码的类型将抽象语法树划分为多个节点。
可选地,当待保护代码的类型为表达式类型时,代码转换模块进一步适于:基于抽象语法树的类型,根据待保护代码中的表达式中的各个变量将抽象语法树划分为多个节点;或者,当待保护代码的类型为多维数组类型时,代码转换模块进一步适于:根据本地接口将多维数组进行变换,根据变换之后的多维数组将抽象语法树划分为多个节点。
可选地,第一指定格式的文件包括:ELF文件,第二指定格式的文件包括:ELF文件。
可选地,反编译模块进一步适于:对应用安装包文件进行过滤处理,对过滤后的应用安装包文件进行反编译,得到待保护代码对应的抽象语法树。
根据本发明的另一方面,提供了一种电子设备,包括:处理器、存储器、通信接口和通信总线,处理器、存储器和通信接口通过通信总线完成相互间的通信;
存储器用于存放至少一可执行指令,可执行指令使处理器执行上述基于应用安装包文件的代码转换方法对应的操作。
根据本发明的另一方面,提供了一种计算机存储介质,存储介质中存储有至少一可执行指令,可执行指令使处理器执行如上述基于应用安装包文件的代码转换方法对应的操作。
根据本发明所提供的基于应用安装包文件的代码转换方法及装置。首先,对应用安装包文件进行反编译,得到抽象语法树;然后,按照预设的转换规则对抽象语法树的节点中的内容进行处理,得到与待保护代码相对应的转换代码;然后,按照预设的加密规则对转换代码进行加密处理,得到加密转换代码;然后,针对待保护代码所对应的程序代码进行代码替换处理,得到替换后的程序代码;最后,根据加密转换代码以及替换后的程序代码打包生成经过代码转换的应用安装包文件。该方式通过将应用安装包文件中待保护代码进行转换,将待保护代码转换为难以被反编译的形式的代码,增加了反编译的难度以及复杂度,能够有效对待保护代码进行保护,同时对转换得到的代码进行加密,基于加密的转换代码生成新的应用安装包文件,从而进一步提升了应用的安全性。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了根据本发明一个实施例的基于应用安装包文件的代码转换方法的流程示意图;
图2示出了根据本发明另一个实施例的基于应用安装包文件的代码转换方法的流程示意图;
图3示出了本发明一个实施例中对应于步骤S204的子步骤的流程示意图;
图4示出了本发明另一个实施例中对应于步骤S204的子步骤的流程示意图;
图5示出了根据本发明另一个实施例的基于应用安装包文件的代码转换装置的功能模块图;
图6示出了根据本发明实施例的一种电子设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的基于应用安装包文件的代码转换方法的流程示意图,本实施例中以待保护代码为Java代码为例进行说明,由于反编译软件很容易对Java层的语言进行反编译,本实施例中将应用中的待保护代码转换为难以被反编译的语言代码,例如转换为C代码。当然,本发明的应用场景并不以此为限。如图1所示,该方法包括:
步骤S101,对应用安装包文件进行反编译,得到抽象语法树。
其中,抽象语法树(abstract syntax tree)是源代码的抽象语法结构的树状表现形式,是基于寄存器的带类型的三地址码,具有语句和表达式两种形式,抽象语法树中的每个节点都表示源代码中的一种结构。对应用安装包文件进行反编译处理,得到该应用安装包文件的抽象语法树,可以采用Jimple形式的抽象语法树,或者根据实际需要采用其他形式的抽象语法树,本发明对此不作限定。
步骤S102,按照预设的转换规则对抽象语法树的节点中的内容进行处理,得到与待保护代码相对应的转换代码。
该步骤也即将待保护代码进行转换,具体地,获取上述抽象语法树中的节点,按照预设的转换规则对节点中的内容进行处理,得到与待保护代码相对应的转换代码,其中,得到的转换代码在应用安装包文件中实现的功能与待保护代码在应用安装包文件中实现的功能一致,并且对转换代码进行反编译的复杂度高于对待保护代码进行反编译的复杂度。本实施例中,将待保护Java代码转换为相应的C代码。
本实施例中,对应用安装包文件反编译,得到的抽象语法树的节点中包含待保护代码对应的节点,还有可能包含不需要保护的代码的节点。因此,具体实施时,可以首先确定抽象语法树中与待保护代码相对应的节点,然后按照预设的转换规则对与待保护代码相对应的节点中的内容进行处理,得到与待保护代码相对应的转换代码;或者,首先按照预设的转换规则对抽象语法树的各个节点中的内容进行处理,然后在得到的转换代码中提取出与待保护代码相对应的转换代码。当然,上述两种方式仅仅是本发明的具体实施方式,本发明的方案不限于此。
步骤S103,按照预设的加密规则对转换代码进行加密处理,得到加密转换代码。
实际应用中,可按照预设的程序执行顺序在转换代码的相应位置处插入加密处理的调用代码,当运行到预设的加密处理的调用代码时,调用加密处理的处理代码以执行对转换代码的加密处理。通过对转换处理得到的转换代码进行加密,进一步加大被反编译的难度,提升应用的安全性。
步骤S104,针对待保护代码所对应的程序代码进行代码替换处理,得到替换后的程序代码。
具体地,基于JNI(Java Native Interface)调用规则,针对待保护代码所对应的程序代码,将待保护代码修改为本地代码,得到替换后的程序代码。其中,JNI提供了若干的API(Application Programming Interface,应用程序编程接口)实现了Java和其他语言的通信,它允许Java代码和其他语言写的代码进行交互。
步骤S105,根据加密转换代码以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
将转换代码以及替换后的程序代码重新打包为新的应用安装包文件,该新的安装包文件即是经过代码转换的应用安装包文件。
根据本实施例所提供的基于应用安装包文件的代码转换方法,首先对应用安装包文件进行反编译,得到抽象语法树;然后,按照预设的转换规则对抽象语法树的节点中的内容进行处理,得到与待保护代码相对应的转换代码;然后,按照预设的加密规则对转换代码进行加密处理,得到加密转换代码;然后,针对待保护代码所对应的程序代码进行代码替换处理,得到替换后的程序代码;最后,根据加密转换代码以及替换后的程序代码打包生成经过代码转换的应用安装包文件。该方式通过将应用安装包文件中待保护代码进行转换,将待保护代码转换为难以被反编译的形式的代码,增加了反编译的难度以及复杂度,能够有效对待保护代码进行保护,同时对转换得到的转换代码进行加密,基于加密的转换代码生成新的应用安装包文件,从而进一步提升了应用的安全性。
图2示出了根据本发明另一个实施例的基于应用安装包文件的代码转换方法的流程示意图,如图2所示,方法包括:
步骤S201,对应用安装包文件进行过滤处理,对过滤后的应用安装包文件进行反编译,得到待保护代码对应的抽象语法树。
本实施例中,预先对应用安装包文件进行过滤处理,对过滤后的应用安装包进行反编译处理直接得到与待保护代码相对应的抽象语法树。通俗地来讲,本步骤也即获取应用安装包文件中的待保护代码,例如,获取apk中待保护方法对应的Java代码。
步骤S202,根据待保护代码的类型将抽象语法树划分为多个节点。
检测待保护代码的类型,根据待保护代码的类型将上述抽象语法树划分为多个节点。
具体地,当待保护代码的类型为表达式类型时,基于抽象语法树的类型,根据待保护代码中的表达式中的各个变量将抽象语法树划分为多个节点。其中,JNI接口可以调用原子表达式以及运算方式的数据接口,因此,当待保护代码为原子表达式或者运算方式时,可以分别将各个原子表达式以及相关运算关系翻译为与JNI接口相对应的形式,从而根据待保护代码中的表达式中的各个变量将抽象语法树划分为多个节点。
当待保护代码的类型为多维数组类型时,根据本地接口将多维数组进行变换,根据变换之后的多维数组将抽象语法树划分为多个节点。由于JNI接口中没有直接用于创建多维数组的接口,因此可以将多维数组进行多种变换,转换为能够翻译为与JNI接口相对应的形式,从而根据变换之后的多维数据将抽象语法树划分为多个节点。
步骤S203,按照预设的转换规则对抽象语法树的节点中的内容进行处理,得到与待保护代码相对应的转换代码。
该步骤也即将待保护代码进行转换,具体地,获取上述抽象语法树中的节点,按照预设的转换规则对节点中的内容进行处理,得到与待保护代码相对应的转换代码,其中,得到的转换代码在应用安装包文件中实现的功能与待保护代码在应用安装包文件中实现的功能一致,并且对转换代码进行反编译的复杂度高于对待保护代码进行反编译的复杂度。本实施例中,将待保护Java代码转换为相应的C代码。
步骤S204,按照预设的加密规则对转换代码进行加密处理,得到加密转换代码。
图3示出了本发明一个实施例中对应于步骤S204的子步骤的流程示意图,如图3所示,步骤S204包括以下子步骤:
子步骤S20411,按照预设的程序执行顺序在转换代码的相应位置处插入预设加密处理的调用代码,得到第一代码。
其中,预设的程序执行顺序指的是程序运行时进行预设加密处理所包含的各种处理的顺序,调用代码用于在程序执行的过程中调用能实现预设加密处理的功能的代码。在转换代码的相应位置处插入预设加密处理的调用代码,当运行到调用代码时,调用预设加密处理的处理代码以实现转换代码加密。
子步骤S20412,对第一代码进行编译,在编译得到的文件中将与转换代码相对应的二进制文件提取出来,并将编译得到的文件被提取出二进制文件之后所得到的文件确认为应用编译文件。
对第一代码进行编译,在编译得到的文件中将与待保护代码相对应的二进制文件提取出来,可以将提取出来的二进制文件分开进行存储,后续过程中根据与转换代码相对应的二进制文件进行代码自修改处理,同时,将编译得到的文件中与转换代码相对应的二进制文件提取出去之后所剩下的文件确定为应用编译文件。该步骤相当于对转换代码进行擦除处理。
对第一代码进行编译,在编译得到的二进制文件中,将与转换代码相对应的二进制文件提取出来,可以将提取出来的二进制文件分开进行存储,后续过程中根据与转换代码相对应的二进制文件进行代码自修改处理。该步骤相当于对转换代码进行擦除处理。
子步骤S20413,在运行应用编译文件的过程中,当运行到预设加密处理的调用代码时,根据预设加密处理的处理代码以及二进制文件完成加密处理,根据加密处理结果确定加密转换代码。
在运行应用编译文件的过程中,当运行到预设加密处理的调用代码,调用对应的能够实现预设加密处理的功能的处理代码,执行该处理代码完成代码加密处理,根据加密处理结果确定加密转换代码。举例来说,上述步骤S20412相当于实现了擦除转换代码的功能,则预设加密处理还可以包括:还原处理(解密处理),还原处理具体指的是加载转换代码运行时的内存数据,在此情况下,预设加密处理所要实现的功能是将提取出的与转换代码相对应的二进制文件替换到内存区域中相应的位置处,由此可以保障后续过程中程序的正常运行。当然,本发明的方案并不以此为限。
图4示出了本发明另一个实施例中对应于步骤S204的子步骤的流程示意图,如图4所示,步骤S204包括以下子步骤:
子步骤S20421,预先构建第二指定格式的文件,将还原处理的处理代码以及擦除处理的处理代码存储在第二指定格式的文件中。
预先构建第二指定格式的文件,将预设加密处理的处理代码存储在该第二指定格式的文件中。则在后续过程中,当运行到预设加密处理的调用代码时,跳转至该第二指定格式的文件以完成加密处理。
其中,预设加密处理包括:还原处理以及擦除处理。其中,还原处理又可以理解为解密处理,泛指加载转换代码运行时的内存数据,恢复被擦除的源码内存数据;擦除处理又可以理解为加密处理,泛指擦除转换代码运行时的内存数据。
其中,在Linux系统中,该预先构建的第二指定格式的文件可以是ELF文件。实际应用中,可以构建一个ELF文件存储还原处理的处理代码以及擦除处理的处理代码,也可以构建两个ELF文件分别存储还原处理的处理代码以及擦除处理的处理代码,本发明对此不做限定。当运行到还原处理的调用代码或者擦除处理的调用代码时,跳转至ELF文件中执行相应的处理。其中,ELF文件是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件,也是Linux的主要可执行文件格式。
子步骤S20422,在转换代码之前插入还原处理的调用代码,以及在转换代码之后插入擦除处理的调用代码,得到第一代码。
其中,当预设的程序执行顺序为还原(解密)-运行转换代码-擦除(加密)时,则在转换代码之前插入还原处理的调用代码,以及在转换代码之后插入擦除处理的调用代码,得到第一代码。由此可知,加密处理的执行过程为:在运行经过擦除处理的转换代码之前,先进行还原处理,从而恢复内存区域中被擦除的内存数据;在运行完转换代码之后,再对运行得到的内存数据进行擦除。
子步骤S20423,对第一代码进行编译,在编译得到的文件中将与转换代码相对应的二进制文件提取出来,并将编译得到的文件被提取出二进制文件之后所得到的文件确认为应用编译文件。
对第一代码进行编译,在编译得到的文件中将与待保护代码相对应的二进制文件提取出来,可以将提取出来的二进制文件分开进行存储,后续过程中根据与转换代码相对应的二进制文件进行代码自修改处理,同时,将编译得到的文件中与转换代码相对应的二进制文件提取出去之后所剩下的文件确定为应用编译文件。该步骤相当于对转换代码进行擦除处理。
子步骤S20424,在运行应用编译文件的过程中,当运行到还原处理的调用代码时,跳转至第二指定格式的文件以执行还原处理。
在运行应用编译文件的过程中,当运行到还原处理的调用代码时,跳转至保存有还原处理的处理代码的第二指定格式的文件以执行还原处理。
进一步地,在执行本步骤之前,预先将二进制文件放置于还原处理的处理代码中,得到还原处理代码,将还原处理代码进行编译,并将编译得到的文件保存至第二指定格式的文件中。其中,第二指定格式的文件可以为ELF文件,ELF文件分为数据区和代码区,数据区中保存字符串等常量,将上述与转换代码所对应的二进制文件编译之后作为ELF文件进行保存时可以保存在ELF文件的数据区,在此情况下,即使外人识别出该ELF文件,也无法区分出数据区内哪些是代码、哪些是数据,因此,无法仅通过ELF文件中数据区内的数据获取到转换代码的任何信息,也即对该ELF文件进行反编译时无法得到真实的源码,由此可以保证转换代码的安全。
当运行到还原处理的调用代码时,跳转至第二指定格式的文件以执行将二进制文件恢复至内存区域中相应的位置的步骤。子步骤S20423将与转换代码的二进制文件提取出来,相当于将内存区域中转换代码运行时的内存数据进行擦除,则根据上述内容,在运行经过擦除处理的转换代码之前,先进行还原处理,步骤S20424相当于恢复内存区域中之前被擦除的内存数据。则该步骤也即当运行到还原处理的调用代码时,跳转至上述ELF文件,执行将与转换代码相对应的二进制文件替换至内存区域中相应的位置处的步骤。
可选地,在执行还原处理之前,还可以调用系统函数修改内存区域中的内存数据的操作权限。在对转换代码进行还原处理之前,可以先通过调用系统函数来修改代码段的权限。例如,在Linux系统中,利用mprotect函数来指定任意一块内存区域中数据的读、写以及执行权限,在Linux系统中代码段默认权限为可读可执行但不可写,因而可以在代码段内写入mprotect函数,以便对转换代码的内存数据进行写处理。相应地,Windows系统中也可以通过调用系统函数的方式来更改内存数据的写操作权限,在此不进行赘述。
子步骤S20425,当运行到擦除处理的调用代码时,跳转至第二指定格式的文件以执行擦除处理,根据处理结果确定加密转换代码。
当运行到擦除处理的调用代码时,跳转至保存有擦除处理的处理代码的第二指定格式的文件以执行擦除处理。具体可以从文件的某个字节、某个位置以指定的字节大小进行擦除。根据处理结果生成加密转换代码,具体地,可根据上述插入了调用代码的第一代码以及上述第二指定格式的文件(ELF文件)生成加密转换代码。
本实施例中,擦除处理可以指将内存区域中转换代码运行时的内存数据设置为预设数值,具体地,跳转至第二指定格式的文件以执行将内存区域中的还原处理所恢复的与转换代码相对应的二进制文件设置为预设数值的步骤。由于转换代码均被擦除为预设数值,进行反编译所得到的结果为nop,因此无法得到转换代码的真实信息。在运行完转换代码之后,擦除内存区域中产生的与转换代码相关的内存数据,保证该转换代码静态不可见。
进一步地,在后续运行程序的过程中,当调用上述还原处理代码(保存了二进制文件的还原处理的处理代码)时,执行利用系统函数获取第一代码中调用还原处理代码的返回地址,根据返回地址将还原处理代码中的二进制文件对所对应的预设数值进行替换的步骤。在后续运行程序的过程中,由于转换代码经过了还原以及擦除处理,内存中转换代码被擦除为预设数值,因此当调用还原处理代码时,获取第一代码调用该还原处理代码的返回地址,并将还原处理代码中所保存的二进制文件替换至第一代码中被擦除为预设数值的位置处。其中,还原处理代码是将与转换代码相对应的二进制文件保存至还原处理的处理代码所形成的,因此调用还原处理代码的返回地址也就是调用还原处理的处理代码的返回地址。通过这种方式能够保证程序可以正常运行。
在运行程序的过程中,程序必须加载进内存中进行运行,而在从外存至内存的运行过程中,系统每次的加载地址是变化的,该加载地址是由操作系统的加载机制动态决定的,因此,还原处理的处理代码在内存中的运行地址是变化的,因此在每次运行的过程中,可以采用系统函数来获取第一代码中调用该还原处理代码的返回地址,该系统函数具体可以为__builtin_return_address(0),其功能就是获取当前运行函数的返回地址。当进行还原处理时,还原函数需要知道带还原的具体位置,而待还原的位置就是还原函数的返回地址。
步骤S205,针对待保护代码所对应的程序代码,将待保护代码替换为本地代码,并擦除程序代码中待保护代码所对应的方法数据,得到替换后的程序代码。
该步骤即针对待保护代码所对应的程序代码进行替换处理,以待保护代码为Java代码为例,当待保护代码为Java代码时,将Java代码转换为C代码,则程序代码中的该待保护Java代码修改为native(本地代码),并擦除该待保护Java代码的方法数据,得到替换后的程序代码,其中,本地代码就是Java调用非Java代码的接口,由其他非Java语言实现。
步骤S206,预先构建第一指定格式的文件,将加密转换代码写入第一指定格式的文件中,在抽象语法树中添加用于加载写入加密转换代码的第一指定格式的文件的静态代码块。
其中,在Linux系统中,该预先构建的第一指定格式的文件可以为ELF或者.so文件,在抽象语法树中添加用于加载写入转换代码的预设指定文件的静态代码块。其中,静态代码块先于主方法执行,因此,当有些代码必须在项目启动的时候就执行的时候,可以使用静态代码块,通过添加静态代码块,在运行依据经过代码转换的应用安装包文件时,首先会执行该静态代码块,从而将上述第一指定格式的文件中的内容加载至内存。其中,ELF文件是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件,也是Linux的主要可执行文件格式。
以第一指定格式的文件为.so文件为例,本实施例的方法通过将待保护代码转换为反编译难度较高的代码以及将转换得到的代码进行加密,从而实现对待保护代码进行保护,保护是针对程序里面的函数为单位进行的,从技术上来讲,将待保护代码转移到了动态链接库(.so文件)中。
步骤S207,根据写入加密转换代码的第一指定格式的文件、添加了静态代码块的抽象语法树以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
将写入了加密转换代码的第一指定格式的文件、添加了静态代码块的抽象语法树以及替换后的程序代码打包生成经过代码转换的应用安装包文件。在运行该经过代码转换的应用安装包文件时,首先会执行静态代码块,从而将上述第一指定格式的文件的内容加载至内存中,之后当运行至待保护代码时,可以直接从内存中调用相应的内容。
运行过程中,需要先对第一指定格式的文件中的加密转换代码进行解密,并在解密之后的代码运行完毕之后再重新进行加密。因此,在运行该经过代码转换的应用安装包文件的过程中,内存中的备份文件系统在任何时刻都无法得到待保护代码的完整进行,从而达到保护代码的目的。
综上所述,一方面,该方式通过将应用安装包文件中待保护代码进行转换,将待保护代码转换为难以被反编译的形式的代码,增加了反编译的难度以及复杂度;另一方面,该方式还提供了一种将转换之后的代码进行加密的方法,也即转换代码自修改的方法,首先对转换代码进行擦除处理,在执行被擦除之后的转换代码之前,先进行还原处理,从而恢复原文件中被擦除的代码,在运行完转换代码之后,再对该转换代码进行擦除处理,得到的转换代码被设置为预设数值。因此,当对该擦除处理之后的文件进行反编译时无法获取到真实的源码,同时,由于放置于ELF文件中的转换代码为二进制文件进行编译后所得到的文件,该文件放置于ELF文件中的数据区,对数据文件进行反编译时无法得到真实的源码,通过上述两个方面的操作,达到保护转换代码安全的目的,处理后的转换代码静态不可见,动态难调试。综上,基于加密的转换代码生成新的应用安装包文件,从而提高了应用的安全性。
图5示出了根据本发明另一个实施例的基于应用安装包文件的代码转换装置的功能模块图,如图5所示,该装置包括:反编译模块51、代码转换模块52、加密模块53、替换处理模块54、生成模块55。
其中,反编译模块51,适于对应用安装包文件进行反编译,得到抽象语法树;
代码转换模块52,适于按照预设的转换规则对抽象语法树的节点中的内容进行处理,得到与待保护代码相对应的转换代码;
加密模块53,适于按照预设的加密规则对转换代码进行加密处理,得到加密转换代码;
替换处理模块54,适于针对待保护代码所对应的程序代码进行代码替换处理,得到替换后的程序代码;
生成模块55,适于根据加密转换代码以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
可选地,加密模块53进一步适于:按照预设的程序执行顺序在转换代码的相应位置处插入预设加密处理的调用代码,得到第一代码;对第一代码进行编译,在编译得到的文件中将与转换代码相对应的二进制文件提取出来,并将编译得到的文件被提取出二进制文件之后所得到的文件确认为应用编译文件;在运行应用编译文件的过程中,当运行到预设加密处理的调用代码时,根据预设加密处理的处理代码以及二进制文件完成加密处理,根据加密处理结果确定加密转换代码。
可选地,装置进一步包括:第一文件构建模块,适于预先构建第一指定格式的文件,将加密转换代码写入第一指定格式的文件中;生成模块55进一步适于:根据写入加密转换代码的第一指定格式的文件以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
可选地,装置进一步包括:第二文件构建模块,适于预先构建第二指定格式的文件,将预设加密处理的处理代码存储在第二指定格式的文件中;则加密模块53进一步适于:当运行到预设加密处理的调用代码时,跳转至第二指定格式的文件以完成预设加密处理。
可选地,预设加密处理包括:还原处理、擦除处理;
则加密模块53进一步适于:在转换代码之前插入还原处理的调用代码,以及在转换代码之后插入擦除处理的调用代码,得到第一代码。
可选地,加密模块53进一步适于:当运行到还原处理的调用代码时,跳转至第二指定格式的文件以执行还原处理;或者,当运行到擦除处理的调用代码时,跳转至第二指定格式的文件以执行擦除处理。
可选地,加密模块53进一步适于:将二进制文件放置于还原处理的处理代码中,得到还原处理代码,将还原处理代码进行编译,并将编译得到的文件保存至第二指定格式的文件中。
可选地,加密模块53进一步适于:跳转至第二指定格式的文件以执行将二进制文件恢复至内存区域中相应的位置的步骤。
可选地,装置进一步包括:权限修改模块,适于调用系统函数修改内存区域中的内存数据的执行权限。
可选地,加密模块53进一步适于:跳转至第二指定格式的文件以执行将内存区域中的还原处理所恢复的与转换代码相对应的二进制文件设置为预设数值的步骤。
可选地,装置进一步包括:执行模块,适于在完成擦除处理之后,当调用还原处理代码时,执行利用系统函数获取第一代码中调用还原处理代码的返回地址,根据返回地址将还原处理代码中的二进制文件对所对应的预设数值进行替换的步骤。
可选地,生成模块55进一步适于:在抽象语法树中添加用于加载写入加密转换代码的第一指定格式的文件的静态代码块;根据写入加密转换代码的第一指定格式的文件、添加了静态代码块的抽象语法树以及替换后的程序代码打包生成经过代码转换的应用安装包文件。
可选地,替换处理模块54进一步适于:针对待保护代码所对应的程序代码,将待保护代码替换为本地代码,并擦除程序代码中待保护代码所对应的方法数据,得到替换后的程序代码。
可选地,代码转换模块52进一步适于:根据待保护代码的类型将抽象语法树划分为多个节点。
可选地,当待保护代码的类型为表达式类型时,代码转换模块52进一步适于:基于抽象语法树的类型,根据待保护代码中的表达式中的各个变量将抽象语法树划分为多个节点;或者,当待保护代码的类型为多维数组类型时,代码转换模块52进一步适于:根据本地接口将多维数组进行变换,根据变换之后的多维数组将抽象语法树划分为多个节点。
可选地,第一指定格式的文件包括:ELF文件,第二指定格式的文件包括:ELF文件。
可选地,反编译模块51进一步适于:对应用安装包文件进行过滤处理,对过滤后的应用安装包文件进行反编译,得到待保护代码对应的抽象语法树。
图6示出了根据本发明实施例的一种电子设备的结构示意图,本发明具体实施例并不对电子设备的具体实现做限定。
如图6所示,该电子设备可以包括:处理器(processor)602、通信接口(Communications Interface)604、存储器(memory)606、以及通信总线608。
其中:
处理器602、通信接口604、以及存储器606通过通信总线608完成相互间的通信。
通信接口604,用于与其它设备比如客户端或其它服务器等的网元通信。
处理器602,用于执行程序610,具体可以执行上述基于应用安装包文件的代码转换方法实施例中的相关步骤。
具体地,程序610可以包括程序代码,该程序代码包括计算机操作指令。
处理器602可能是中央处理器CPU,或者是特定集成电路ASIC(ApplicationSpecific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。电子设备包括的一个或多个处理器,可以是同一类型的处理器,如一个或多个CPU;也可以是不同类型的处理器,如一个或多个CPU以及一个或多个ASIC。
存储器606,用于存放程序610。存储器606可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。
程序610具体可以用于使得处理器602执行上述任意方法实施例中的基于应用安装包文件的代码转换方法。程序610中各步骤的具体实现可以参见上述基于应用安装包文件的代码转换方法实施例中的相应步骤和单元中对应的描述,在此不赘述。
至此,本领域技术人员应认识到,虽然本文已详尽示出和描述了本发明的多个示例性实施例,但是,在不脱离本发明精神和范围的情况下,仍可根据发明公开的内容直接确定或推导出符合本发明原理的许多其他变型或修改。因此,本发明的范围应该被理解和认定为覆盖了所有这些其他变型或修改。
本领域技术人员应当理解,本发明的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。此外,本发明也不针对任何特定编程语言,应当明白,可以利用各种编程语言实现本发明描述的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
需要注意的是,尽管在上面的说明中详细描述了一种基于应用安装包文件的代码转换装置的若干模块,但是这种划分仅仅是示例性的,并非是强制性的。本领域的技术人员可以理解,实际上,可以对实施例中的模块进行自适应性地改变,将实施例中的多个模块组合成一个模块,也可将一个模块划分成多个模块。
此外,尽管在附图中以特定顺序描述了本发明实施操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。可以省略某些步骤,将多个步骤合并为一个步骤执行,或者将一个步骤分成多个步骤执行。
以上对本发明的方法和具体实施方法进行了详细的介绍,并给出了相应的实施例。当然,除上述实施例外,本发明还可以有其它实施方式,凡采用等同替换或等效变换形成的技术方案,均落在本发明所要保护的范围之内。