Android 逆向分析从入门到精通

熟知应用层开发的我们都知道,在应用上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场。

一、Android 逆向学习背景

了解Java Android开发。

了解NDK ,C 语言 Android 动态链接库.SO开发。

了解Android反编译Smali 语法。

了解adb 和 jdb 等等工具使用。、

了解IDA 调试(远程动态调试APK和本地静态调试.SO文件)

了解文件格式类似PE格式,例如:ELF,和Android文件格式等等。

了解APK的打包解包流程。

了解熟练使用Fiddler和Charles抓包工具进行抓包;

了解其他工具使用(改之理,Apk killer,Android模拟器)等。

二、Android 逆向工具

1. ApkTool

Android逆向分析领域历史最久远的工具之一,提供了Android Apk反编译和回编译的功能。虽然越来越多的工具提供了GUI进行反编译,但是以命令行的方式操作的ApkTool使用起来更加简单、便捷,仍然是很多人分析的最佳选择。

目前ApkTool的版本2.4.1版本(推荐使用最新的版本使用,避免旧版本中的一些问题),下载地址为:https://ibotpeaches.github.io/Apktool/。

ApkTool使用方式:

  • 反编译Apk: apktool d <file.apk>
  • 编译文件为Apk:apktool b

2. GDA

GDA是一款完全基于C++开发的新型反编译工具,因此该工具并不仅依赖于Java平台。该工具使用起来非常方便,而且运行速度非常快,支持APK、DEX、OBED和oat等文件格式。

3. Dex2jar/JD-GUI

使用最多的将DEX文件转换为jar包的工具。对使用Dex2jar转换的包,可以通过JD-GUI等工具查看反编译后的Java代码。

三、Android 逆向学习整理

Android 逆向分析(一):使用改之理实现逆向HelloWorld 

...

四、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://service.security.tencent.com/kingkong 免费 无限制
腾讯御安全 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
Android安全测试框架Drozer(使用篇):https://www.jianshu.com/p/8f9d7dc5a8bb
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章