Android应用逆向工具分享
在当今这个这代,智能手机已经人手一部,成为每个人生活中不可或缺的一部分,这也同时引起了极大的安全和隐私问题。保护智能手机,避免遭受各种各样的安全威胁已经成为一个主要问题。智能手机长期以来就是一个容易被攻击的目标。而且现在受感染的应用程序越来越多,我们必须要采取一些安全措施了,比如代码签名,APP隔离等。
龙泉之声
Android操作系统,之前是由Android Inc公司开发的,现在归谷歌所有,Android操作系统不仅受到了智能手机用户和开发者的青睐,而且黑客也对它情有独钟,因为Android系统依然是主要的攻击目标。
在这篇文章中,我们将讨论不同的用来执行Android逆向工程的工具,并且这些工具在网上都是免费可用的。
我的世界观
不过在开始讲解逆向工程之前,我们先来了解一些基本概念,这样有助于我们完成任务。
Android架构由以下四层组成:
·
陈云故居
Linux内核层,支持多进程和多线程。每个应用程序都有自己的Linux ID,并在单独的进程中运行。具有相同ID的两个应用程序可以彼此交换数据。
·篮球赛规则开源库和Android运行时环境,应用程序以dex二进制格式在Dalvik虚拟机中运行。
·具有java接口的应用程序框架。这一层包括AndroidNDK和SDK。
·预装的核心应用程序。
这个Android安全模型是基于权限和沙箱机制的。每个应用程序都在自己的dalvik虚拟机中运行,并且具有分配的唯一ID。这可以防止应用程序去破坏另一个应用程序的信息和数据。但我们还是要搞明白每个应用程序是以什么权限运行的,涉及到了哪些连接和activity。这时候我们就需要进行逆向工程了。
逆向工程
Wikipedia解释:
逆向工程也叫黑色工程,是从人工制作的任何东西中提取知识和设计信息的过程,并根据
所提取的信息来重新制作或者是制作成任何其他东西。这个过程通常会拆卸某些东西(比如机械设备,电子元件,计算机程序,或者是生活化学有机物质等),然后详细分析其组件和工作原理。
所以,对一个应用程序进行逆向分析,通过学习它的操作,结构和功能可以帮助我们发现和理解应用程序完整的工作过程。Android逆向分析在以下几个方面对我们会有所帮助:
·阅读代码
·理解代码刘立早
·在代码层发现漏洞
·找到在应用程序中可能使用硬编码的敏感数据
·在变更到新的硬件平台时迁移应用程序
·进行恶意软件分析
·修改现有应用程序的代码和功能
逆向工程包括两个过程:反汇编和反编译
·反汇编
反汇编是将机器语言翻译成汇编语言的过程。反汇编器的输出结果通常是人们适合阅读的格式,而不是注重于汇编器输入的适用性。
·反编译
从字面意思来看,反编译就是与编译相反的过程。我们可以将可执行文件翻译成更加易于阅读的格式,比如高级语言。完全实现自动化反编译是不太可能的,因为没有反编译器能够提取到开发者编写的源代码。
武器库
有很多逆向工程的工具,如下图所示:
我们会讲一些常用的工具,几乎所有渗透测试员都会使用到的工具,比如apktool,Dex2jar,JD-Gui等。
APK格式
APK,也就是Android应用程序包,包是用来打包所有你开发的或者是从google应用商店下载的或者是通过其他渠道获得的应用程序的一种格式。换句话说,对于你手机上的每一个应用程序,都会有一个对应的apk文件(对于预装应用程序也是如此)。
apk文件其实是一个zip压缩包文件,你可以找一个apk文件,重命名,然后解压缩来访问里面的内容:
DEX文件
宝宝大便发白
DEX是Dalvik Executable的缩写,这是一种文件格式,包含了编写Android的编译代码,能够被dalvik虚拟机解释执行,也能被Android运行时(ART)解释执行。
当Android构建系统生成一个apk文件时,java类文件首先被编译为.class文件,然后Android SDK中的dx(dexer)工具将.class文件处理成DEX格式文件,这个DEX格式文件包含了dalvik字节码文件。
Dex文件格式:
1.文件头
2.字符串表
3.类列表
4.字段表
5.方法表
6.类定义表
7.字段列表
8.方法列表
9.代码头
10.本地变量列表
Dex文件包含了所有DVM类的字节码。DVM不使用java字节码,而是使用自己的dalvik字节码。这是因为Dalvik虚拟机是基于寄存器的,而java虚拟机是基于堆栈的。
更多详细信息,你可以参考这篇文章:Android开源项目
构建过程
·在上面的流程图中,我们可以看到,java代码(也就是应用程序源代码)在java编译器中进行编译,输出结果是.class文件。
·应用程序代码的.class文件和其他.class文件借助于dx编译器编译为dex格式文件
·dex文件和应用程序所需的资源文件还有l文件(定义应用程序权限)打包在一起,并且借助aapt(Android资源打包工具)和apkbuilder工具编译成apk文件。
上面这个流程就是一个Android应用程序的生成过程。明白了这个过程,那么理解Android逆向就不难了,逆向过程如下图:
获取APK
在我们使用逆向工具之前,我们第一步是要获取到一个apk文件。最好的方法是使用adb(Android调试桥)从手机上获取一个。
首先,明确APP的包名
adb shell pm list package
接着,获取所需包的apk文件的完整路径
大国工匠年度人物
adb shell pm ample.someapp
然后,从Android设备中将APK文件拉到测试环境中
adb pull /data/ample.someapp-2.apk path/to/desired/destination
APKTOOL
逆向分析二进制AndroidAPP的第三方工具,使用如图所示:
它可以将资源解码为非常接近于原始形式,而且能够在进行一些修改之后重新打包发布。
由于文件结构项目和一些重复任务(解码,构建apk等)的自动化,这个工具使得对应用程序的分析变得更加容易。apk工具的几点优势如下:
·apktool能够将应用程序反汇编成接近原始的形式并且在进行一些修改之后可以重新打包
·可以用来调试smali代码
·可以用来为客户平台修改或添加一些支持和功能,也可用于本地化
·提供某些重复任务的自动化操作,可以帮助用户更加容易的与应用程序交互
下图显示了apktool工具的所有用法:
Dex2Jar
Android应用程序的主要组件和APP的主程序逻辑都在class.dex文件中。这些文件用户是无法读取的。而这个Dex2Jar工具可以用来将dex文件转化为可读的class文件格式,以便用户查看。有了这个工具,就能像阅读java代码一样阅读应用程序的源码了。
工具用法:转化.dex文件为.class文件(jar格式)
sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
输出的文件是apk_to_decompile-dex2jar.jar。
JD-GUI
JD-GUi是一个独立的图形工具,可以显示.class文件的java源代码。你可以使用JD-GUI来浏览重构的源代码以访问某些方法和字段。所以,它其实是一个GUI版的java .class反编译器,如图所示:
图片显示了一个jar文件在JD-GUI中的视图。
使用这个工具进行逆向分析的方法如下:
1.重命名test.apk为test.zip
2.解压test.zip然后打开文件夹
3.从test目录复制class.dex文件
4.粘贴到dex2jar文件夹中
5.运行命令:d2j-dex2jar.bat class.dex金牛座男生的性格特点
6.将class-dex2jar.jar文件移动到JD-GUI中
7.现在你可以分析逆向工程数据了
如果你想要一些自动化的方法,不想一步一步的来,那么你可以使用下面这两个工具。
Apk Analyr
这是一个静态的虚拟应用程序分析工具。可以使用它来分析API引用,查看应用程序结构和依赖,以及在Android应用程序中反汇编字节码。它可以深入分析你的APK的组成,还为你的应用程序结构和依赖提供了一个非常美观的UI界面,其他优点如下: