一种Android系统应用的深度代码混淆方法转让专利

申请号 : CN201310509882.X

文献号 : CN103544414B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 汪德嘉宋超刘家郡

申请人 : 江苏通付盾信息科技有限公司

摘要 :

本发明揭示了一种Android系统应用的深度代码混淆方法,采用分级代码混淆处理实现,该分级代码混淆处理包括第一级的名称替换混淆,第二级的指令插入混淆,第三级的结构流程混淆和第四级的指令反转混淆,对任意已开发完毕待发布的应用安装包,提取dex文件并分析文件结构、Dalvik指令集和程序运行流程,确定选用相应级别或多级组合的混淆方案对dex文件进行深度代码混淆,生成新的dex文件并重新打包。应用本发明深度代码混淆的技术方案,能突破传统基于源代码的代码混淆方案的局限,对dex可执行文件从要素名称、指令、流程结构等方面直接进行混淆,能有效地防止应用程序被非法破解或者逆向,提高了Android系统上应用程序的安全性,保证了商业软件的机密性。

权利要求 :

1.一种Android系统应用的深度代码混淆方法,其特征在于:所述深度代码混淆方法针对Android系统中应用的dex文件并对其中Dalvik指令做分级代码混淆处理实现,所述分级代码混淆处理包括第一级的名称替换混淆,第二级的指令插入混淆,第三级的结构流程混淆和第四级的指令反转混淆,对任意已开发完毕待发布的应用安装包,提取dex文件并分析文件结构、Dalvik指令集和程序运行流程,确定选用相应级别或多级组合的混淆方案对dex文件进行深度代码混淆,生成新dex文件并重新打包;其中所述名称替换混淆指的是通过解析dex文件获知对应变量、类、方法的具体定义和名称,采用算法或算法组合将名称改为意义不同的字符-数字组合;

所述指令插入混淆指的是将未使用的无效指令或有效指令掺合无效数据自定制成无效指令集合,在无效指令集合中随机抽取部分指令插入dex文件中对程序功能代码的执行流程无影响的位置;

所述结构流程混淆指的是对程序功能代码的执行流程进行乱序混淆,使Dalvik虚拟机运行乱序混淆后的代码流程与原始代码流程一致,而反编译乱序混淆后的代码流程静态阅读时与原始代码流程无相关性;

所述指令反转混淆指的是在dex文件中复合一个隐密性的预启动程序,dex文件被预启动程序依据正确的Dalvik指令集对应的二进制码进行大小端反转后重新打包,并在Dalvik虚拟机中首先运行预启动程序对大小端再进行复原。

说明书 :

一种Android系统应用的深度代码混淆方法

技术领域

[0001] 本发明涉及一种应用程序代码的混淆隐藏方法,尤其涉及一种在保持代码语义不变的前提下,对代码进行尽可能的系统改写和变形,隐藏代码原本的结构,从而达到提高代码静态阅读和理解难度的目的,可应用在Android等移动平台的应用软件的开发中,对应用软件版权强化保护。

背景技术

