一种安卓应用程序防逆向破解的加固方法、系统及解密方法转让专利

申请号 : CN201611265457.0

文献号 : CN106778103B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 郑伟龚蔚

申请人 : 上海掌门科技有限公司

摘要 :

本发明涉及一种安卓应用程序防逆向破解的加固的方法、系统及解密方法,其中加固方法及系统均利用apktool工具对Android应用程序反汇编成smali文件,遍历所有的类,添加clinit,使用apktool进行重新编译成DEX文件,对DEX加固用到的关键SO进行SO加固保护。解密方法为分布式按需加载类文件,判断系统环境,通过数学统计学探测虚拟机是否被篡改。应用本发明的加解密技术方案,为Android平台下的应用加解密提出了创新的思路和可行的技术解决途径,可用于对Android平台下的应用进行保护,防止程序被反编译等黑客手段攻击,保护商业软件的机密性、保护用户应用安全。

权利要求 :

1.一种安卓应用程序防逆向破解的加固方法,包括以下步骤:使用安卓安装包编译工具对安卓应用程序进行反向汇编,生成中间文件;

遍历生成中间文件中的类,对需要加载的类设置对应的类构造器;

抽取出除了类构造器和初始化函数之外的所有中间文件进行加密并存储,对所述中间文件进行抽取操作,生成空壳程序文件和入口地址文件,调用动态链接库对可执行文件进行加固;以及

将加固文件写入空壳程序文件中;其中

所述设置对应的类构造器包括:遍历smali文件中的类函数,确定那些类是需要执行的,自动添加标记;当读到标记时,表示要指引执行这段程序。

2.根据权利要求1所述的方法,在抽取出除了类构造器和初始化函数之外的所有中间文件进行加密之前,还包括:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成可执行文件。

3.根据权利要求1所述的方法,对所述中间文件进行加密还包括:对所述入口地址文件进行修改操作,生成修改入口。

4.根据权利要求1所述的方法,所述空壳程序文件中还包括解密流程,该解密流程包括:当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;使用数学统计方法探测虚拟机是否被恶意篡改。

5.根据权利要求4所述的方法,所述数学统计方法包括方差均化方式。

6.一种安卓应用程序防逆向破解的加固系统,包括以下单元:获取安装包单元:用于获取原始安卓安装包;

反向汇编单元:利用安卓安装包编译工具对安卓应用程序反向汇编从而得到中间文件;

类构造器单元:遍历生成的中间文件中的类,对需要加载的类设置对应的类构造器;所述设置对应的类构造器包括:遍历smali文件中的类函数,确定那些类是需要执行的,自动添加标记;当读到标记时,表示要指引执行这段程序;

抽取加密单元:抽取出除了类构造器和初始化函数之外的所有中间文件进行加密并存储,对所述中间文件进行抽取操作,生成空壳程序文件和入口地址文件;

加固单元,调用动态链接库对可执行文件进行加固;以及写入单元,用于将动态链接库写入空壳程序文件中。

7.根据权利要求6所述的系统,所述抽取加密单元在抽取出除了类构造器和初始化函数之外的所有中间文件进行加密之前,还包括:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成可执行文件。

8.根据权利要求6所述的系统,所述抽取加密单元还包括:对所述入口地址文件进行修改操作,生成修改入口。

9.根据权利要求6所述的系统,所述空壳程序文件中还包括解密单元,该解密单元用于当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;使用数学统计方法探测虚拟机是否被恶意篡改。

10.根据权利要求9所述的系统,所述数学统计方法包括方差均化方式。

11.一种与权利要求1-5之一所述方法对应的空壳文件解密方法,包括以下步骤:得到Android版本号,判断该版本是否是有漏洞的版本;

如果是有漏洞版的,采用重写类函数以修复此漏洞;

测试是否是32位系统环境,如果是32位系统环境对32位系统虚拟机漏洞进行修复;

检测是否是ARM处理器环境;

对java运行环境进行检测,判断该运行环境是DVM模式还是ART模式;

检测是否是三星定制只读内存镜像;

如果是三星定制只读内存镜像的话,对可执行文件偏移地址进行修改;

当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;

使用数学统计方法探测虚拟机是否被恶意篡改。

12.根据权利要求11所述的方法,所述判断具有漏洞的版本是android3.0或android1.6。

说明书 :

一种安卓应用程序防逆向破解的加固方法、系统及解密方法

技术领域

