在当今这个这代,智能手机已经人手一部,成为每个人生活中不可或缺的一部分,这也同时引起了极大的安全和隐私问题。保护智能手机,避免遭受各种各样的安全威胁已经成为一个主要问题。智能手机长期以来就是一个容易被攻击的目标。而且现在受感染的应用程序越来越多,我们必须要采取一些安全措施了,比如代码签名,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文件和应用程序所需的资源文件还有AndroidManifest.xml文件(定义应用程序权限)打包在一起,并且借助aapt(Android资源打包工具)和apkbuilder工具编译成apk文件。
上面这个流程就是一个Android应用程序的生成过程。明白了这个过程,那么理解Android逆向就不难了,逆向过程如下图:
获取APK
在我们使用逆向工具之前,我们第一步是要获取到一个apk文件。最好的方法是使用adb(Android调试桥)从手机上获取一个。
首先,明确APP的包名
adb shell pm list package
接着,获取所需包的apk文件的完整路径
adb shell pm path com.example.someapp
然后,从Android设备中将APK文件拉到测试环境中
adb pull /data/app/com.example.someapp-2.apk path/to/desired/destination
APKTOOL
逆向分析二进制AndroidAPP的第三方工具,使用如图所示:
它可以将资源解码为非常接近于原始形式,而且能够在进行一些修改之后重新打包发布。
由于文件结构项目和一些重复任务(解码,构建apk等)的自动化,这个工具使得对应用程序的分析变得更加容易。apk工具的几点优势如下:
· apktool能够将应用程序反汇编成接近原始的形式并且在进行一些修改之后可以重新打包
· 可以用来调试smali代码
· 可以用来为客户平台修改或添加一些支持和功能,也可用于本地化
· 提供某些重复任务的自动化操作,可以帮助用户更加容易的与应用程序交互
下图显示了apktool工具的所有用法:
Dex2Jar
Android应用程序的主要组件和APP的主程序逻辑都在classes.dex文件中。这些文件用户是无法读取的。而这个Dex2Jar工具可以用来将dex文件转化为可读的classes文件格式,以便用户查看。有了这个工具,就能像阅读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目录复制classes.dex文件
4.粘贴到dex2jar文件夹中
5.运行命令:d2j-dex2jar.bat classes.dex
6.将classes-dex2jar.jar文件移动到JD-GUI中
7.现在你可以分析逆向工程数据了
如果你想要一些自动化的方法,不想一步一步的来,那么你可以使用下面这两个工具。
Apk Analyser
这是一个静态的虚拟应用程序分析工具。可以使用它来分析API引用,查看应用程序结构和依赖,以及在Android应用程序中反汇编字节码。它可以深入分析你的APK的组成,还为你的应用程序结构和依赖提供了一个非常美观的UI界面,其他优点如下:
· 查看APK文件的绝对大小和相对大小(如DEX和Android资源文件)
· 了解DEX文件的组成
· 快速查看APK中的最终文件版本(如AndroidManifest.xml文件)
· 对两个APK文件进行并行比较
使用以下命令来启动:
java -jar ApkAnalyser.jar
然后进行使用:
启动APK analyser应用。
设置需要的路径,如Android SDK和apk文件路径。
选择File->Analyse来开始分析应用程序。
Byte Code Viewer
基于java的源码通常被编译为java字节码—Java虚拟机指令集。编译后的字节码可以通过免费开源的反编译器轻松的反编译为源代码。
开发人员Konloch说,Bytecode Viewer是一款高级的轻量级的java字节码查看器,GUI java反编译器,GUI Bytecode编辑器,GUI smali,GUI Baksmali,GUI APK编辑器,GUI Dex编辑器,GUI APK反编译器,GUI DEX反编译器,GUI Procyon java反编译器,GUI Krakatau,GUI CFR java反编译器,GUI FernFlower java反编译器,GUI DEX2jar,GUI Jar2DEX,GUI Jar-Jar,十六进制查看器,Code searcher和Debugger等。
但是,如果代码做了很多混淆,那么就很难进行逆向从而得到正确的代码了。所以可以说,代码混淆是一种确保Android应用安全的非常不错的方法。等以后有时间我再来跟大家讲讲如何确保APP的安全。
总结
本文讲解了一些渗透测试员经常使用来对Android应用进行逆向分析的工具。基本的思想就是获取并阅读代码,了解APP的activities和互动。我们知道了如何逆向APP来获取源码,过程就是apk->dex->jar->code。
小结一下,基于你的需求,有三种方法你可以用来对Android应用进行逆向分析。
· 反汇编
在apk中,dex文件包含了Dalvik字节码格式的数据。这种格式人们是无法阅读的。最常见的可读格式的Dalvik字节码是smali。将.dex文件转化为smali代码(这个过程叫baksmali),它会返回smali语言的可读的代码。
我们可以使用apktool或者是baksmali来转化dex文件
smali和baksmali的意思分别对应的是芬兰语中的汇编器和反汇编器。
· 反编译
我们在前面已经看到了如何使用dex2jar和JD-GUI来进行反编译。这是逆向代码的最常见的形式,可以进行深度逆向分析并且重构APP。
流程如图:
· 反编译(Dalvik反编译器)
将Dex转化为JAR会丢失反编译器可能用到的重要元数据。使用上面的方法我们可以阅读源码,但是真正修改和重新打包就不太可行了。不过,如果使用可以直接将dex反编译为java的纯Dalvik反编译器,则可以避免这种情况。
Androguard的DAD就是一个非常好的工具,对于dex和Odex真的大有帮助。
最后,使用上面的方法,我们可以获取应用的可读代码。现在我们可以根据自己的目的来简单分析它的功能或者恶意软件或者是修改所有东西。
本文翻译自:https://www.peerlyst.com/posts/reverse-engineering-tools-for-android-application-sudhendu
翻译作者:SoftNight 原文地址: http://www.4hou.com/mobile/15600.html