[0002] 对于以软件开发为支柱的企业而言,任何一个软件系统都是各个公司付出极大的人力和物力后获得的成果,因此软件代码的保护对每个公司或团体来说都是至关重要的。如果一个团队凭借夜以继日的工作开发出来的功能被竞争对手轻易复制并集成到自己的系统中,这对公司的打击和对行业的公平性都有极大的影响。
[0003] 为了增大竞争对手或其它黑客对软件代码的逆向难度,进而增强对软件的保护能力,代码混淆技术才不断发展。假定只要有足够的时间和资源,黑客总能成功地逆向分析出任何一个程序。换而言之,即没有哪个隐含在程序中的秘密能够永远不被发现。使用代码混淆技术的目标只是尽量延长黑客破解所需的时间,使其因破解获取的信息的价值远小于其耗费的时间和精力的价值,同时又不使由此增加的性能开销大到自己承受不了的地步。一般而言,只要代码被混淆得足够复杂,基于理性的分析黑客可能就会放弃攻击。而在混淆代码时一般也会考虑效率问题,所以要选择正确的混淆方式和混淆算法(或者混淆算法的组合),对最重要的代码进行混淆,以保证混淆后的代码不会慢到(或大到)客户无法忍受的地步。
[0004] 在Android平台,已经引入了代码迷惑技术。但是经过技术人员的研究表明,Android平台现有的代码迷惑技术主要包括类名的混淆、类中字段名的混淆、类中方法名的混淆。从技术上看,这些混淆技术还处于比较低级的层次,这种层级的混淆对提高黑客逆向工程的难度没有多大的作用。特别针对程序的核心Activity使用常见的代码混淆技术是不能对其进行混淆的,否则将影响程序的正常运行。另一方面,Android系统中现有的代码迷惑技术没有很好的处理程序的控制结构和调用结构,很多成熟的代码混淆技术没有得到充分使用。
[0005] 此外,还考虑到即使在Android应用的Java源码级别对程序进行更高级别的混淆,例如插入大量迷惑代码、改变代码结构等。因为Android可执行文件dex的生成需经过从Java源码到class文件再由class文件到dex文件两个阶段,Java编译器和dex编译器都会对代码进行一定程度上的优化,所以源码级别上的代码混淆能收到怎样的效果是一个未知数。

发明内容

[0006] 针对上面提到的种种当前Android代码混淆方面的不足,本发明的目的旨在提出一种Android系统应用的深度代码混淆方法,从一个全新的角度诠释Android代码混淆技术。
[0007] 本发明的上述目的,其得以实现的技术解决方案为:一种Android系统应用的深度代码混淆方法,其特征在于:所述深度代码混淆方法针对Android系统中应用的dex文件并对其中Dalvik指令做分级代码混淆处理实现,所述分级代码混淆处理包括第一级的名称替换混淆,第二级的指令插入混淆,第三级的结构流程混淆和第四级的指令反转混淆,对任意已开发完毕待发布的应用安装包,提取dex文件并分析文件结构、Dalvik指令集和程序运行流程,确定选用相应级别或多级组合的混淆方案对dex文件进行深度代码混淆,生成新dex文件并重新打包,其中所述名称替换混淆指的是通过解析dex文件获知对应变量、类、方法的具体定义和名称,采用算法或算法组合将名称改为意义不同的字符-数字组合;
[0008] 所述指令插入混淆指的是将未使用的无效指令或有效指令掺合无效数据自定制成无效指令集合,在无效指令集合中随机抽取部分指令插入dex文件中对程序功能代码的执行流程无影响的位置;
[0009] 所述结构流程混淆指的是对程序功能代码的执行流程进行乱序混淆,使Dalvik虚拟机运行乱序混淆后的代码流程与原始代码流程一致,而反编译乱序混淆后的代码流程静态阅读时与原始代码流程无相关性;
[0010] 所述指令反转混淆指的是在dex文件中复合一个隐密性的预启动程序,dex文件被预启动程序依据正确的Dalvik指令集对应的二进制码进行大小端反转后重新打包,并在Dalvik虚拟机中首先运行预启动程序对大小端再进行复原。
[0011] 应用本发明深度代码混淆的技术方案,能突破传统基于源代码的代码混淆方案的局限,对dex可执行文件从要素名称、指令、流程结构等方面直接进行混淆,能有效地防止应用程序被非法破解或者逆向,提高了Android系统上应用程序的安全性,保证了商业软件的机密性。

附图说明

[0012] 图1为本发明深度代码混淆的系统框图。
[0013] 图2为本发明深度代码混淆的方法流程图。

具体实施方式

