首页
论坛
课程
招聘

[翻译]Android 应用逆向工具总结

2019-2-18 22:43 4901

[翻译]Android 应用逆向工具总结

2019-2-18 22:43
4901

图片描述
如今,智能手机已经成为我们日常生活中不可破缺的一部分,于此同时智能手机普及的同时也带来了安全和隐私方面的重大隐患。保护智能手机免受不同的安全威胁,已经成为一个非常重要的话题。智能手机长久以来一直是一个易受攻击的目标。由于受病毒感染、漏洞影响的应用程序不断的增加,必须采取例如代码签名、应用隔离等安全措施来保障智能手机的安全。

 

由Android公司开发并且目前由谷歌拥有的Android操作系统,不仅受到到智能手机用户和开发者的欢迎,在黑客之中也很受欢迎,因为它们也是黑客们的主要目标。

 

本文中,我们将会探讨使用并且免费获取的各种工具完成逆向工作

 

但是在我们将注意力转向逆向工程方向之前,让我们先理解一些基础概念,这些概念将会有助于我们后续的工作。

 

首先,Android架构主要由以下四层组成:

  • 内核层:支持多进程和多线程的Linux内核。每个应用程序都有自己的Linux ID,并在单独的进程中运行。具有相同的ID的两个应用程序可以在它们之间交换数据。

  • 系统运行层:主要包括一些开源类库以及Android运行时环境,其中Dalvik虚拟机中运行的应用程序格式为dex的二进制文件。

  • 应用框架层:具有Java接口的应用程序框架。该层由Android NDK和SDK组成。

  • 应用层:预安装一些核心应用程序

Andorid的安全模型主要是基于权限和沙箱的,在Android系统中运行的每个应用程序都在自己的Dalvik虚拟机中执行,并被分配了唯一的ID。这可以防止应用程序干扰其他应用程序的信息和数据。但是我们仍然需要了解单个应用程序如何工作,拥有什么权限,有哪些连接,进行哪些活动。逆向工程在其中起到了很重要的作用。

逆向工程

根据维基百科的说法:

Reverse engineering, also called Black engineering, is the process of extracting knowledge or design information from anything man made and reproducing it or reproducing anything based on the extracted information. The process often involves disassembling something (a mechanical device, electronic component, computer program, or biological, chemical, or organic matter) and analyzing its components and workings in detail

 

所以基本上逆向一个android应用程序主要是通过学习该应用的操作、结构和功能,来帮助我们发现和理解程序如何工作的。Android应用程序的逆向工作将帮助我们:

  • 阅读代码。
  • 理解代码。
  • 找到代码级别的漏洞。
  • 找到可能被硬编码到应用程序代码中的敏感数据。
  • 在更换到新硬件期间迁移应用程序。
  • 实现恶意软件分析。
  • 修改现有应用程序的现有代码/功能。

逆向工程涉及两个过程:反汇编和反编译。

 

反汇编是将机器语言翻译成汇编语言的过程。所以,反汇编器最后输出的是人类可以识别的汇编代码,重点是照顾汇编代码的可读性,这部分内容不可避免的与,汇编器识别的代码还是有所区别的。一般来说,反编译是编译的反过程。通过反编译,我们可以将可执行文件转换为可读性更高的源代码的形式,即更高级别的语言。在一定程度上来讲,完全自动化的反编译是不可能的。这是因为在编译过程中会丢失部分源代码中的信息,以及对源代码进行了适当的优化。所以没有反编译器可以获得开发人员编写的确切源代码。

各类逆向工具

以下是一部分逆向工具(Android平台的)
图片描述

 

我们将会介绍一些大家在日常工作中都会用到的一些工具,比方说apktool, Dex2jar, JD-Gui等。

APK文件格式

APK,是Android Application Package(Android应用包)的首字母,你可以利用这种格式的文件打包你开发的应用程序。这也是你可以从谷歌商店或者其他渠道获取到的应用格式。换句话说,对于你设备上的每个应用程序,都有一个相应的APK文件(对于预安装的应用程序也是如此)。一个APK文件本质上是一个ZIP文件,所以你可以将其重命名zip文件,然后解压,可以看到其中的内容。

Entry Notes
AndroidManifest.xml 二进制xml文件,提供设备运行应用程序所需的各种信息
classes.dex 以dex格式编译的应用程序代码
resources.arsc 包含预编译应用程序资源的二进制XML文件
res/ 此文件夹中包含未编译到resources.arsc文件中的资源
assets/ 此文件夹包含应用程序的原始资产,由AssetManager提供对这些资产文件的访问
META-INF/ 它包含MANIFEST.MF文件,该文件存储有关JAR内容的元数据。APK的签名也存储在此文件夹中。
lib/ 该文件夹包含已编译的代码,例如本地代码库

什么是DEX

DEX是Dalvik Executable的首字母缩写,是一种文件格式,包含为Android编写的编译代码,可以由Dalvik虚拟机或Android Runtime(ART)解释。

 

当Android构建系统生成APK文件时,Java类首先被编译为.class文件,之后一个名为dx的工具将这些class文件转化成dex格式。

编译过程

图片描述
正如我们在上图中所看到的,java代码(应用程序源代码)是使用java编译器编译的,以“.class”文件的形式进行输出。

 

