一 安卓逆向:基础入门

前言
随着app的广泛应用 , 使用过程中 , 难免会遇到些很不友好的功能 , 比如:游戏充值、间断性弹窗广告、续费解锁下一回等等 。

一  安卓逆向:基础入门

文章插图

一  安卓逆向:基础入门

文章插图

一  安卓逆向:基础入门

文章插图
而随之会产生如何将这些功能取消掉 , 而逆向就可以做到 , 纵向丝滑 。
一  安卓逆向:基础入门

文章插图
当然这只是安卓逆向的非专业性作用之一 , 安卓逆向的作用不仅限于此 , 之所以以此引入 , 是因为激发学习最大的动力——兴趣 , 有了兴趣 , 你们想不学都不行 。
网上教程上都这样讲 , 学习安卓逆向 , 不可避免的需要掌握一定的java基础、等等这就话虽说没错 , 但对于零基础的小白 , 难道要先学这些编程语言再去入手逆向吗?
我的想法是 , 采用理论实践相结合 , 边练边学 , 这样印象才更加深入人心啊 。
一  安卓逆向:基础入门

文章插图
当然此观念是在经过两节框架式知识铺垫的前提下 , 想了解逆向 , 没有提前做功课可不行 。接下来这篇文章呢 , 大家就当科普内容 , 先了解下系统的运行机制、框架及应用程序的相关知识 。
系统架构 系统
安卓()是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统 。主要使用于移动设备 , 如智能手机和平板电脑 , 由美国公司和开放手机联盟领导及开发 。
一  安卓逆向:基础入门

文章插图
系统架构
一  安卓逆向:基础入门

文章插图
左边的就是系统框架了 , 右边我加了备注 , 这样更加明了 , 我们可以看到 , 系统架构共分四层 , 从下往上分别是:Linux内核层、系统运行库层(程序库+运行库)、应用程序框架层、应用层 。
大家重点关注下 这一部分 , 其他的简单了解下就可以涉及到后面的讲解:
Llnux内核层:系统是基于Linux内核的,它提供了基本的系统功能及与硬件交互的驱动 , 像图中 (显示驱动)、 (摄像头驱动)、WiFi (WiFi驱动)等 , 简单了解下就可以 。
系统运行库层:像图中内核的上一层就是系统运行库层 , 它由程序库(绿色部分)和 运行库(黄色部分)组成 。
(应用程序框架层):这一层呢主要是提供一些组件 , 搭建框架 , 方便app开发人用再次基础上快速开发开发应用程序 。而实际上就是一些,简单了解下就可以 。
应用程序框架层类库名称功能
活动管理器( )
管理各个应用程序生命周期并提供常用的导航回退功能 , 为所有程序的窗口提供交互的接口 |
窗口管理器( )
对所有开启的窗口程序进行管理 |
内容提供器( )
提供一个应用程序访问另一个应用程序数据的功能 , 或者实现应用程序之间的数据共享视图系统(View )创建应用程序的基本组件 , 包括列表(lists) , 网格(grids) , 文本框(text boxes) , 按钮() , 还有可嵌入的web浏览器 。
通知管理器( )
使应用程序可以在状态栏中显示自定义的客户提示信息
包管理器( )
对应用程序进行管理 , 提供的功能诸如安装应用程序 , 卸载应用程序 , 查询相关权限信息等 。
资源管理器( )
提供各种非代码资源供应用程序使用 , 如本地化字符串 , 图片 , 音频等
位置管理器( )
提供位置服务
电话管理器( )
管理所有的移动设备功能XMPP服务是在线即时交流软件中一个通用的进程 , 提供后台推送服务
(应用层):顶层中有所有的应用程序 , 如手机中的:电话、文件管理、信息等 。
虚拟机与ART虚拟机 虚拟机
是专门为操作系统设计的一个虚拟机,简称DVM 。在 4.4及以前的版本 , 所有的程序都是在虚拟机环境下去运行的 。DVM的指令是基于寄存器的 , 运行的是经过转换的 .dex文件(.dex是专为设计的一种压缩格式 , 适合内存和处理器速度有限的系统),虚拟机每次应用运行的时候 , 将代码编译成机器语言执行 。
而DVM与JVM的区别:
JVM运行的是Java字节码,DM运行的是 字节码 。
传统java程序经过编译 , 生成java字节码保存在class文件中 , java虚拟机通过解码class文件来运行程序 , 而 虚拟机运行的是字节码 , 所有的字节码都由java字节码转换而来 , 并打包到一个dex可执行文件(.dex),虚拟机通过解释DEX文件来执行字节码 。
DVM是基于寄存器的虚拟机 而JVM执行是基于虚拟栈的虚拟机 。
寄存器存取速度比栈快的多 , dvm可以根据硬件实现最大的优化 , 比较适合移动设备 。
以下是同段代码经反编译形成的java字节码与字节码对比
java字节码
一  安卓逆向:基础入门