[0014] 本发明为应对日益严重的移动操作系统的客户端安全,创新地提出了一种针对Android系统中应用程序深度代码混淆的技术。该技术方案能突破传统基于源代码的代码混淆方案的局限,利用应用程序安装包中dex文件可以在Dalvik虚拟机中直接运行的便利条件,从而对dex文件直接进行混淆。
[0015] (1)从Dalvik指令的角度对程序进行全新的混淆。对已经开发完毕准备发布的Android应用的安装包进行混淆,提取其中的dex可执行文件,对程序的Dalvik指令进行混淆。
[0016] (2)根据Dalvik指令的特点确定混淆级别(深入到Dalvik指令组成结构)并定制有效的分级代码混淆处理,确定选用相应级别或多级组合的混淆方案对dex文件进行深度代码混淆。该分级代码混淆处理包括第一级的名称替换混淆,第二级的指令插入混淆,第三级的结构流程混淆和第四级的指令反转混淆。
[0017] 本发明在不影响程序开发人员正常的开发流程的情况下直接对Android应用的安装包进行混淆,生成新dex文件并重新打包。其中根据dex可执行文件的结构以及Dalvik指令集的特点可以进行如下混淆。
[0018] 作为第一级的名称替换混淆,参考源代码级混淆方案,依照其原理并将其在dex文件中实现,即对dex文件中的Dalvik指令的相应位置进行改写,混淆变量名、类名以及方法名等。由于这不是基于源代码的,省去了编译器的优化和处理,在不影响运行的情况下得到的混淆结果就是虚拟机最终的执行结果。其具体实现应该首先需要对dex文件的结构进行完整解析,分别找到对应变量、类和方法定义在dex文件中的入口;然后通过入口接触到所有的变量、类和方法的具体定义并获取到这些定义中所需要的名称;最后将这些变量、类和方法的名称用某些算法(或者是算法的组合)进行改写,将其转变成一些无意义的字符或者数字的组合。此外最好将此次改写定义为一种不可逆的行为,这样使黑客很难将程序可逆成原本的面目,进而可以防止黑客根据变量、类或者方法的名称对程序的功能进行猜测。
[0019] 作为第二级的指令插入混淆,对dex文件进行分析,在合适的部位插入一些在Dalvik指令集中定义但是并未正式使用的无效指令,或者在有效指令之后插入一些无效数据。这样不会对应用程序的安装和运行造成影响,但是却对正常的程序运行逻辑进行干扰,并且对反编译工具有很好的对抗效果。其具体实现应该首先先对Dalvik指令集进行完整的分析,找出那些预留的并没有正式使用的无效指令,或者自定义一些有效指令和无效数据的组合,将其形成一个指令集合;然后对dex文件进行分析,在程序的代码区找出一些对程序本身运行流程没有影响的位置;最后,从无效指令集合中随机选取一些指令,分别插入到这些对应的位置上,由此就形成了一个在随机位置包含随机无效指令的新的dex文件。这样使得自动化的反编译工具在大部分情况下会崩溃,但是对于手动分析程序结构的黑客影响仅限于增加了其逆向工作的工作量。
[0020] 作为第三级的结构流程混淆,在详细分析dex文件结构的基础上,对整个应用程序的组成结构进行混淆,使程序的整个运行流程看似发生了改变,更好地隐藏应用程序的本身的运行逻辑。其具体实现需要在掌握整个程序运行流程的基础上对功能代码的执行流程进行乱序混淆,而当Dalvik虚拟机运行乱序混淆后的代码流程却和原始代码流程是一样的,但反编译出来的代码流程静态阅读时与原始流程有很大差异,使破解者很难通过静态分析理解代码功能,从而保护代码不被逆向分析。比如,原始的代码流程是a-b-c-d-e,经过乱序混淆后静态反汇编查看到的代码流程可能变成b-d-c-a-e,但是代码在实际运行时流程仍然是a-b-c-d-e。
[0021] 作为第四级的指令反转混淆,基于Dalvik指令集,将应用程序中涉及到的指令对应的二进制码进行大小端的反转,通过运行时在程序启动之前用特殊方法再转变过来。黑客去静态分析这样一个经过大小端反转的安装程序是根本无效的,极大地提高了应用程序的安全性。其具体实现为提取应用程序安装包中的dex,并添加一个自己的预启动程序,这个程序实现的功能是,依据正确的Dalvik指令集对原本的dex文件进行大小端反转,包括正向和逆向。经过反转之后的dex文件重新打包成应用程序安装包,在系统中运行时预启动程序首先运行,对大小端反转的程序进行复原使得虚拟机可以正确运行。这样处理之后,如果黑客拿到程序的安装包进行逆向分析,那么其逆向之后得到的将是一个字节码完全混乱的文件,很难获取到有用的信息。
[0022] 本发明深度代码混淆器综合利用上述四种混淆方案,然后再辅以有效的算法通过Dalvik指令集的组成结构计算不同dex文件中Dalvik指令的构成,从而确定混淆级别,对不同的dex文件可以实现不同级别的混淆方案或者多种混淆方案的组合。
[0023] 从图1的深度混淆系统框图中可以看到,本发明深度代码混淆方法针对进入系统中的dex文件,首先利用dex文件分析模块进行处理,该模块利用Dalvik指令集的特点,对dex文件中的指令类型进行分析,从而确定可以实施的混淆方案,得到的混淆方案可以是单独的某一种混淆方案,也可以是几种方案的组合。将确定的混淆方案传递给方案选择模块,选取合适的混淆模块进行处理,最后将处理好的dex文件输出。
[0024] 从图2可以看到深度代码混淆方案是整个程序从发布到运行的流程中的作用。首先深度代码混淆器根据应用程序安装包提取对应的dex文件,然后自己通过图1中的各个模块处理之后得到混淆过后的dex文件,把这个dex文件重新打包到应用程序安装包里面并由Android操作系统进行安装,进过操作系统的处理将此安装包中的dex文件交由Dalvik虚拟机进行运行,经过混淆的dex文件由此得到执行。
[0025] 实施例一:当有黑客拿到经过本发明深度代码混淆器第一级混淆的安装包之后,如果利用现有的反编译工具进行反编译可以得到反编译的文件,但是得到的文件中所有的变量、类和方法名都会变为无意义的字符或数字序列,增加其静态分析的工作量。
[0026] 实施例二:当有黑客拿到经过本发明深度代码混淆器第二级混淆的安装包之后,使用反编译工具进行反编译直接会造成反编译工具的崩溃,导致得不到任何有用的文件;若黑客自己针对dex文件进行手动分析,那么其中插入的各种无效指令以及有效指令和无效数据的组合会对分析流程造成很大障碍,造成其逆向工作的工作量飙升。
[0027] 实施例三:当有黑客拿到经过本发明深度代码混淆器的第三级混淆的安装包之后,不管是使用反编译工具还是自己对dex文件手动分析,在表面上都只能看到伪造的程序流程,真正的执行流程被隐藏起来,虽说不能彻底防止逆向分析,但是也很好地实现了增加逆向分析复杂度的目的。
[0028] 实施例四:当有黑客拿到经过本发明深度代码混淆器的第四级混淆的安装包之后,首先根本不能使用反编译工具进行反编译,会直接导致反编译工具的崩溃,而且当手动针对dex文件分析时也不能得到有用的信息,因为dex文件中的字节码都是大小端反转的,因此此时参考Dalvik对指令进行分析只可能得到错误的结果,此种方案具备很强的安全性。
[0029] 若是综合使用其上两个以上的组合混淆方案进行深度代码混淆,令黑客或黑客工具同时崩溃,势必彻底杜绝Android系统或其它移动平台下所开发的功能应用的逆向破解。
[0030] 综上所述可见,应用本发明深度代码混淆的技术方案,能突破传统基于源代码的代码混淆方案的局限,对dex可执行文件从要素名称、指令、流程结构等方面直接进行混淆,能有效地防止应用程序被非法破解或者逆向,提高了Android系统上应用程序的安全性,保证了商业软件的机密性。