一种防止安卓应用程序被反编译的系统的制作方法

文档序号:25821726发布日期:2021-07-09 14:57阅读:109来源:国知局
1.本发明涉及计算机
技术领域
:,尤其涉及一种防止安卓应用程序被反编译的系统。
背景技术
::2.随着安卓技术的快速发展,开发了大量的安卓应用程序,安卓应用程序通常基于java语言编写。java是一种跨平台的、解释型语言,java编译工具将java源代码编译成为java字节码文件,由java虚拟机负责对java字节码文件进行解释执行。java字节码文件中保留了方法名称、变量名称,并且通过这些名称来访问变量和方法,这些符号往往带有许多语义信息。因此,对于基于java编写的应用程序很容易被反编译,得到java源代码。因此为了提高java程序的安全性,避免java程序被反编译,如何提供一种防止安卓应用程序被反编译的技术,提高java程序的安全性成为亟待解决的技术问题。技术实现要素:3.本发明目的在于,提供一种防止安卓应用程序被反编译的系统,能够防止安卓应用程序被反编译,提高了安卓应用程序程序的安全性。4.根据本发明第一方面,提供了一种防止安卓应用程序被反编译系统,5.包括预设设置的dex解析及编辑程程序、资源文件解析及编辑程序,混淆文件名生成程序,处理器和存储有计算机程序的存储器,当所述计算机程序被处理器执行时,实现以下步骤:6.步骤d1、获取待处理的apk文件中的资源文件,所述资源文件为包括目标包名信息的文件,调用dex解析及编辑程序从所述资源文件中获取目标包名信息,调用资源文件解析及编辑程序从所述资源文件中获取资源清单列表;7.步骤d2、基于所述目标包名信息从所述待处理的apk文件中获取目标java文件,解析所述目标java文件,获取第一资源信息表,所述第一资源信息表的字段包括变量名称和int值,所述变量名称表示该字段在代码中的名称,所述int值表示资源id;8.步骤d3、调用所述资源文件解析及编辑程序解析所述资源文件,获取第二资源信息表,所述第二资源信息表的字段包括资源id以及与资源id对应的资源字符串或资源文件路径字符串;9.步骤d4、调用所述混淆文件名生成程序为所述第二资源信息表中每一资源文件路径字符串生成对应的目标混淆文件名;10.步骤d5、获取所述待处理的apk文件对应的资源目录,基于所述第二资源信息表中的每一资源文件路径字符串检索所述待处理的apk文件对应的资源目录,获取所述第二资源信息表中所有获取资源文件路径字符串对应的目标资源目录;11.步骤d6、遍历所述第二资源信息表、目标资源目录、待处理的apk文件和目标java文件,将其中所有的资源文件路径字符串修改为对应的目标路径字符串。12.本发明与现有技术相比具有明显的优点和有益效果。借由上述技术方案,本发明提供的一种名称可达到相当的技术进步性及实用性,并具有产业上的广泛利用价值,其至少具有下列优点:13.本发明能够增加java程序被反编译的难度,有效防止安卓应用程序被反编译,提升了安卓应用程序的安全性。14.上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其他目的、特征和优点能够更明显易懂,以下特举较佳实施例,并配合附图,详细说明如下。附图说明15.图1为本发明实施例一的防止安卓应用程序被反编译流程示意图;16.图2为本发明实施例二的防止安卓应用程序被反编译流程示意图;17.图3为本发明实施例三的防止安卓应用程序被反编译流程示意图;18.图4为本发明实施例四的防止安卓应用程序被反编译流程示意图。具体实施方式19.为更进一步阐述本发明为达成预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明提出的一种名称的具体实施方式及其功效,详细说明如后。20.安卓程序开发的过程中,通常先编写java源代码,再将java源代码编译为java字节码,java字节码存储在class文件中,然后将java字节码编译为dex文件,dex文件是android系统的可执行文件,包含应用程序的全部操作指令以及运行时数据。若要增加java程序被反编译的难度,防止安卓应用程序被反编译,本发明实施例提供了一种防止安卓应用程序被反编译系统,可在上述任意一个或多个阶段,或者对dex文件进行反编译处理,需要说明的是,本发明实施例“所述系统”指的是“防止安卓应用程序被反编译系统”。根据本发明,所述系统可以物理实现为一个服务器,也可以实现为包括多个服务器的服务器群组。本领域技术人员知晓,服务器的型号、规格等参数并不影响本发明的保护范围。21.在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各步骤描述成顺序的处理,但是其中的许多步骤可以被并行地、并发地或者同时实施。此外,各步骤的顺序可以被重新安排。当其操作完成时处理可以被终止,但是还可以具有未包括在附图中的附加步骤。处理可以对应于方法、函数、规程、子例程、子程序等等。以下通过几个实施例进行说明:22.实施例一、23.本实施例提供了一种防止安卓应用程序被反编译系统,包括每一类dalvik指令对应的预设dalvik指令集,处理器和存储有计算机程序的存储器,每一所述预设dalvik指令集包括多个dalvik指令和每一dalvik指令对应的指令id,每一所述预设指令集中的dalvik指令的指令id由对应dalvik指令类别的原始dalvik指令集中的dalvik指令id打乱排序得到,每一预设dalvik指令集中的dalvik的指令id与原始dalvik指令集中对应的dalvik指令id均不相同。需要说明的是,dalvik是用于android平台的虚拟机的名称,原始dalvik指令集指的是dalvik虚拟机中的原始dalvik指令集。当所述计算机程序被处理器执行时,如图1所示,实现以下步骤:24.步骤a1、从待处理的java字节码中获取所有目标代码段;25.其中,作为示例,所述待处理的java字节码为待处理的安卓apk或sdk对应的class文件中的字节码。26.步骤a2、将每一目标代码段转换为对应的目标dex字节码;27.步骤a3、基于所有类别dalvik指令对应的预设dalvik指令集将每一目标dex字节码转换为预设dalvik指令集能够执行的目标指令集和目标指令集中每一目标指令对应的数据,基于所有目标dex字节码对应的目标指令集和目标指令集中每一目标指令对应的数据生成第一可执行文件,所述第一可执行文件为二进制文件;28.步骤a4、基于所有目标dex字节码与对应的目标指令集中每一目标指令对应的数据的转换关系在so文件中动态生成目标解释器,其中,android中的so文件是动态链接库,是二进制文件,是elf(executableandlinkingformat)文件中的一种,通过在so文件中动态生成目标解释器,可以保证被进行防止反编译处理的目标代码段对应的部分正常运行;29.步骤a5、将待处理的java字节码中所有的目标代码段置空,并在每一代码段添加对应的关联标记,得到预处理java字节码,将所述预处理java字节码转换为加固dex文件,所述关联标记用于作为目标解释器的启动标记,以及用于从所述第一可执行文件关联该关联标记对应的目标指令集和目标指令集中每一目标指令对应的数据。其中,关联标记具体可设置为jni(javanativeinterface,java本地接口)标记。30.作为一种实施例,在执行所述加固dex文件的过程中,实现以下步骤:31.步骤a6、当执行到关联标记的位置时,启动所述目标解释器,并基于所述关联标记从所述第一可执行文件中依次获取该关联标记对应的目标指令集中每一目标指令以及每一目标指令对应的数据,进行加载至内存中执行,直至该关联标记对应的目标指令集中的指令执行完毕。32.可以理解的是,每执行到一处关联标记,则启动一次目标解释器,直至该关联标记对应的目标指令集中的指令执行完毕。其他非目标代码部分直接按原始执行流程执行即可,因此,可以保证通过防止反编译处理后的java程序正常运行。33.作为示例,可通过以下两种实施方式从待处理的java字节码中获取所有目标代码段:34.目标代码段获取方式一、35.所述系统还包括预设的第一目标函数列表,所述第一目标函数列表的字段包括目标函数的名称,目标函数对应的起始地址,所述a1包括:36.步骤a11、基于所述第一目标函数列表遍历所述待处理的java字节码;37.步骤a12、基于每一目标函数对应的起始地址获取每一第一目标函数列表对应的目标代码段。38.目标代码段获取方式二、39.所述系统还包括预设的第二目标函数列表,所述第二目标函数列表的字段包括目标函数的名称,所述a1包括:40.步骤a101、在待加固的java字节码编译过程中,基于所述第二目标函数列表实时检测待加固的java字节码,当检测到编译至所述第二目标函数列表中的目标函数对应的代码,将所述目标函数对应的起始位置添加预设的注解标记;41.步骤a102、扫描所述待加固的java字节码,获取以所述注解标记为起始位置的目标函数对应的代码段作为所述目标代码段。42.作为示例,可通过以下两种实施方式存储所述第一可执行文件、so文件和加固dex文件。43.存储方式一、44.当所述计算机程序被处理器执行时,还实现步骤a71、将所述第一可执行文件、so文件和加固dex文件分别存储至待处理的安卓apk或sdk文件中。将所述第一可执行文件与so文件和加固dex文件均单独存放,只需存一份第一可执行文件,可以支持不同版本cpu架构,提高了代码兼容性。45.存储方式二、46.当所述计算机程序被处理器执行时,还实现步骤a701、将第一可执行文件存储至所述so文件中,将所述so文件和加固dex文件分别存储至待处理的安卓apk或sdk文件中,将所述第一可执行文件直接存放在so文件中,无需额外为第一可执行文件构建文件,且便于so文件的目标解释器调用第一可执行文件,提高了代码执行的效率。47.实施例一将所有目标代码段基于自定义的预设dalvik指令集转换成自定义的预设dalvik指令集可执行的第一可执行文件,同时生成与自定义的预设dalvik指令集相匹配的so文件,在so文件中配置目标解释器,并将所有目标代码段置空,并添加关联标记,基于此得到防止反编译处理后的java程序,得在运行过程中,当运行至关联标记时,基于关联标记调用目标解释器加载第一可执行文件中对应的指令和数据进行执行,使得防止反编译处理后的java程序可以征程执行。而由于将原来的目标代码段已经置空,且将该代码段基于自定义的预设dalvik指令集进行了转换处理,因此,无法基于防止反编译处理后的java程序得到java源代码,提升了安卓应用程序的安全性。48.实施例二、49.本实施例提供了一种防止安卓应用程序被反编译系统,包括预设的elf头部信息列表、终端机型列表,处理器和存储有计算机程序的存储器,所述elf头部信息列表中存储多个待抹除的elf头部信息,所述终端机型列表中存储有多个预设终端机型信息,当所述计算机程序被处理器执行时,如图2所示,实现以下步骤:50.步骤b1、解析待处理的elf文件获取待处理的elf文件的文件头信息;51.步骤b2、将所述待处理的elf文件的文件头信息中的一个或多个待抹除的elf头部信息抹除,得到待运行的elf文件;52.其中,当前所选择的待抹除的elf头部信息为多个时,即为所选多个的待抹除的elf头部信息的组合。53.步骤b3、遍历所述终端机型列表,依次将所述待运行的elf文件加载至每一预设终端机型信息对应的安卓系统中,并判断能否运行,若在所有预设终端机型信息对应的安卓系统中均能运行,则执行步骤b4;54.步骤b4、调用预设反编译工具识别每一预设终端机型信息对应的安卓系统中所运行的待运行的elf文件,若全部识别失败,则将当前抹除的待抹除的elf头部信息确定为目标信息,循环执行步骤b2‑步骤b4,直至确定所有目标信息,生成目标信息列表;55.通过循环执行步骤b2‑步骤b4,可以获取所有能够抹除的单个elf头部信息,以及多个elf头部信息组合。56.步骤b5、从所述目标信息列表中选择一个目标信息,将所述待处理的elf文件的elf文件头信息中的该目标信息抹除,生成elf加固文件。57.作为一种示例,所述步骤b5中,从目标信息列表中选择包含待抹除的elf头部信息最多的目标信息进行抹除,增大反编译的难度,提高java程序的安全性。58.作为一种示例,所述预设反编译工具可以为ida反编译器等反编译工具。59.elf文件头中包括描述信息、动态链接表等信息,通过将其中部分elf头部信息抹除掉,既不会影响到elf文件的正常运行,又能使得反编译软件无法打开elf文件,导致反编译失败,无法获取java源代码。不同机型的安卓系统可能是不同的,因此,实施例二建立了elf头部信息列表,逐条抹除elf头部信息,并判断抹除该elf头部信息是否能在每个预设终端机型信息对应的运行环境中运行,若可以,再继续判断能够被预设反编译工具识别,识别失败,则确定当前抹除的elf头部信息为可以抹除的目标信息,将目标信息抹除,使得最终的抹除信息后的elf文件仍可以正常运行,从而使得最终得到的java程序可以正常运行,同时又使得预设的反编译工具无法从最终得到的java程序中获取源代码,提升了安卓应用程序的安全性。60.实施例三、61.本实施例提供了一种防止安卓应用程序被反编译系统,包括预设的加密函数、加密密钥、解密密钥和解密函数,处理器和存储有计算机程序的存储器,当所述计算机程序被处理器执行时,如图3所示,实现以下步骤:62.步骤c1、监测编译器是否将待处理的java源代码全部编译成对应的第一java字节码,若编译完成,则执行步骤c2;63.步骤c2、扫描所述第一java字节码,若扫描到常量字符串,则调用所述加密函数和加密密钥将扫描到的常量字符串进行加密,得到对应的加密字符串;64.步骤c3、将扫描到的常量字符串替换为所述解密函数的调用,并将所述解密函数对应的调用参数设置为该常量字符串对应的加密字符串。65.作为一种实施例,所述系统中还包括gradle插件,所述gradle插件中配置有预设回调函数以及所述预设的加密函数、加密密钥、解密密钥和解密函数,gradle是一个基于apacheant和apachemaven概念的项目自动化构建开源工具,gradle中包括一套api,通过对api的配置可以得到gradle插件。所述步骤c1基于gradle监测编译器是否将待处理的java源代码全部编译成对应的第一java字节码,若编译完成,则采用所述预设回调函数调取所述gradle插件执行步骤c2。所述步骤c2采用所述gradle插件扫描所述第一java字节码,若扫描到常量字符串,则调用所述加密函数和加密密钥将扫描到的常量字符串进行加密,得到对应的加密字符串。所述步骤c3采用所述gradle插件将扫描到的常量字符串替换为所述解密函数的调用,并将所述解密函数对应的调用参数设置为该常量字符串对应的加密字符串。将预设的加密函数、加密密钥、解密密钥和解密函数直接配置在gradle插件中,直接基于gradle和调用gradle插件来执行步骤c1‑步骤c3,提高了处理效率。66.作为一种示例,所述步骤c2中,所述调用所述加密函数和加密密钥将扫描到的常量字符串进行加密,得到对应的加密字符串,包括:67.步骤c21、将扫描到的常量字符串转换为btye数组,调用所述加密函数将所述btye数组进行加密,得到加密后的btye数组;68.步骤c22、将加密后的btye数组进行编码得到base64或base128的加密字符串。69.可以理解的是,执行解密函数的调用的过程中,为与c11‑c12相对应的解密流程,在此不再赘述。70.作为一种示例,所述加密函数为aes等加密函数,所述解密函数为aes等解密性能好的解密函数。71.作为一种示例,当所述计算机程序被处理器执行时,还实现以下步骤:72.步骤c41、将所述预设解密密钥切分为多段解密密钥段;73.例如,解密密钥为16位的解密密钥,可以将该解密密钥分为4段。74.步骤c42、将所述多段解密密钥段在所述第一java字节码对应的class文件中分散存储;75.步骤c43、为每一解密密钥段设置一密钥段id,基于每一解密密钥段的密钥段id和对应的存储地址建立密钥段存储表,所述密钥段存储表包括多条密钥段记录,每一密钥段记录的字段包括密钥段id和存储地址;76.步骤c44、将所述密钥段存储表的记录在所述第一java字节码对应的class文件中分散存储。77.实施例三通过步骤c1‑步骤c3,使得第一java字节码的常量字符串全部转换为解密函数的调用,调用参数设置为该常量字符串对应的加密字符串,实现了常量字符串的混淆,这样使得执行过程中,解密函数调用该常量字符串对应的加密字符串,并获取解密密钥仅进行解密,保证代码正常执行,而无法获取到常量字符串,反编译后得到的是乱码,从而无法通过反编译获取到java程序的源代码,提高了安卓应用程序程序的安全性。此外,通过步骤c41‑步骤c44将解密密钥以及密钥段记录分散存储,进一步提升了java程序反编译的难度,从而进一步提高java程序的安全性。78.实施例四、79.本实施例提供了一种防止安卓应用程序被反编译系统,包括预设设置的dex解析及编辑程程序、资源文件解析及编辑程序,混淆文件名生成程序,处理器和存储有计算机程序的存储器。当所述计算机程序被处理器执行时,如图4所示,实现以下步骤:80.步骤d1、获取待处理的apk文件中的资源文件,调用dex解析及编辑程序从所述资源文件中获取目标包名信息,调用资源文件解析及编辑程序从所述资源文件中获取资源清单列表;其中,作为一种实施例,资源文件具体可以为resources.arsc文件,目标包名具体可以为r包名,resources.arsc文件是指aapt(androidassetpackagingtool)工具在编译资源将一些资源或者资源索引打包生成的资源id与实际资源的映射清单文件,简称为资源清单列表文件,这个文件以二进制数据的形式记录数据。r包名信息指的是.r的包名信息。81.步骤d2、基于所述目标包名信息从所述待处理的apk文件中获取目标java文件,解析所述目标java文件,获取第一资源信息表,所述第一资源信息表的字段包括变量名称和int值,所述变量名称表示该字段在代码中的名称,所述int值表示资源id;82.其中,所为一种实施例,当目标包名为r包名时,目标java文件指的是r.java文件。83.步骤d3、调用所述资源文件解析及编辑程序解析所述资源文件,获取第二资源信息表,所述第二资源信息表的字段包括资源id以及与资源id对应的资源字符串或资源文件路径字符串;84.其中资源字符串是资源文件中开发者在程序中实际用到的字符串,资源文件路径字符串是资源文件中的资源文件路径字符串。85.步骤d4、调用所述混淆文件名生成程序为所述第二资源信息表中每一资源文件路径字符串生成对应的目标混淆文件名;86.步骤d5、获取所述待处理的apk文件对应的资源目录,基于所述第二资源信息表中的每一资源文件路径字符串检索所述待处理的apk文件对应的资源目录,获取所述第二资源信息表中所有获取资源文件路径字符串对应的目标资源目录;87.其中,当资源文件具体为resources.arsc文件,目标包名具体可以为r包名时,资源目录为res目录。88.步骤d6、遍历所述第二资源信息表、目标资源目录、待处理的apk文件和目标java文件,将其中所有的资源文件路径字符串修改为对应的目标路径字符串。89.作为示例,所述系统还包括预设字母表,所述预设字母包括将a‑z26个字母随机打乱顺序后得到字母列表,所述字母列表中的字母从0‑25依编号,所述混淆文件名生成程序中设置有两个整型数字int1和int2,所述int1和int2代表当前待混淆的资源文件路径字符串id,所述int1和int2配置为26进制数,所述int1和int2的初始值对应的十进制数为0,设置基础目录名称和预设分隔符,int1和int2最长位数设置为4,int1或int2对应的最大10进制数为26^4‑1=456975。90.作为示例,所述步骤d4包括:91.步骤d41、调用所述混淆文件名生成程序,获取当前int1和int2对应的十进制数,根据所述预设字母表中字母编排的序号,得到当前int1对应的当前int1号字符和当前int2对应的当前int2号字符;92.步骤d42、将所述基础目录名称、预设分隔符、当前int1号字符、预设分隔符、当前int2号字符按顺序组合生成当前混淆字符串;93.步骤d43、将所述当前待混淆的资源文件路径字符串中的除后缀名之外的字符串修改为所述当前混淆字符串,并保留后缀名不变,得到当前待混淆的资源文件路径字符串对应的目标混淆文件名;94.步骤d44、判断当前int2是否小于456976,若小于,则将当前int2加1,返回步骤d41,否则,则将当前int1加1,并将当前int2重新归0,返回步骤d41,直至获取到所述第二资源信息表中所有资源文件路径字符串的目标混淆文件名。95.作为一种示例,所述基础目录名称为“/r”,所述预设分隔符为“/”,如果是首次调用混淆文件名生成程序,此时int1和int2均为0,将根据所述预设字母表中编排的序号,得到0号字符和0号字符,则生成的当前混淆字符串为“/r”+“/”+0号字符+“/”+0号字符。再如,当前待混淆的资源文件路径字符串为/资源/drawable/ic_launcher.png‑>,通过步骤d41‑步骤d44可以得到对应的目标混淆文件名为/r/a/b.png,既增加了java程序的破解难度,又能缩小apk文件体积。96.实施例四通过将资源文件路径字符串更改为目标混淆文件名,实现了资源文件的混淆,既增加了java程序的破解难度,又能缩小apk文件体积,且由于同步更改了所述第二资源信息表、目标资源目录、待处理的apk文件和目标java文件中的所有资源文件路径字符串,因此,不会影响代码执行过程,但又加了java程序的破解难度,无法直接通过反编译获取到源代码,提升了安卓应用程序的安全性。97.实施例一至实施例四分别从一个方面对java程序进行了反编译处理,基于其中的两个实施例的结合能够得到更高的防止反编译的效果,具体通过以下几个具体实施例进行说明,对于下述实施例中未披露的细节,请参照实施例一至实施例四中的技术细节:98.实施例五、99.在实施例一的基础上,基于所述第一可执行文件、so文件和加固dex文件生成待处理的apk文件,在与实施例四结合,即对在实施例基础上获取的待处理的apk文件再通过实施例四进行资源文件混淆,防止安卓应用程序源代码被反编译,进一步提升java程序的安全性,与实施例一和实施例四相同的技术细节在此不再赘述。100.实施例六、101.so文件是elf文件的一种,因此,实施例一种,生成了包括目标解释器的so文件,因此,可以将实施例一种的so文件作为实施例二中的elf文件进行elf文件头的抹除处理,即将实施例二中的所述待处理的elf文件限定为基于所有类别的预设dalvik指令集所述获取的so文件。同时,仍基于实施例一对目标代码进行加固,将实施例一和实施例二相结合,防止安卓应用程序源代码被反编译,进一步提升了安卓应用程序的安全性。与实施例一和实施例二相同的技术细节在此不再赘述。102.实施例七、103.在实施例三的基础上,可以将经过实施例三所述步骤c1‑步骤c3处理后的第一java字节码作为待处理的java字节码,将所常量字符串替换后所述解密函数的调用作为目标代码,再进一步执行实施例一中的流程,从而对所常量字符串替换后所述解密函数进行进一步加固,将实施例三和实施例一相结合,防止安卓应用程序源代码被反编译,进一步提升了安卓应用程序的安全性。与实施例三和实施例一相同的技术细节在此不再赘述。104.实施例八、105.在执行实施例四进行资源文件混淆之前,可以先通过实施例三将第一java字节码的常量字符串先进行混淆,从而执行了资源文件和第一java字节码的常量字符串的双重混淆,将实施例四和实施例三相结合,防止安卓应用程序源代码被反编译,进一步提升了安卓应用程序的安全性。与实施例三和实施例四相同的技术细节在此不再赘述。106.以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1