现在最流行的App破解技(jì )术大多(duō)是基于一定相关技(jì )术的基础:如一定阅读Java代码的能(néng)力、有(yǒu)一些Android基础、会使用(yòng)eclipse的一些Android调试的相关工(gōng)具(jù)以及了解一些smali的语法规范和字段的自定范围,再利用(yòng)现有(yǒu)的各种工(gōng)具(jù):如APKtool、dex2jar、jd-gui以及签名(míng)工(gōng)具(jù)。有(yǒu)了这些前基础和工(gōng)具(jù),就可(kě)以破解很(hěn)多(duō)没有(yǒu)加反编译保护措施的App。
那么如何就安(ān)卓App安(ān)全,APP加固,APP防反编译进行保护,以下内容将会為(wèi)读者作(zuò)出详解。
安(ān)卓App安(ān)全包含很(hěn)多(duō)内容,其中(zhōng)包括混淆代码、整體(tǐ)Dex加固、拆分(fēn)Dex加固、虚拟机加固等方面。事实上,这些内容也是國(guó)内近几年Android App安(ān)全保护的一种主要趋势。
一、混淆代码
Java代码是非常容易反编译的,作(zuò)為(wèi)一种跨平台的、解释型语言,Java 源代码被编译成中(zhōng)间“字节码”存储于class文(wén)件中(zhōng)。由于跨平台的需要,这些字节码带有(yǒu)许多(duō)的语义信息,很(hěn)容易被反编译成Java源代码。為(wèi)了很(hěn)好地保护Java源代码,开发者往往会对编译好的class文(wén)件进行混淆处理(lǐ)。
混淆就是对发布出去的程序进行重新(xīn)组织和处理(lǐ),使得处理(lǐ)后的代码与处理(lǐ)前代码完成相同的功能(néng),而混淆后的代码很(hěn)难被反编译,即使反编译成功也很(hěn)难得出程序的真正语义。ProGuard就是一个混淆代码的开源项目,能(néng)够对字节码进行混淆、缩减體(tǐ)积、优化等处理(lǐ)。
Proguard处理(lǐ)流程图如下所示,包含压缩、优化、混淆、预检四个主要环节:
压缩(Shrink):检测并移除代码中(zhōng)无用(yòng)的类、字段、方法和特性(Attribute);
优化(Optimize):对字节码进行优化,移除无用(yòng)的指令。优化代码,非入口节点类会加上private/static/final,没有(yǒu)用(yòng)到的参数会被删除,一些方法可(kě)能(néng)会变成内联代码;
混淆(Obfuscate):使用(yòng)a、b、c、d这样简短而无意义的名(míng)称,对类、字段和方法进行重命名(míng);
预检(Preveirfy):在Java平台上对处理(lǐ)后的代码进行预检,确保加载的class文(wén)件是可(kě)执行的。
二、整體(tǐ)Dex加固
為(wèi)了加强Android保护强度,随着安(ān)全技(jì )术的发展,又(yòu)出现了新(xīn)型的“加固技(jì )术”。DEX加固是对DEX文(wén)件进行加壳防护,防止被静态反编译工(gōng)具(jù)破解而泄露源码,最刚开始出现的是整體(tǐ)加固技(jì )术方案。
整體(tǐ)加固技(jì )术的原理(lǐ)如上所示,包括替换application/classes.dex、解密/动态加载原classes.dex、调用(yòng)原application相关方法、将原application对象/名(míng)称设置到系统内部相关变量四大环节。其中(zhōng)最為(wèi)关键的一步就是解密/动态加载原classes.dex,通过加密编译好的最终dex源码文(wén)件,然后在一个新(xīn)项目中(zhōng)用(yòng)新(xīn)项目的application启动来解密原项目代码并加载到内存中(zhōng),再把当前进程替换為(wèi)解密后的代码,能(néng)够很(hěn)好地隐藏源码并防止直接性的反编译。
三、拆分(fēn)Dex加固
随着业務(wù)规模发展到一定程度,不断地加入新(xīn)功能(néng)、添加新(xīn)的类库,代码在急剧膨胀的同时,相应的apk包的大小(xiǎo)也急剧增加,那么简单的整體(tǐ)加固方案就不能(néng)很(hěn)好地满足安(ān)全需求,在整體(tǐ)加固方案之外又(yòu)出现了拆分(fēn)加固的技(jì )术方案。
但是如上所示,dex文(wén)件在加固时,针对中(zhōng)间缺失的一部分(fēn)数据会以解密后的数据来替换,有(yǒu)的时候这种拆分(fēn)替换也会导致数据不准确。那么到底应该拆分(fēn)什么样的数据呢(ne)?就需要了解一下dex文(wén)件的数据结构。
Dex文(wén)件结构极為(wèi)复杂,以下图示选取了其中(zhōng)较為(wèi)重要的内容。事实上,dex文(wén)件是一个以class為(wèi)核心组装(zhuāng)起来的文(wén)件,其中(zhōng)最重要的是classdata和classcode两部分(fēn),有(yǒu)其特定的接口和指令数据,选取这两部分(fēn)来拆分(fēn)的话,即使拆分(fēn)出来也不会泄露class数据和字节码数据,反编译出来也不完整,安(ān)全性较高。
四、虚拟机加固
虚拟机加固也属于dex拆分(fēn)加固的一种,它是对字节做了一些变化处理(lǐ)。如下所示,这是一个正常安(ān)卓系统中(zhōng)的代码,在其中(zhōng)进行了虚拟机加固操作(zuò):
以add-int v0, v1, v2、sub-int v0, v1, v2、mul-int v0, v1, v2这三条指令进行替换,然后进行加固编译,这样子操作(zuò)后,即使把替换后的数据恢复了,也不会以add-int v0, v1, v2、sub-int v0, v1, v2、mul-int v0, v1, v2这三条指令进行替换,然后进行加固编译,这样子操作(zuò)后,即使把替换后的数据恢复了,也不会变形成為(wèi)之前的字节码,安(ān)全系数较高。
爱加密(www.ijiami.cn)是全球专业的移动信息安(ān)全综合服務(wù)提供商(shāng),专注于移动应用(yòng)安(ān)全、安(ān)全大数据及物(wù)联网安(ān)全,坚持以用(yòng)户需求為(wèi)导向、持续不断的创新(xīn),致力于為(wèi)客户提供全方位、一站式的移动安(ān)全全生命周期解决方案。爱加密的愿景是通过革新(xīn)性安(ān)全方案和7X24小(xiǎo)时全天候的专业服務(wù)保护更加智能(néng)世界的安(ān)全,打造和谐、强大、高度安(ān)全的万物(wù)互联生态环境。