本文涉及的工具收集整理到Github上了:https://github.com/renhui/Thinking-Android-Safe
一、Android 逆向工具
1. ApkTool
Android逆向分析领域历史最久远的工具之一,提供了Android Apk反编译和回编译的功能,让Apk的重新打包成为可能。虽然越来越多的工具提供了GUI进行反编译,但是以命令行的方式操作的ApkTool使用起来更加简单、便捷,仍然是很多人分析的最佳选择。
目前ApkTool的版本2.4.1版本(推荐使用最新的版本使用,避免旧版本中的一些问题),下载地址为:https://ibotpeaches.github.io/Apktool/。
2. GDA
GDA是一款完全基于C++开发的新型反编译工具,因此该工具并不仅依赖于Java平台。该工具使用起来非常方便,而且运行速度非常快,支持APK、DEX、OBED和oat等文件格式。
3. Dex2jar/JD-GUI
使用最多的将DEX文件转换为jar包的工具。对使用Dex2jar转换的包,可以通过JD-GUI等工具查看反编译后的Java代码。
二、Android 安全评估工具
1. Drozer 安全评估工具
安装文件地址:
python-2.7.14:https://pan.baidu.com/s/1PWWks_KiI6sbK5EZrpDbDw,提取码:h4ui
drozer-agent:https://pan.baidu.com/s/1E3M90v_9Hdn4aHMOsenU2g,提取码:7miw
drozer-2.4.4:https://pan.baidu.com/s/1IdsPKEqzzdFxOGRjL3RH1Q,提取码:g6ks
2. QARK 分析工具
QARK是一款易于使用的工具,能够找到Android应用程序中的常见安全漏洞。与商业产品不同,它可以100%免费使用。QARK提供教育信息,允许安全审查人员找到对漏洞的精确和深入的解释。在反编译APK时,QARK可以自动使用多个反编译器,利用它们的组合输出来产生出色的结果。最后,QARK与传统工具相比的主要优势仅仅是指出可能存在的漏洞,它可以产生ADB命令甚至功能齐全的APK,将假设的漏洞转化为“POC”漏洞利用。
包含在此工具尝试查找的安全漏洞类型中的有:
- 无意中导出的组件、未妥善保护的导出组件
- 易受拦截或窃听的intent、粘滞的intent的使用、发送不安全的广播Intent
- 不正确的x.509证书验证
- 创建事件可读或事件可写的文件、导出SharePreference
- 可能泄漏数据的Activity
- 不安全地创建了Pending Intents
- 嵌入在源中的私钥、弱密码学使用不当或不适用
- 潜在可利用的WebView配置
- 启用备份的应用程序、可调试的应用程序
- 支持过时API版本的应用程序,具有已知的漏洞
安装文件地址:
0.9-alpha.1:https://github.com/linkedin/qark/releases/tag/v0.9-alpha.1
三、Android 加壳方式
使用软件壳为目标APK加壳,一般使用的方式为:Dex混淆、Dex加密与Application替换、so加密等。
1. Dex混淆
Dex混淆常见于Dex混淆器,例如DexGuard与DexProtect。识别这类加壳程序的方法是对比和分析它们所生成的Dex文件与常规Dex文件。为了达到字符串加密与方法流程混淆的效果,混淆器通常会使用Java的反射机制来实现加密,并向代码中插入getClass().getDeclaredMethod().invoke()之类的方法调用。配合它们独有的Dex字节码特征,相对容易识别。
2. Dex加密与Application替换
软件壳在处理Apk的时候,会用StubApplication类替换程序的Application类,达到接管Apk启动控制权的目的。不同的厂商的加壳程序向Apk添加的StubApplication类在名称与包名上有所不同,这是识别各个厂商软件壳最简单、有效的方法。
3.So加密
so加密一般会对Apk处理后,在assets目录下添加相应的文件。
4. 如何识别软件壳
可以使用APKID进行APK文件特征的识别,APKID是一款开源工具(https://github.com/rednaga/APKiD)。它使用Python脚本配合yara规则,实现了APK编译器识别规则与常见的软件壳特征识别规则,支持快速识别APK的软件壳信息,准确率高且易扩展。
四、Android 软件壳的发展
1. 动态加载型壳(第一代壳)
动态加载壳属于第一代壳,它的发展时期是从4.4向5.0迈进的时期,这个时期也是从Dalviik虚拟机向ART虚拟机转型的时期。这个时期的软件壳,早期版本主要针对Dalvik虚拟机的实现,其特点是:对本地APK中的数据进行加密,在运行时在内存中解密。
因为“加载即解密”的特点,使得脱壳有很多种方式,常见的脱壳方法如下:
- 缓存脱壳法:因为动态加载型壳使用DexClassLoader将加密后的Dex文件在内存中解密后进行动态加载,但部分软件壳并没有对加载的Dex缓存路径进行处理,导致优化的结果默认放置到了/data/dalvik-cache目录。只需要将/data/dalvik-cache下的OBEX文件去吃,在进行一次deodex操作,即可完成脱壳工作。
- 内存Dump脱壳法:基于这代壳在内存中完全解密的特点,可以从内存中Dump需要解密的APK的内存,从而完成脱壳操作。
- 动态调试脱壳法:本质还是基于内存Dump脱壳法,需要通过调试器找到合适的Dump时机,即DEX文件已经在内存中完全解密,且代码还没有开始执行。寻找合适的Dump时机是动态调试脱壳法的重点。
- Hook脱壳法:与动态调试脱壳法一样,都需要分析人员找到合适的脱壳实际。不同点在于:动态调试脱壳法需手动操作调试器来完成脱壳,Hook脱壳法需要使用Hook框架,配合Hook代码,实现工具的自动化脱壳。
- 系统定制脱壳法:与Hook脱壳法类似,系统定制脱壳法针对第一代壳在dvmDexFileOpenPartial()或dexFileParse()方法处设置断点来脱壳的特点,修改它们的源码中的实现,然后编译修改后的代码,以刷机的方式实现脱壳。刷机后,APK加载时会自动将Dex保存到我们修改后的指定的目录下,这样我们就能轻易找到脱壳后的DEX文件。
2. 代码抽取型壳(第二代壳)
代码抽取型壳属于第二代壳,特点是即使DEX加载到内存中,也处于加密的状态,所有的DEX方法都是在运行时解密的。针对这代的代码抽取型壳,脱壳的方法就没有第一代的脱壳方法多了,且难度变大了不少。
针对代码抽取型的脱壳方式有以下几种:
- 内存重组脱壳法:通过解析内存中的DEX文件格式,将其重新组合成DEX文件,可以实现百分百的DEX代码还原。
- Hook脱壳法:也是基于DEX在内存中完全解密进行的。
- 系统定制脱壳法:对Dalvik的方法实现代码进行修改通过调用dvmDefineClass()方法手动加载所有的类。
3. 代码混淆壳(第三代壳)
这里先说明一下软件的混淆技术。软件的混淆分为代码混淆和数据混淆,而从软件的编译与链接的生成过程来看,软件混淆是可以分为事前的代码混淆,事中的编译期混淆、事后的二进制混淆。
代码混淆指的就是源码混淆,好处是经过这种混淆处理后的代码,分析起来是有一定难度的。不过,从软件混淆技术的层面看,尽管能有效防止反编译后的逆向分析,但是对自身的调试和维护也来了麻烦,当代码出现Bug的时候,定位问题也变得更难。
代码混淆分为Java级别的代码混淆(第一代壳)和原生程序的代码混淆(第三代壳)。这里的代码混淆壳指的是: 原生程序的代码混淆。目前代码混淆壳是当前级别最高的软件加密技术,这里推荐LLVM编译套件,这是一个很优秀的开源跨平台的编译套件(感兴趣的可以了解AST混淆技术)。
代码混淆壳在编译时改写了代码了代码生成的指令,因此在分析与破解这类二进制程序时,谈不上脱壳,更像是对原始指令的还原,或者说是对代码混淆的还原。
五、Android 逆向安全拓展内容
1. Android APP安全在线检测平台
腾讯御安全 http://yaq.qq.com/ 免费 查看漏洞详情需认证
阿里聚安全 http://jaq.alibaba.com/ 免费 查看漏洞详情需认证
360显微镜 http://appscan.360.cn/ 免费 无限制
360APP漏洞扫描 http://dev.360.cn/html/vulscan/scanning.html 免费 无限制
百度MTC http://mtc.baidu.com 9.9元/次 无限制
梆梆 https://dev.bangcle.com 免费 无限制
爱内测 http://www.ineice.com/ 免费 无限制
通付盾 http://www.appfortify.cn/ 免费 无限制
NAGA http://www.nagain.com/appscan/ 免费 无限制
GES审计系统 http://01hackcode.com/ 免费 无限制
盘古出品的Janeushttp://appscan.io
Janus http://cloud.appscan.io
APP逆向main_classify_list https://android.fallible.co/
java在线反编译Java decompiler online http://www.javadecompilers.com
腾讯电脑管家:哈勃 http://habo.qq.com/
腾讯TSRC:金刚 http://service.security.tencent.com/
阿里聚安全:http://jaq.alibaba.com/
西安交通大学 sanddroid:http://sanddroid.xjtu.edu.cn/#home
金山火眼:http://fireeye.ijinshan.com/analyse.html
瀚海源文件B超:https://b-chao.com
2. 推荐博客内容
安卓渗透测试工具——Drozer(安装和使用):https://www.cnblogs.com/zhaoyixiang/p/11236458.html
Android安全测试框架Drozer(安装篇):https://www.jianshu.com/p/4ef5b26dd3fb
QARK工具的介绍和原理分析:https://zhuanlan.zhihu.com/p/35411248
GDA:一款基于C++的新型Android逆向分析工具:https://www.freebuf.com/sectool/226185.html
ApkTool: Apktool 使用教程:https://www.jianshu.com/p/6ba8b826c138
Android中的Apk的加固(加壳)原理解析和实现:https://blog.csdn.net/sally_liang/article/details/52946790
Android安全知识笔记合集:https://juejin.im/post/5deb7478518825126204f4d7
Android安全客户端安全要点:https://zhuanlan.zhihu.com/p/35100057
Android应用防止so注入防止动态调试参考代码:http://www.iiii.name/androidsobug.html
安卓Activity劫持与反劫持:https://www.freebuf.com/company-information/222548.html
Android 安全之 Activity 劫持防护:https://www.jianshu.com/p/d4677e837648