Android逆向基础
我们Android项目的apk如果没有做任何处理,没有混淆,也没有加固。通过反编译工具反编译出来后就能很清晰的看到你的源代码,可以看到,包名,包结构,类名以及类文件都原封不动的显示出来了。这样的话对于我们的项目而言就没有任何安全性可言了,所以一般我们的项目在发布之前会进行混淆加固处理,那么混淆、加固是什么意思呢?
混淆
混淆就是将源代码中部分包名、类名、变量名,方法名替换成毫无意义的字母(混淆规则代码里定义要保留的类名和方法名,至于为什么要保留,如下图所示,除此之外的其它类名和方法名工具都会自动帮我们混淆),除此之外混淆还会隐藏掉部分类文件。这样一来反编译出来的代码阅读难度就大大增加了。AndroidStudio中已经集成了用于混淆的已经集成 ProGuard工具,我们只要编写好混淆规则代码后,打包后的release 包就已经是混淆过的包了。
ProGuard 是怎么做到混淆的?
1、压缩: 移除无效的类、属性、方法等
2、优化: 优化字节码,并删除未使用的结构
3、混淆: 将类名、属性名、方法名混淆为难以读懂的字母,比如a,b,c

加固(加壳)
将APK的外层加了一层壳,如果想反编译,必须突破这层壳的保护。加固后的APK,反编译出来,看到的只是外面那层壳的代码,这部分代码很少,而且跟源代码完全不一样,连原本的包名都没有了。加固涉及到的技术手段就很多了,同时也非常的深奥,例如dex 文件加密和字节码变形等。所以小公司如果没有特别的安全需求的话,一般都会选择第三方加固平台如360加固包来进行加固。
脱壳
就是上面加壳的一个逆向过程,脱壳之后就可以拿到加壳前的源代码了,这样就可以通过阅读源码在源码基础上做一些修改或其它操作,从而实现一些原有APP不能实现的功能。
反射
反射在逆向中算是很重要的基础了,得到类后很多变量、方法都是可以通过反射得到的,之前自己总结了一篇反射的博文,这里就不在啰嗦了,之前文章链接:Java反射
Xposed
- 基础(之前总结的):Xposed
- 需要root,除了接口和抽象方法,其它都可以hook。
- 原理:Xposed框架原理深入研究
Dexposed
- Dexposed是阿里巴巴新开源的一个非侵入式的AOP(面向切面编程)框架,与Xposed不同的是不需要root,仅可以hook自己的程序代码和应用程序中调用的 Android 框架中的函数(项目通过引包引入的Android框架函数,如import android.widget.Toast类中的函数),不可hook其它应用进程(包含系统应用进程如com.android.systemui.statusbar.policy.Clock系统时间进程)的一些方法。
-
Dexposed框架的AOP原理来自Xposed,不同的是,Xposed通过劫持 zygote(须root),而Dexposed通过劫持 java method,将java method改变为native,并且将这个方法的实现链接到一个通用的Native Dispatch方法上。(下图为原理,援引自Qcon大会手淘hotpatch技术介绍ppt),最大的用处自然是hot patch,用这种东西来热替换某个导致崩溃的方法。手淘还有做的一件事,就是用它作性能监控。
Dexposed原理.jpg
- 原理:Android中免Root实现Hook的Dexposed框架实现原理解析以及如何实现应用的热修复
- 仅支持在Dalvik(Android L(5.0)以前)虚拟机上无侵入地实现运行时方法拦截。然而,随着ART(Android 5.0后)取代Dalvik来运行Android时,Dexposed就不支持了,取而代之就出现了下面的epic来填补这个不足。
epic
- ART上的Dexposed(支持 Android 4.0~9.0)
- GitHub地址(里面有中文文档)
- 原理: ART深度探索开篇:从Method Hook谈起
我为Dexposed续一秒——论ART上运行时 Method AOP实现
VirtualApp
- VirtualApp
- 类似于虚拟机,在Android中开辟了一个虚拟空间来运行应用。
- 原理:VirtualApp沙盒基本原理
Android 双开沙箱 VirtualApp 源码分析(一)
VirtualXposed
- 结合上面epic和VirtualApp的免Root的Xposed
- VirtualXposed
- 原理:无需Root也能使用Xposed!