添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
风流的松树  ·  【Eclipse DDMS】 Can't ...·  1 月前    · 
儒雅的生菜  ·  从 Unified Access ...·  1 年前    · 
大气的木瓜  ·  javascript - ...·  2 年前    · 
玉树临风的口罩  ·  Pywinauto之Windows UI ...·  2 年前    · 
冷冷的电梯  ·  javascript - js ...·  2 年前    · 

当然此观念是在经过两节框架式知识铺垫的前提下,想了解andorid逆向,没有提前做功课可不行。接下来这篇文章呢,大家就当科普内容,先了解下andnroid系统的运行机制、框架及andorid应用程序的相关知识。

android系统架构

Dalvik虚拟机与ART虚拟机

android应用程序架构

android应用编译流程

android应用反编译流程及工具利用

android逆向概述

android系统架构

android系统

安卓(Android)是一种 基于Linux内核 (不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑, 由美国Google公司和开放手机联盟领导及开发

android系统架构

左边的就是android系统框架了,右边我加了备注,这样更加明了,我们可以看到,android系统架构共 分四层 从下往上 分别是: Linux内核层 系统运行库层 (程序库+android运行库)、 应用程序框架层 应用层

大家重点关注下Android Runtime这一部分,其他的简单了解下就可以涉及到后面的讲解

Llnux内核层: Android系统是基于Linux内核的,它提供了基本的系统功能及与硬件交互的驱动,像图中Display Driver(显示驱动)、Camera Driver(摄像头驱动)、WiFi Driver(WiFi驱动)等, 简单了解下就可以

系统运行库层: 像图中内核的上一层就是系统运行库层,它由 程序库(绿色部分) Android运行库(黄色部分) 组成。

application Framework(应用程序框架层): 这一层呢主要是提供一些组件,搭建框架,方便app开发人用再次基础上快速开发开发应用程序。而实际上就是一些AndroidAPI, 简单了解下就可以

Applications(应用层): 顶层中有所有的 Android 应用程序,如手机中的:电话、文件管理、信息等。

Dalvik虚拟机与ART虚拟机

Dalvik虚拟机

Dalvik是google专门为Android操作系统设计的一个虚拟机, 简称DVM 在Android 4.4及以前的版本, 所有的Android程序都是在Dalvik虚拟机环境下去运行的。DVM的指令是 基于寄存器 的,运行的是经过转换的 .dex文件 (.dex是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统),Dalvik虚拟机每次应用运行的时候,将代码编译成机器语言执行。

而DVM与JVM的区别:

JVM运行的是Java字节码,DM运行的是 Dalvik字节码。
传统java程序经过编译,生成java字节码保存在class文件中,java虚拟机通过解码class文件来运行程序,而 Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码都由java字节码转换而来,并打包到一个dex可执行文件(.dex),Dalvik虚拟机通过解释DEX文件来执行字节码。

DVM是基于寄存器的虚拟机  而JVM执行是基于虚拟栈的虚拟机。
寄存器存取速度比栈快的多,dvm可以根据硬件实现最大的优化,比较适合移动设备。
以下是同段代码经反编译形成的java字节码与Dalvik字节码对比


java字节码

Dalvik字节码

dvm执行的是.dex格式文件,jvm执行的是.class文件
.dex文件,是DVM独有的执行文件格式,体积更小,速度跟快,占用空间更少

运行环境的区别
Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

ART虚拟机

前面说到,当我们使用手机每运行一个程序,Dalvik虚拟机都会产生一个实例,互不影响,这就可能会出现占用资源过多等问题,随着人们日益增长的需求,dalvik无法满足人们对软件运行效率的需要。这是就诞生了ART虚拟机。

Android4.4及以上版本 ,应运而生的ART(Android Run Time)虚拟机替代了Dalvik虚拟机,其处理机制根本上的区别是它采用AOT(Ahead of TIme)技术, 会在应用程序安装时就转换成机器语言,不再在执行时解释 ,从而优化了应用运行的速度。在内存管理方面,ART也有比较大的改进,对内存分配和回收都做了算法优化,降低了内存碎片化程度,回收时间也得以缩短。

DVM与ART的区别: 虽说ART替换了Dalvik虚拟机,并不意味着,其应用程序开发上也要发生改变,像android应用程序安装包(apk)中,仍然还是可执行的.dex文件。

执行方式:运行效率提高
DVM是在每当程序运行时,通过解释器来执行Davlik字节码,进而转化成快速运行的机器码;而ART是在程序安装时将字节码预先编译成机器码,这样运行程序就不用再次编译

预装时间:增加
ART安装程序的时间会长一些,但是每次运行程序会快一点;dvm相反

占用存储空间:增加
art由于预编译,所以所占的存储空间会大一些

支持64位 CPU
DVM是为32位CPU设计的,而ART是支持64位并且兼容32位CPU

Android应用程序架构

安卓应用程序使用JAVA语言编写。安卓的SDK工具负责将你编写的代码,用到的数据和资源文件编译进APK文件中,APK:android package(应用程序安装包)。apk文件包含了一个安卓应用程序的所有内容,并且被安卓设备用来安装应用程序。

而apk实际上就是一个标准的zip格式,修改后缀名,进行解压就可以看到内部结构

META-INF文件夹: 存放apk签名信息,用来保证apk包的完整性和系统的安全。
在IDE编译生成一个apk包时,会对里面所有的文件做一个校验计算,并把计算结果存放在META-INF文件夹内,apk在安装的时候,系统会按照同样的算法对apk包里面的文件做校验,如果结果与META-INF里面的值不一样,系统就不会安装这个apk,这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。

res文件夹: 存放资源文件,包括icon,xml文件

classes.dex文件: 传统 Class 文件是由一个 Java 源码文件生成的 .Class 文件,而 Android 是把所有 Class 文件进行合并优化,然后生成一个最终的 class.dex 文件。它包含 APK 的可执行代码,是分析 Android 软件时最常见的目标。由于dex文件很难看懂,可通过apktool反编译得到.smali文件,smali文件是对Dalvik虚拟机字节码的一种解释(也可以说是翻译),并非一种官方标准语言。通过对smali文件的解读可以获取源码的信息。

resources.arsc文件: 二进制资源文件,包括字符串等。

smali: smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。利用apktool或者Android Killer,反编classes.dex文件,就可以得到以smali为后缀的文件,这些smali文件就是Dalvik的寄存器语言。

Android应用编译流程

Android应用编译流程按图中的例子就是一个app应用的生成过程。在应用程序上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场。

下面给大家简单讲解下:

第一步:打包资源文件,生成R.java文件
通过利用aapt资源打包工具,将文件目录中的Resource文件(就是工程中res中的文件)、Assets文件、AndroidManifest.xml文件、Android基础类库(Android.jar文件)进行打包,生成R.java

第二步:aidl生成Java文件
AIDL是Android Interface Definition Language的简称, 是Android跨进程通讯的一种方式。检索工程里所有的aidl文件,并转换为对应的Java文件

第三步:编译Java文件,生成对应的.class文件
将R.java、aidl生成的Java文件、Java源文件通过JDK携带的Javac编译生成.class文件

第四步:把.class文件转化成Davik VM支持的.dex文件
通过dx工具将.class文件生成为classes.dex

第五步:打包生成未签名的.apk文件
利用apkbuilder工具,将resources.arsc、res目录、AndroidManifest.xml、assets目录、dex文件打包成未签名的apk

第六步:对未签名.apk文件进行签名
使用apksigner为安装包添加签名信息。

第七步:对签名后的.apk文件进行对齐处理
使用zipalign工具对签名包进行内存对齐操作, 即优化安装包的结构。

Android应用反编译流程及工具利用

而Android应用反编译流程就是上面所讲的app生成过程的逆过程。Android应用程序的反编译,算是我们入手Android逆向展开实践的第一步。

下面给大家简单讲解下流程:

首先可以看到最左边的目标unsigned apk,即未签名apk。整体可以看出有两条反编译路线。

反编译方式一: 图中上面这条路线是通过利用apktool这款工具,可直接对目标apk直接进行反编译,可以看到除apk本身的资源文件,还生成了smali文件,而smali文件里面包含的都是程序执行的核心代码。我们可以通过直接分析.smali文件中的smali代码,进而修改代码,改变其运行逻辑。

apktool工具下载地址:

https://bitbucket.org/iBotPeaches/apktool/downloads/

利用方式: cmd运行命令

反编译方式二: 图中下面这条路线是通过修改apk后缀名,对其解压后,将文件夹中的资源文件,通过利用AXMLPrinter2进行分析,进而反编译,而对于解压后的class.dex文件,利用Dex2jar反编译工具对其进行反编译得到jar文件。接着将生成的jar文件直接拖到JD-GUI文件中,可自动生成源码,我们可通过分析其源码,了解其程序的运行逻辑,但我们修改逻辑,最终还是需要在smali文件中进行修改。

dex2jar下载地址: https://sourceforge.net/projects/dex2jar/files/

利用方式: cmd运行命令

以上就是传统的Android反编译流程,若想具体了解过程,可通过上述流程进行自我复现。

而在Android逆向的实际应用中,个人比较推荐 Android killer jadx-gui 这两款工具

Android killer: 是集 Apk反编译 Apk打包 Apk签名 编码互转 ADB通信 (应用安装-卸载-运行-设备文件管理)、 源码查看 等特色功能于一身,支持logcat日志输出,语法高亮,基于关键字(支持单行代码或多行代码段)项目内搜索,可自定义外部工具;吸收融汇多种工具功能与特点,是一款可视化的安卓应用逆向工具。
可以说在Android逆向,这款工具可实现上述反编译流程一把梭,这大大节省了操作时间,也提高了我们的效率。

ok,基本的知识框架体系已经啰嗦完了,现在开始我们的重点——Android逆向。

什么是Android逆向呢?

官方话语: Android逆向是对已经打包好的APP进行反编译、源码分析了解APP实现逻辑的一门技术。

通俗理解呢: 就是玩具( app )经过零件组装 (源码编译) 、加工刷漆 (打包、签名) 生成成品的逆过程。我们把成品的app,再将它打回零件形态——源码,通过更改它的零件 (代码) ,再进行重组装 (重编译) ,使它可以飞天、遁地等等 (改变运行逻辑)

当然,这里的更改零件,指的可不是app的源码,而是经反编译后的 smali代码

而在实际应用中,我们逆向的话,需要用到解密、反编译、解压缩等技术,想要100%还原APK的源码几乎是不可能的,所以在实际进行逆向分析的时候,一般都是根据想实现的目的,分析出APK的部分源码和实现逻辑,然后对这一部分源码进行修改后与原始的APK打包在一起,这样就获得了一个实现自己特定目的的APP。

总结与思考

以上文章就介绍的到这里,读到这里可能你们都觉得本篇涉及逆向的知识点并不多,而我也说过,了解Android逆向,要先了解Android,之所以这样说呢,是因为Android逆向的学习,最终还是要归到Android本身,有了前面的了解,相信会对接下来Android逆向分析上有着很大帮助。

后面要讲的就是逆向分析的手段以及具体流程,实践与理论结合的边练边学了,大家可以自己针对Android应用程序的反编译流程操练一番,备好工具,下一篇开搞。

Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。

团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室。 团队公众号自创建以来,共发布原创文章400余篇,自研平台达到31个,目有18个平台已开源。此外积极参加各类线上、线下CTF比赛并取得了优异的成绩。如有对安全行业感兴趣的小伙伴可以踊跃加入或关注我们