文章插图
字节码
一  安卓逆向:基础入门

文章插图
dvm执行的是.dex格式文件 , jvm执行的是.class文件
.dex文件 , 是DVM独有的执行文件格式 , 体积更小 , 速度跟快 , 占用空间更少
运行环境的区别
经过优化 , 允许在有限的内存中同时运行多个虚拟机的实例 , 并且每一个 应用作为一个独立的Linux 进程执行 。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭 。
ART虚拟机
前面说到 , 当我们使用手机每运行一个程序 , 虚拟机都会产生一个实例 , 互不影响 , 这就可能会出现占用资源过多等问题 , 随着人们日益增长的需求 , 无法满足人们对软件运行效率的需要 。这是就诞生了ART虚拟机 。
在.4及以上版本 , 应运而生的ART( Run Time)虚拟机替代了虚拟机 , 其处理机制根本上的区别是它采用AOT(Ahead of TIme)技术 , 会在应用程序安装时就转换成机器语言 , 不再在执行时解释 , 从而优化了应用运行的速度 。在内存管理方面 , ART也有比较大的改进 , 对内存分配和回收都做了算法优化 , 降低了内存碎片化程度 , 回收时间也得以缩短 。
DVM与ART的区别:虽说ART替换了虚拟机 , 并不意味着 , 其应用程序开发上也要发生改变 , 像应用程序安装包(apk)中 , 仍然还是可执行的.dex文件 。
应用程序架构
安卓应用程序使用JAVA语言编写 。安卓的SDK工具负责将你编写的代码 , 用到的数据和资源文件编译进APK文件中 , APK: (应用程序安装包) 。apk文件包含了一个安卓应用程序的所有内容 , 并且被安卓设备用来安装应用程序 。
而apk实际上就是一个标准的zip格式 , 修改后缀名 , 进行解压就可以看到内部结构 。
一  安卓逆向:基础入门

文章插图

一  安卓逆向:基础入门

文章插图
而每个文件夹都有各自不同的作用 , 大家可以了解下 。
res//:存放被编译为屏幕布局(或屏幕的一部分)的XML文件
res//:存放可以被编译成很多类型的资源文件
.xml文件:应用程序配置文件 , 每个应用都必须定义和包含的 , 它描述了应用的名字、版本、权限、引用的库文件等信息 。
.dex文件:传统 Class 文件是由一个 Java 源码文件生成的 .Class 文件 , 而是把所有 Class 文件进行合并优化 , 然后生成一个最终的 class.dex 文件 。它包含 APK 的可执行代码 , 是分析软件时最常见的目标 。由于dex文件很难看懂 , 可通过反编译得到.smali文件 , smali文件是对虚拟机字节码的一种解释(也可以说是翻译) , 并非一种官方标准语言 。通过对smali文件的解读可以获取源码的信息 。
.arsc文件:二进制资源文件 , 包括字符串等 。
smali:smali是将字节码用可阅读的字符串形式表现出来的一种语言,可以称之为字节码的反汇编语言 。利用或者  , 反编.dex文件 , 就可以得到以smali为后缀的文件 , 这些smali文件就是的寄存器语言 。
应用编译流程
应用编译流程按图中的例子就是一个app应用的生成过程 。在应用程序上架的时候都需要程序经过编译、签名 、生成一个后缀为apk的文件才能发布到应用市场 。
下面给大家简单讲解下:
应用反编译流程及工具利用
而应用反编译流程就是上面所讲的app生成过程的逆过程 。应用程序的反编译 , 算是我们入手逆向展开实践的第一步 。
下面给大家简单讲解下流程:
一  安卓逆向:基础入门