[0001] 本发明涉及基于移动终端应用加密技术领域,具体而言,本发明涉及一种安卓应用程序防逆向破解的加固方法、系统及解密方法。

背景技术

[0002] 目前,由Google公司主导开发的Android操作系统已经是全球市场占有率最高的移动智能终端平台。Android的应用软件数量不断增长,并建立了良好的软件销售模式。与传统PC平台一样,Android应用软件的成功商业化,也引发了对它们的逆向分析和破解。
[0003] 对应用软件的逆向分析(reversing analysis)包括:
[0004] 一、对软件的可执行代码采用反汇编、反编译、调试等方法进行分析,以了解其代码的执行流程和算法实现等;
[0005] 二、对软件的配置文件和数据文件进行分析,以获得这些文件的格式和语义等;
[0006] 三、对软件的网络通信数据进行分析,以获得软件与服务器通信的协议格式、协议语义、数据加密方法和数据具体含义等。
[0007] 其中,后两类分析建立在第一类分析的基础之上,即需要先分析可执行代码,才能进一步分析配置文件、数据文件、网络通信数据等。
[0008] 通过逆向分析,攻击者可以获得软件中的商业机密。例如,在手机的反病毒软件中,恶意代码检测算法、特征匹配算法等可执行代码,以及恶意代码特征库等数据文件,一旦被攻击者逆向分析得到具体细节,既可能被其他同类软件所利用,也可能被恶意代码作者进行针对性防御或攻击。
[0009] 另外,为避免逆向破解,现有技术中也存在多种方式来进行预防和避免,如申请号:201610279693.1通过smali代码混淆的方式对自己的android app进行保护,代码依然可以被反汇编和反编译,只是提高了理解代码所需要的时间;申请号:201610206483.x通过反汇编后的smali代码进行加密保护,然而无论是代码还是加密后的数据,都以文件形式长期存在于Android安装文件和Android设备之中,使用内存dump仍可完成破解,由此,对于Android应用来说,黑客还是可以找到蛛丝马迹进行逆向破解。

发明内容

[0010] 鉴于现有技术中的上述缺陷或不足,期望能够提供一种安全性高、难以破解的方案。为了实现上述一个或多个目的,本申请提供了一种安卓应用程序防逆向破解的加固的方法和系统。
[0011] 根据本发明的一个方面,本发明提供了
[0012] 一种安卓应用程序防逆向破解的加固方法,包括以下步骤:
[0013] 使用安卓安装包编译工具对安卓应用程序进行反向汇编,生成中间文件;
[0014] 遍历生成中间文件中的类,对需要加载的类设置对应的类构造器;
[0015] 抽取出除了类构造器和初始化函数之外的所有中间文件进行加密并存储;以及,[0016] 调用动态链接库对可执行文件进行加固。
[0017] 优选的,在抽取出除了类构造器和初始化函数之外的所有中间文件进行加密之前,还包括:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成可执行文件。
[0018] 优选的,对所述中间文件进行加密还包括:
[0019] 对所述中间文件进行抽取操作,生成空壳程序文件和入口地址文件;以及,[0020] 对所述入口地址文件进行修改操作,生成修改入口。
[0021] 优选的,调用动态链接库对可执行文件进行加固之后还包括:将加固文件写入空壳程序文件中。
[0022] 优选的,所述空壳程序文件中还包括解密流程,该解密流程包括:当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;使用数学统计方法探测虚拟机是否被恶意篡改。
[0023] 优选的,所述数学统计方法可包括规律性统计或方差均化方式。
[0024] 根据本发明的另一个方面,本发明还提供了一种安卓应用程序防逆向破解的加固系统,包括以下单元:
[0025] 获取安装包单元:用于获取原始安卓安装包;
[0026] 反向汇编单元:利用安卓安装包编译工具对安卓应用程序反向汇编从而得到中间文件;
[0027] 类构造器单元:遍历生成的中间文件中的类,对需要加载的类设置对应的类构造器;
[0028] 抽取加密单元:抽取出除了类构造器和初始化函数之外的所有中间文件进行加密并存储;以及
[0029] 加固单元,调用动态链接库对可执行文件进行加固。
[0030] 优选的,所述抽取加密单元在抽取出除了类构造器和初始化函数之外的所有中间文件进行加密之前,还包括:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成可执行文件
[0031] 优选的,所述抽取加密单元还包括:
[0032] 对所述中间文件进行抽取操作,生成空壳程序文件和入口地址文件;
[0033] 对所述入口地址文件进行修改操作,生成修改入口。
[0034] 优选的,所述系统还包括写入单元,用于将动态链接库写入空壳程序文件中。
[0035] 优选的,所述空壳程序文件中还包括解密单元,该解密单元用于当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;使用数学统计方法探测虚拟机是否被恶意篡改。
[0036] 优选的,所述数学统计方法可包括规律性统计或方差均化方式。
[0037] 根据本发明的另一个方面,本发明还提供了一种空壳文件解密方法,包括以下步骤:
[0038] 得到Android版本号,判断该版本是否是有漏洞的版本;
[0039] 如果是有漏洞版的,采用重写类函数以修复此漏洞;
[0040] 测试是否是32位系统环境,如果是32位系统环境对32位系统虚拟机漏洞进行修复;
[0041] 检测是否是ARM处理器环境;
[0042] 对java运行环境进行检测,判断该运行环境是DVM模式还是ART模式;
[0043] 检测是否是三星定制只读内存镜像;
[0044] 如果是三星定制只读内存镜像的话,对可执行文件偏移地址进行修改;
[0045] 当类需要装载的时候,调用类构造器,通过类构造器调用底层函数进而解密出代码;
[0046] 使用数学统计方法探测虚拟机是否被恶意篡改。
[0047] 优选的,所述判断具有漏洞的版本是android3.0或android1.6
[0048] 本发明实施例提出的具体的Android应用程序APK加固方法、系统及解密方法,通过将按需解密以及对SO文件进行自定义格式,从而使得汇编后的SO文件内容难以识别,极大地增加了APK程序逻辑的分析时间成本以及分析难度,进一步提高的程序代码的安全性,有效的满足了Android应用程度对抗静态以及动态逆向破解的需求。另外,该方法和系统能够兼容多个版本android,包括兼容android4.0以下、android 6.0,适合在在三星定制的只读内存镜像、android4.4 art模式下运行。