应用程序代码的'.class'文件和其他'.class'文件在dx编译器的帮助下进行编译,最终形成'dex'格式的文件。

 

'dex'格式的文件,以及应用程序所需的各种资源和AndroidManifest.xml文件[定义应用程序的权限]被打包在一起并在aapt(Android Assest Packaging Tool)和apkbuilder的帮助下编译形成'APK”。

 

以上是android应用程序的打包过程,而使用下图可以更直观的理解android应用程序的逆向工程,也就是前面过程的逆过程:
图片描述

获取APK文件

在我们继续使用这些工具之前,第一步是获取APK文件,其中最好的方法是使用ADB(Android Debug Bridge从手机上获取它。

 

首先确定应用程序包的名称。

adb shell pm list packages

获取所需包的APK文件的完整路径名。

adb shell pm path com.example.someapp

将APK文件从Android设备拉到测试环境。

adb pull /data/app/com.example.someapp-2.apk path / to / desired / destination

获取到APK文件之后,就该我们的各种逆向工具上场了。

APKTOOL

这是一款用于逆向Android应用程序的第三方工具。

 

图片描述
它可以将资源解码成为近乎原始的形式,也可以在进行一些修改之后重建APP。由于项目如文件结构和一些重复性任务(如解码,构建apk)的自动化,它还使得逆向应用程序变得更加容易。

  • Apktool能够将应用程序拆分为接近原始形式,并在进行某些修改后重新打包。
  • 它可以用于调试smali代码。
  • 它可用于为客户平台修改/添加一些支持或功能,也可用于本地化。
  • 它提供了一些重复的任务的自动化,这些任务反过来通过使用户更容易地与应用程序交互来帮助用户。

下图显示了apktool所有可能的用法:

 

图片描述

Dex2Jar

Android应用程序的主要组件和Android应用程序的主程序逻辑在classes.dex文件中。 此文件不是用户可读的。Dex2jar用于将文件转换为可读类格式供用户查看。使用此工具,可以将应用程序的源代码视为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浏览重建的源代码,以便即时访问方法和字段。所以基本上可以把它理解成是图形化的Java .class反编译器。
图片描述
上图显示了JD-GUI如何显示示例中的jar文件。
通过上面的描述,逆向工程的一般过程如下:

  1. 重命名test.apk => test.zip
  2. 解压缩test.zip然后打开该文件夹
  3. 从test文件夹中复制classes.dex文件
  4. 到dex2jar提取的文件夹
  5. 运行命令d2j-dex2jar.bat classes.dex
  6. 使用JD-GUI打开classes-dex2jar.jar文件
  7. 现在,你现在继续分析逆向的数据了

如果您想要一些自动化方法并且不想完成上述所有步骤,那么您可以使用以下两个工具。

Apk Analyser

它是一个静态的虚拟应用程序分析工具。它可以用来分析Android应用程序的API引用,查看应用程序体系结构以及依赖项,并查看反汇编字节代码。 它提供了对APK组成的深入了解,同时也为你的应用程序架构和依赖项提供了一个漂亮的界面。

  • 查看APK中文件的绝对大小和相对大小(例如DEX和Android资源文件)。
  • 了解DEX文件的组成。
  • 快速查看APK中的文件的最终版本(例如AndroidManifest.xml)。
  • 对两个APK进行并排比较。

想要使用它,可以执行:

java -jar ApkAnalyser.jar

简单的使用流程:

  • 启动Apk分析器应用程序。
  • 设置所需的路径,如android sdk和apk文件位置。
  • 选择File - > Analyze开始分析应用程序。这需要一定的时间来分析apk文件。

Byte Code Viewer

Byte Code Viewer的开发人员Konloch认为Bytecode Viewer是一个高级轻量级Java字节码查看器,集合图形化的 Java 反编译器,图形化的字节码编辑器,GUI Smali,GUI Baksmali,GUI APK编辑器,GUI Dex编辑器,GUI APK反编译器,GUI DEX反编译器,GUI Procyon Java Decompiler,GUI Krakatau,GUI CFR Java Decompiler,GUI FernFlower Java Decompiler,GUI DEX2Jar,GUI Jar2DEX,GUI Jar-Jar,Hex Viewer,Code Searcher,Debugger等功能为一身。
图片描述

总结

本文设计了几乎所有的测试人员以及取证分析师通常使用的Android应用程序逆向工具。在逆向过程中基本的原则是获取以及阅读代码,了解程序的活动以及交互情况。我们了解了如何将apk文件一步一步的变成java代码的过程(apk - > dex -> jar ->code)。所以通过以上的所有方法,最终可以获取到应用的可读代码。现在我们可以根据我们的目的简单的分析应用程序的功能或者判断其是否是恶意程序,或者修改其中的某些内容。

原文链接:https://www.peerlyst.com/posts/reverse-engineering-tools-for-android-application-sudhendu?trk=profile_page_overview_panel_posts
翻译:看雪翻译组-skeep



[求职]想求职找工作,请来看雪招聘投递简历!

最后于 2019-2-18 22:44 被skeep编辑 ,原因:
最新回复 (0)
游客
登录 | 注册 方可回帖
返回