文章插图
首先可以看到最左边的目标 apk , 即未签名apk 。整体可以看出有两条反编译路线 。
反编译方式一:图中上面这条路线是通过利用这款工具 , 可直接对目标apk直接进行反编译 , 可以看到除apk本身的资源文件 , 还生成了smali文件 , 而smali文件里面包含的都是程序执行的核心代码 。我们可以通过直接分析.smali文件中的smali代码 , 进而修改代码 , 改变其运行逻辑 。
工具下载地址:
利用方式:cmd运行命令
apktool d target.apk
一  安卓逆向:基础入门

文章插图
反编译完成后会生成文件夹 。
一  安卓逆向:基础入门

文章插图
反编译方式二:图中下面这条路线是通过修改apk后缀名 , 对其解压后 , 将文件夹中的资源文件 , 通过利用进行分析 , 进而反编译 , 而对于解压后的class.dex文件 , 利用反编译工具对其进行反编译得到jar文件 。接着将生成的jar文件直接拖到JD-GUI文件中 , 可自动生成源码 , 我们可通过分析其源码 , 了解其程序的运行逻辑 , 但我们修改逻辑 , 最终还是需要在smali文件中进行修改 。
下载地址:
利用方式:cmd运行命令
dex2jar.bat classes.dex
目录生成新的jar 。
【一安卓逆向:基础入门】
一  安卓逆向:基础入门

文章插图
而jd-gui反编译工具的使用方法 , 可直接将jar文件拖到工具中 , 会自动进行反编译出源码进行查看 。
一  安卓逆向:基础入门

文章插图
jd-gui下载地址:
工具推荐
以上就是传统的反编译流程 , 若想具体了解过程 , 可通过上述流程进行自我复现 。
而在逆向的实际应用中 , 个人比较推荐 与 jadx-gui这两款工具 。
逆向概述
ok , 基本的知识框架体系已经啰嗦完了 , 现在开始我们的重点——逆向 。
什么是逆向呢?
官方话语:逆向是对已经打包好的APP进行反编译、源码分析了解APP实现逻辑的一门技术 。
通俗理解呢:就是经过零件组装(源码编译)、加工刷漆(打包、签名)生成玩具(app)的逆过程 。我们把成品的app , 再将它打回零件形态——源码 , 通过更改它的零件(代码) , 再进行重组装(重编译) , 使它可以飞天、遁地等等(改变运行逻辑) 。
当然 , 这里的更改零件 , 指的可不是app的源码 , 而是经反编译后的smali代码 。
而在实际应用中 , 我们逆向的话 , 需要用到解密、反编译、解压缩等技术 , 想要100%还原APK的源码几乎是不可能的 , 所以在实际进行逆向分析的时候 , 一般都是根据想实现的目的 , 分析出APK的部分源码和实现逻辑 , 然后对这一部分源码进行修改后与原始的APK打包在一起 , 这样就获得了一个实现自己特定目的的APP 。
总结与思考
以上文章就介绍的到这里,读到这里可能你们都觉得本篇涉及逆向的知识点并不多 , 而我也说过 , 了解逆向 , 要先了解 , 之所以这样说 , 是因为逆向的学习 , 最终还是要归到本身 , 有了前面的了解 , 相信会对接下来逆向分析上有着很大作用 。
后面要讲的就是逆向分析的手段以及具体流程 , 实践与理论结合的边练边学了 , 大家可以自己针对应用程序的反编译流程操练一番 , 备好工具 , 下一篇开搞 。