附图说明

[0049] 通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0050] 图1为本发明的较佳实施例的Android应用程序APK加密方法的流程图。
[0051] 图2为本发明的较佳实施例的Android应用程序APK加密系统的结构图。
[0052] 图3为本发明的较佳实施例的解密的方法流程图。
[0053] 图4为本发明的较佳另外一种实施例的解密的方法流程图。

具体实施方式

[0054] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0055] 图1示出了根据本发明一个实施例的一种安卓应用程序防逆向破解的加固方法的流程示意图;如图1所示,本发明的防逆向破解的加固方法包括以下步骤:
[0056] 步骤101获取安卓应用的原始安卓安装包;
[0057] 安卓系统中,一个可以安装、运行的应用需要打包成安卓安装包,即APK(android application package file)文件格式。其中,所述APK是Android Package的缩写,即Android安装包。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,并被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。一个APK文件内可以包含被编译的代码文件(DEX文件),资源文件夹(名称为res的文件夹),证书(certificates)和清单文件(manifest file)等。APK文件其实是zip格式,但后缀名被修改为apk,通过Unzip解压后,就可以得到所述APK文件中的原始DEX文件,其中DEX是DalvikVM executes的全称,即Android Dalvik执行程序,也就是说,DEX文件的功能类似于Windows系统下的EXE文件。
[0058] 步骤102,利用安卓安装包编译工具对安卓应用反向汇编从而得到中间文件;
[0059] 所述安卓安装包编译工具可为apktool或Baksmali反汇编器,所述中间文件为smali文件。将安卓应用中的DEX文件进行反汇编操作,从而在反编译工程目录下生成一个smali文件夹,里面存放着所有反编译出的smali文件,这些文件会根据程序包的层次结构生成相应的目录,程序中所有的类都会在相应的目录下生成独立的smali文件。
[0060] 步骤103,遍历生成的中间文件中的类,对需要加载的类设置对应的类构造器;优选的,所述设置对应的类构造器包括:遍历smali文件中的类函数,确定那些类是需要执行的,自动添加标记;当读到标记时,表示要指引执行这段程序。
[0061] 步骤104,使用安卓安装包编译工具对上述设置了类构造器的smali文件进行汇编操作,重新编译成可执行文件;随后抽取出除了类初始化函数和初始化函数之外的所有中间文件进行加密并存储;
[0062] 所述可执行文件为DEX文件,所述类初始化函数和初始化函数分别为clinit和init函数;
[0063] 具体的,使用已知的第三方汇编工具apktool或Smali汇编器将上述设置了类构造器的的smali文件重新编译成DEX文件,其中,汇编工具与反汇编工具应该是相互匹配的,如Smali和Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种DEX格式文件的汇编器和反汇编器。
[0064] 优选的,对文件加密包括:
[0065] 对smali代码进行抽取操作,以生成空壳smali文件和入口地址文件;
[0066] 对所述入口地址文件进行修改操作,以生成修改入口。
[0067] 优选的,还可以对重新编译的DEX进行加密。具体包括:加载DEX文件,解析DEX文件为DEX基础结构数据文件和字节码数据文件,调用davlik虚拟机函数openDEXFile以加载所述DEX基础结构数据文件。将DEX文件的Head,String Table,Type Table,Proto Table,Field Table,Method Table、Class Def Table,Data Section这几个部分进行分离,形成字节码数据文件,确定并读取各部分文件的偏移值。抽取DEX文件中的字节码数据,并存储到所述DEX函数实现字节码数据文件;使用对称加密算法对各字节码数据文件进行加密。加密算法可以是加密算法可以是利用常规的数据加密算法,如AES(Advanced Encryption Standard,高级加密标准),对所述原始DEX文件进行加密处理,从而得到加密DEX文件。进一步地,还可以对所述原始DEX文件进行整体加密,如加密算法采用AES,签名算法采用RSA(公钥加密算法),摘要算法采用SHA1(Secure Hash Algorithm,安全哈希算法),也可以得到加密DEX文件。
[0068] 步骤105,通过动态链接库对可执行文件进行加固。
[0069] 所述加固包括:
[0070] 对SO文件进行格式分析以生成自定义格式;
[0071] 对所述自定义格式进行加密以生成加密后的自定义格式;
[0072] 将加密后的自定义格式嵌入到linker装载器里。
[0073] 通常地,SO文件为动态链接库,本质是共享文件库,由C或C++语言编译出来的。在程序启动的时候首先加载该SO文件。并由该SO文件分别解密解压缩文件,并且调用openDEXFile加载DEX基础结构数据文件。并根据DEX函数实现字节码数据文件中的数据依次修复DEX基础结构数据文件每个函数的偏移,之后程序正常运行。
[0074] 步骤106,将动态链接库写入空壳程序文件中,进而通过空壳程序文件进行加载运行。所述空壳程序文件为空壳smali文件。
[0075] 优选的,对SO文件进行加壳处理,将加固后的SO文件作为代码数据写入壳程序文件中;对壳程序文件中的SO文件可通过以下方式进行保护。包括去掉SO文件中的局部信息,即实现了SO文件局部信息缺失;从而无法得到完整的SO文件;对SO文件进行分段加密处理:即对数据节和代码节分别加密,提升解密难度;对SO文件进行代码混淆处理:即给破解者提供乱序代码,造成困扰,增加破解难度。
[0076] 优选的,在壳程序文件中包含能够对加固的SO文件进行解密处理的代码。在加载运行SO文件时,壳程序文件会先于SO文件运行,取得优先权,对加固的SO文件进行解密处理,
[0077] 如附图3所示,所述解密处理流程包括:
[0078] 1.测试是系统环境是否是32位系统环境,如果是32位系统环境对32位系统虚拟机漏洞进行修复;
[0079] 优选的,所述32位系统为X86,该虚拟机漏洞是smali指令集漏洞,对x86虚拟机漏洞进行修复是在虚拟机中指令集解释层面的x86汇编,采用hook技术进行修复;
[0080] 2.检测是否是arm环境;
[0081] 3.对java运行环境进行检测,判断该运行环境是dvm模式还是art模式;优选的,可通过加载libart.SO或libdvm.SO来检测出java运行环境;
[0082] 4.当类需要装载的时候,调用clinit函数,通过clinit函数调用底层函数进而解密出代码,代码遍历采用红黑树算法进行优化,以达到O(lgn)级别的数据结构;
[0083] 优选的,利用clinit函数指引到要执行的程序,在执行相应的程序后执行空壳程序文件,通过空壳程序文件调用动态链接库,在利用动态链接库从中间文件中调取相应的程序,通过动态链接库对加密的程序进行解密;
[0084] 优选的,解密代码包括使用接口DEXGetClassDef循环获取DEXFile结构ClassDef,使用GetStaticMethodID查找含有clinit方法的类,实现主动解密;优选的,所述实现主动解密方法为循环查找内存中Method结构被解密的代码,判断AccessFlags有无Native标志,若无,则表示已完成主动解密。
[0085] 5.使用数学统计方法探测虚拟机是否恶意篡改,以防止破解者从内核层来逆向破解;没有被恶意篡改则通过DEXClassLoader动态加载apk文件;该数学统计方法可包括规律性统计或方差均化方式。
[0086] 优选的,在步骤4中,只对需要的类进行解密并动态加载,没有用到的类还是以加密形式存在,等该类加载完成后再加密。这样即使程序被反编译,由于重要代码已经被隐藏在DEX文件中,并且已经被加密过,攻击者也不能获得关键信息。由于不存在完全被解密的原始的DEX文件,从而降低了APK安装文件被破解和反编译的风险。使得SO文件的源代码恢复为完整的、代码排序正确的、无加密的、可还原的代码。
[0087] 本发明实施例提出的加固方法,通过将DEX文件反汇编得到中间文件,并将中间文件的相关指令进行加密处理,可以将相关指令保护起来,得到受保护的DEX文件,增加了程序逻辑的分析时间成本以及分析难度,提高了程序代码的安全性。
[0088] 图2示出了根据本发明一个实施例的一种安卓应用程序防逆向破解的加固系统结构框图,该系统包括以下模块:
[0089] 获取安装包单元:用于获取原始安卓安装包;
[0090] 反向汇编单元:使用安卓安装包编译工具对安卓应用程序进行反向汇编,生成中间文件;
[0091] 具体的,所述安卓安装包编译工具可为apktool或Baksmali反汇编器,所述中间文件为smali文件。将安卓应用中的DEX文件进行反汇编操作,从而在反编译工程目录下生成一个smali文件夹,里面存放着所有反编译出的smali文件,这些文件会根据程序包的层次结构生成相应的目录,程序中所有的类都会在相应的目录下生成独立的smali文件。
[0092] 类构造器单元:遍历生成中间文件中的类,对需要加载的类设置对应的类构造器并对抽取出的中间文件进行加密并存储;
[0093] 优选的,所述设置对应的类构造器包括:遍历smali文件中的类函数,确定那些类是需要执行的,自动添加标记;当读到标记时,表示要指引执行这段程序。
[0094] 优选的,对文件加密包括:
[0095] 对smali代码进行抽取操作,以生成空壳smali文件和入口地址文件;
[0096] 对所述入口地址文件进行修改操作,以生成修改入口。
[0097] 抽取加密单元:使用安卓安装包编译工具对上述设置了类构造器的中间文件进行汇编处理,重新编译成DEX文件。
[0098] 具体的,使用已知的第三方汇编工具apktool或Smali汇编器将上述设置了类构造器的的smali文件重新编译成DEX文件,其中,汇编工具与反汇编工具应该是相互匹配的,如Smali和Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种DEX格式文件的汇编器和反汇编器。
[0099] 优选的,还可以对重新编译的DEX进行加密。具体包括:加载DEX文件,解析DEX文件为DEX基础结构数据文件和字节码数据文件,调用davlik虚拟机函数openDEXFile以加载所述DEX基础结构数据文件。将DEX文件的Head,String Table,Type Table,Proto Table,Field Table,Method Table、Class Def Table,Data Section这几个部分进行分离,形成字节码数据文件,确定并读取各部分文件的偏移值。抽取DEX文件中的字节码数据,并存储到所述DEX函数实现字节码数据文件;使用对称加密算法对各字节码数据文件进行加密。加密算法可以是加密算法可以是利用常规的数据加密算法,如AES(Advanced Encryption Standard,高级加密标准),对所述原始DEX文件进行加密处理,从而得到加密DEX文件。进一步地,还可以对所述原始DEX文件进行整体加密,如加密算法采用AES,签名算法采用RSA(公钥加密算法),摘要算法采用SHA1(Secure Hash Algorithm,安全哈希算法),也可以得到加密DEX文件。
[0100] 加固单元,通过动态链接库对DEX文件进行加固。
[0101] 优选的,所述加固单元包括:
[0102] 解析单元:用于对SO文件进行格式分析以生成自定义格式;
[0103] 抽取单元,用于对所述SO文件进行抽取操作,以生成抽取后的自定义格式;
[0104] 加密单元,用于对所述自定义格式进行加密;
[0105] 修改单元,用于对所述修改入口函数进行修改操作,以生成修改后入口;
[0106] 保护代码单元,用于在加密后的自定义格式中嵌入保护代码;
[0107] 嵌入单元,用于将加密并嵌入保护代码后的自定义格式嵌入到linker装载器里。
[0108] 通常地,SO文件为动态链接库,本质是共享文件库,由C或C++语言编译出来的。在程序启动的时候首先加载该SO文件。并由该SO文件分别解密解压缩文件,并且调用openDEXFile加载DEX基础结构数据文件。并根据DEX函数实现字节码数据文件中的数据依次修复DEX基础结构数据文件每个函数的偏移,之后程序正常运行。
[0109] 写入单元:将动态链接库写入空壳中间文件中,进而通过空壳程序文件进行加载运行。所述空壳程序文件为空壳smali文件。
[0110] 优选的,所述空壳程序文件中还包括解密单元,所述解密单元包括:测试是否x86环境,如果是x86环境对x86虚拟机漏洞进行修复;检测是否是arm环境;对java运行环境进行检测,判断该运行环境是dvm模式还是art模式;当类需要装载的时候,调用clinit函数,通过clinit函数调用底层函数进而解密出代码,代码遍历采用红黑树算法进行优化,以达到O(lgn)级别的数据结构;使用数学统计方法探测虚拟机是否恶意篡改,以防止破解者从内核层来逆向破解。所述数学统计方法可包括规律性统计或方差均化方式。
[0111] 同时,该解密流程通过判断虚拟机、arm、java环境来解决系统的兼容性。
[0112] 图4示出了根据本发明另一个实施例的一种递进式解密方法的流程,[0113] 该解密流程进一步解决在不同安卓版本下对三星定制只读内存镜像的解密流程,该流程具体如下:
[0114] 1.得到Android版本号,判断该版本是否是有漏洞的版本;
[0115] 2.判断具有漏洞的版本是否是安卓3.0或安卓1.6;
[0116] 3.如果是有漏洞版的,采用重写类函数以修复此漏洞;
[0117] 4.测试是否是32位系统环境,如果是32位系统环境对32位系统虚拟机漏洞进行修复;
[0118] 优选的,所述32位系统为X86,该虚拟机漏洞是smali指令集漏洞,对x86虚拟机漏洞进行修复,是在虚拟机中指令集解释层面的x86汇编,采用hook技术进行修复;
[0119] 5.检测是否是arm环境;
[0120] 6.对java运行环境进行检测,判断该运行环境是dvm模式还是art模式;优选的,可通过加载libart.SO或libdvm.SO来检测出java运行环境;
[0121] 7.检测是否是三星定制只读内存镜像ROM;
[0122] 优选的,因三星定制只读内存镜像ROM的装载DEX的偏移地址和原android版有根本的不同,进而判断是否是三星定制只读内存镜像ROM;
[0123] 8.如果是三星定制只读内存镜像的话,对可执行文件DEX偏移地址进行修改,不是,则直接执行步骤9;
[0124] 其中可修改DEX头中的checksum、signature、file_size、header_size、string_ids_off、type_ids_off、proto_ids_off、field_ids_off、method_ids_off、class_defs_off和data_off相关项。分析map_off数据,修改相关的数据偏移量。
[0125] 9.当类需要装载的时候,调用clinit函数,通过clinit函数调用底层函数解密出代码,代码遍历采用红黑树算法进行优化,以达到O(lgn)级别的数据结构;
[0126] 进一步地,解密代码包括使用接口DEXGetClassDef循环获取DEXFile结构ClassDef,使用GetStaticMethodID查找含有clinit方法的类,实现主动解密;进一步地,所述实现主动解密方法为循环查找内存中Method结构被解密的代码,判断AccessFlags有无Native标志,若无,则表示已完成主动解密。
[0127] 10.使用数学统计方法探测虚拟机是否恶意篡改用于破解;该数学统计方法可包括规律性统计或方差均化方式。
[0128] 其中在步骤9中,只对需要的类进行解密并动态加载,没有用到的类还是以加密形式存在,等该类加载完成后再加密。这样即使程序被反编译,由于重要代码已经被隐藏在DEX文件中,并且已经被加密过,攻击者也不能获得关键信息。由于不存在完全被解密的原始的DEX文件,从而降低了APK安装文件被破解和反编译的风险。该方法中解决了代码运行时,由于系统漏洞的问题导致崩溃的现象,极大提升了加固时的兼容性问题。
[0129] 以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉该技术的人在本发明所揭露的技术范围内,可轻易想到的变化或替换,都应该涵盖在本发明保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。