内容简介
《Android系统安全和反编译实战》循序渐进地讲解了Android系统安全方面的基本知识,从Android系统介绍开始到综合实例的实战过程,全程剖析了Android系统安全、应用安全开发和加密、解密方面的核心知识。全书共17章,主要内容包括,Android技术核心框架分析、获取并编译源代码、Android系统的安全机制、内存安全机制、Binder通信安全机制、Android虚拟机基础、Dalvik VM的运作流程、DEX文件详解、编写安全的应用程序、应用安全策略、文件加密、电话系统的安全机制、短信系统的安全机制、网络防火墙系统、文件加密系统等核心技术。
《Android系统安全和反编译实战》适合Android初学者、Android应用开发者、Android安全架构研究人员、Android底层开发人员和Android源代码分析人员学习,也可以作为相关培训学校和大专院校相关专业的教学用书。
作者简介
杨峻,计算机硕士,软件工程硕士。现就职于国内某著名安全公司移动端项目组,专门解决移动Android设备方面的数据加密、漏洞校验分析和加密工作。精通C、C++、Java、Linux、汇编、ARM,擅长漏洞查找分析、系统安全架构和反编译。2010年,曾经率先发现微软IE7的重大漏洞,并提出了具体的补丁方案,引起微软重视。随着移动设备的兴起,对Android和iOS等主流移动平台的漏洞和安全隐患进行了详细分析,并取得显著的成果。
内页插图
目录
第1章 Android技术概述 1
1.1 智能手机系统介绍 1
1.2 搭建Android应用开发环境 2
1.2.1 安装Android SDK的系统要求 2
1.2.2 安装JDK 2
1.2.3 获取并安装Eclipse和Android SDK 5
1.2.4 安装ADT 7
1.2.5 设定Android SDK Home 8
1.2.6 验证开发环境 9
1.2.7 创建Android虚拟设备(AVD) 9
1.2.8 启动AVD模拟器 10
1.2.9 解决搭建环境过程中的常见问题 12
第2章 Android技术核心框架分析 15
2.1 简析Android安装文件 15
2.1.1 Android SDK目录结构 15
2.1.2 android.jar及内部结构 16
2.1.3 阅读SDK帮助文档 16
2.1.4 常用的SDK工具 17
2.2 演示官方实例 19
2.3 剖析Android系统架构 23
2.3.1 Android体系结构介绍 23
2.3.2 Android应用工程文件组成 25
2.4 简述五大组件 27
2.4.1 用Activity来表现界面 27
2.4.2 用Intent和Intent Filters实现切换 28
2.4.3 Service为你服务 28
2.4.4 用Broadcast Intent/Receiver发送广播 29
2.4.5 用Content Provider存储数据 29
2.5 进程和线程 29
2.5.1 先看进程 29
2.5.2 再看线程 30
2.5.3 应用程序的生命周期 30
第3章 获取并编译源码 33
3.1 在Linux系统中获取Android源码 33
3.2 在Windows平台获取Android源码 34
3.3 分析Android源码结构 36
3.3.1 应用程序 38
3.3.2 应用程序框架 39
3.3.3 系统服务 39
3.3.4 系统程序库 41
3.3.5 系统运行库 44
3.3.6 硬件抽象层 44
3.4 编译源码 45
3.4.1 搭建编译环境 46
3.4.2 开始编译 46
3.4.3 在模拟器中运行 47
3.4.4 常见的错误分析 48
3.4.5 实践演练——演示两种编译Android程序的方法 49
3.5 编译Android Kernel 52
3.5.1 获取Goldfish内核代码 52
3.5.2 获取MSM内核代码 55
3.5.3 获取OMAP内核代码 55
3.5.4 编译Android的Linux内核 55
3.6 编译源码生成SDK 57
第4章 Android系统的安全机制 61
4.1 Android安全机制概述 61
4.1.1 Android的安全机制模型 61
4.1.2 Android的安全框架概述 62
4.2 分析Linux系统的安全机制 63
4.2.1 Linux用户权限基础 63
4.2.2 进程 68
4.3 分析Android系统的安全机制 70
4.3.1 沙箱模型介绍 70
4.3.2 应用程序的安全机制 72
4.3.3 分区加载机制 73
第5章 内存安全机制——匿名共享内存系统 74
5.1 分析Ashmem驱动程序 74
5.1.1 基础数据结构 74
5.1.2 初始化处理 75
5.1.3 打开匿名共享内存设备文件 76
5.1.4 内存映射 78
5.1.5 实现读写操作 79
5.1.6 锁定和解锁 81
5.1.7 回收内存块 86
5.2 分析C++访问接口层 87
5.2.1 接口MemoryBase 87
5.2.2 客户端实现 90
5.2.3 接口MemoryBase 94
5.3 分析Java访问接口层 97
5.4 内存优化机制 100
5.4.1 sp和wp简析 100
5.4.2 详解智能指针 102
5.5 Android内存系统的安全机制分析 118
5.5.1 Ashmem匿名共享内存的机理 119
5.5.2 使用Low Memory Killer机制实现安全和高效 119
第6章 Binder通信安全机制(上) 121
6.1 Binder机制基础 121
6.1.1 选择Binder机制的原因——简洁快速、低耗内存、更加安全 121
6.1.2 Binder安全机制的必要性 122
6.1.3 Android的进程间通信(IPC)机制Binder 122
6.1.4 Service Manager是Binder机制的上下文管理者 123
6.1.5 Service Manager服务 137
6.2 分析Binder驱动程序 140
6.2.1 分析数据结构 140
6.2.2 分析设备初始化 150
6.2.3 打开Binder设备文件 151
6.2.4 内存映射 152
6.2.5 释放物理页面 156
6.2.6 分配内核缓冲区 157
6.2.7 释放内核缓冲区 158
6.2.8 查询内核缓冲区 160
第7章 Binder通信安全机制(下) 162
7.1 Binder封装库 162
7.1.1 类BBinder 163
7.1.2 类BpRefBase 165
7.1.3 类IPCThreadState 166
7.2 初始化Java层Binder框架 168
7.3 分析MediaServer的通信机制 170
7.3.1 MediaServer的入口函数 170
7.3.2 ProcessState 171
7.3.3 defaultServiceManager 173
7.3.4 注册MediaPlayerService 179
7.3.5 分析StartThread Pool和join Thread Pool 188
7.4 总结进程通信机制的安全性 190
7.4.1 进程先线程安全 190
7.4.2 远程过程调用机制(RPC) 191
7.4.3 实现线程安全方法 192
7.4.4 Binder中的安全策略 193
第8章 Android虚拟机基础 194
8.1 Dalvik VM和JVM的差异 194
8.2 Dalvik虚拟机的主要特征 195
8.3 Dalvik VM架构 196
8.3.1 Dalvik虚拟机的代码结构 196
8.3.2 dx工具 198
8.3.3 Dalvik VM的进程管理 198
8.3.4 Android的初始化流程 198
8.4 Dalvik VM控制VM命令详解 199
8.4.1 基本命令 199
8.4.2 扩展的JNI检测 199
8.4.3 断言 200
8.4.4 字节码校验和优化 200
8.4.5 Dalvik VM的运行模式 201
8.4.6 死锁预测 201
8.4.7 dump堆栈追踪 202
8.4.8 dex文件和校验 202
8.4.9 产生标志位 202
8.5 Dalvik VM进程管理 202
8.5.1 Zygote基础 202
8.5.2 Dalvik的进程模型 211
8.5.3 Dalvik的进程通信 215
8.6 Zygote(孕育)进程 218
8.6.1 Zygote基础 218
8.6.2 分析Zygote的启动过程 219
第9章 Dalvik VM的运作流程 233
9.1 Dalvik VM相关的可执行程序 233
9.1.1 dalvikvm、dvz和app_process简介 233
9.1.2 对比app_process和dalvikvm的执行过程 234
9.2 初始化Dalvik VM 236
9.2.1 开始虚拟机的准备工作 236
9.2.2 初始化跟踪显示系统 237
9.2.3 初始化垃圾回收器 237
9.2.4 初始化线程列表和主线程环境参数 237
9.2.5 分配内部操作方法的表格内存 238
9.2.6 初始化虚拟机的指令码相关的内容 238
9.2.7 分配指令寄存器状态的内存 239
9.2.8 分配指令寄存器状态的内存和最基本用的Java库 239
9.2.9 初始化使用的Java类库线程类 240
9.2.10 初始化虚拟机使用的异常Java类库 241
9.2.11 初始化其他对象 242
9.3 启动Zygote 250
9.3.1 在init.rc中配置zygote启动参数 250
9.3.2 启动Socket服务端口 250
9.3.3 加载preload-classes 251
9.3.4 加载preload-resources 2
前言/序言
《深入Android安全:攻防之道》 内容简介 本书是一本全面剖析Android系统安全机制,并深入探讨反编译技术在安全攻防中的应用的实践指南。本书旨在为Android开发者、安全研究人员、渗透测试工程师以及对Android安全领域感兴趣的技术爱好者提供一套系统性的知识体系和实用的技术方法。我们将从Android系统的底层架构出发,逐步揭示其安全设计原理,并结合丰富的实战案例,引导读者掌握检测、分析和利用Android应用程序安全漏洞的技巧,同时,也会深入讲解反编译的原理与技术,帮助读者理解恶意软件的构造,并从中学习如何加固自身应用,抵御潜在的攻击。 第一部分:Android系统安全基础 第一章:Android安全模型深度解析 Linux内核安全基础: Android系统建立在强大的Linux内核之上,本章将回顾Linux内核在用户空间与内核空间隔离、权限管理(UID/GID)、文件权限、SELinux等方面的核心安全机制,并阐述这些机制如何为Android系统提供基础的安全保障。 Android沙箱机制: 深入剖析Android特有的应用程序沙箱模型,理解每个应用运行在独立的进程中,拥有唯一的UID,以及它们之间如何通过Binder IPC进行通信,并限制相互访问。我们将重点讲解沙箱机制的隔离性、安全性以及潜在的绕过途径。 Linux用户和权限管理: 详细介绍Android系统中用户ID (UID) 和组ID (GID) 的分配策略,以及应用程序如何获取和管理自身权限。我们将探讨Android系统权限的粒度、运行时权限的引入及其对应用安全设计的影响。 SELinux在Android中的应用: 全面介绍安全增强Linux (SELinux) 这一强大的强制访问控制 (MAC) 机制如何在Android系统中实现细粒度的安全策略。我们将讲解SELinux的Context、Type Enforcement (TE)、Policy Language,以及如何通过分析SELinux日志来发现安全问题。 Android安全组件概览: 介绍Android系统内置的关键安全组件,包括但不限于KeyStore(用于密钥管理)、Credential Storage(用于凭证存储)、Verified Boot(用于设备启动时的完整性验证)等,并说明它们在保障系统整体安全中的作用。 第二章:Android应用权限与风险评估 Android权限体系详解: 详细分类讲解Android系统定义的各种权限,包括普通权限、危险权限、签名权限和特殊权限。我们将深入分析每种权限的用途、风险以及授予后可能带来的安全隐患。 运行时权限的演进与影响: 深入探讨Android 6.0及以上版本引入的运行时权限模型,分析其对用户隐私保护和应用安全设计带来的挑战与机遇。我们将演示如何通过模拟用户操作来检测和利用缺乏运行时权限保护的应用。 Manifest文件安全: 深入剖析`AndroidManifest.xml`文件中与安全相关的配置项,如`android:exported`、`android:permission`、`android:protectionLevel`等,并讲解配置不当可能导致的攻击向量,例如组件暴露、权限提升等。 IPC机制的安全隐患: 详细分析Android中的进程间通信 (IPC) 机制,包括Binder、AIDL、ContentProvider、BroadcastReceiver等。我们将重点探讨这些机制在安全设计上的不足,以及如何利用它们进行数据窃取、服务劫持或拒绝服务攻击。 风险评估方法论: 介绍一套系统的Android应用风险评估方法,包括静态分析(代码审查、配置文件检查)和动态分析(运行时行为监控、漏洞探测)相结合的流程,帮助读者全面识别应用的安全弱点。 第三章:Android系统级安全与固件分析 Android启动过程与安全: 详细解析Android系统的启动流程,从Bootloader、Kernel到System Server的启动过程,并重点关注各个阶段的安全检查机制,如Verified Boot、dm-verity等,理解它们如何防止恶意固件的注入。 Android文件系统安全: 讲解Android文件系统的结构,包括`/system`、`/data`、`/cache`等分区的安全属性和权限控制。我们将探讨root权限的获取、系统文件篡改的风险以及文件系统加密的重要性。 Android安全补丁与漏洞管理: 介绍Android安全补丁的发布机制,以及常见的Android系统漏洞类型(如内核漏洞、framework漏洞)。我们将讨论如何及时更新系统和应用以应对安全威胁。 固件提取与分析基础: 介绍如何从设备中提取Android固件,并进行初步分析,例如识别固件版本、查找关键文件和配置文件。我们将讲解使用adb、fastboot等工具进行固件操作的注意事项。 Recovery模式的安全: 分析Android Recovery模式的作用和安全风险,以及如何利用Recovery模式进行系统刷写和维护。我们将讨论Rooted设备上Recovery模式的潜在安全隐患。 第二部分:Android反编译与逆向工程实战 第四章:Android应用程序结构与 Dalvik/ART 虚拟机 APK文件格式剖析: 详细解读APK文件的组成结构,包括`classes.dex`、`resources.arsc`、`AndroidManifest.xml`、`res`目录、`lib`目录等。我们将讲解各个组成部分的作用以及它们在安全分析中的重要性。 Dex文件格式与字节码: 深入理解Dalvik Executable (DEX) 文件格式,包括Header、Map List、String IDs、Type IDs、Method IDs、Field IDs以及Code Item等。我们将介绍DEX文件在内存中的表示方式,以及如何使用工具解析DEX文件。 Dalvik与ART虚拟机: 详细对比Dalvik和ART(Android Runtime)虚拟机的架构和工作原理。我们将讲解JIT(Just-In-Time)编译与AOT(Ahead-Of-Time)编译对应用性能和安全的影响。 Dex文件优化与混淆: 介绍DEX文件在打包前可能经历的优化过程,以及常见的代码混淆技术(如ProGuard、R8)如何增加逆向工程的难度。我们将讨论混淆对代码分析的影响以及应对策略。 Smali/Baksmali工具使用: 重点讲解`baksmali`和`smali`这两个核心工具的使用方法,如何将DEX文件反汇编为Smali(一种类似于汇编的中间表示),以及如何将Smali代码重新编译回DEX。 第五章:Android反编译工具集与逆向分析流程 主流反编译工具介绍: 全面介绍并演示当前流行的Android反编译工具,包括Jadx、APKTool、Bytecode-Viewer、JEB Decompiler等。我们将分析它们的优缺点,适用场景,以及如何进行工具链的组合使用。 APKTool高级用法: 深入讲解APKTool在反编译APK、回编译、修改资源文件、签名等方面的详细操作。我们将演示如何使用APKTool来修改应用的UI、字符串、配置文件等。 Jadx的源码还原能力: 重点演示Jadx强大的Java源码反编译能力,讲解如何通过Jadx进行代码阅读、函数跟踪、变量分析,以及如何导出还原后的Java源代码。 JEB Decompiler的综合分析: 介绍JEB Decompiler在二进制分析、类/方法/字段的高级视图、Xrefs/Xcalls分析、脚本扩展等方面的强大功能,并展示其在复杂应用分析中的优势。 逆向分析工作流: 建立一套标准化的Android应用逆向分析工作流,包括:获取APK、初步信息收集、静态分析(代码、资源、清单)、动态分析(调试、Hook)、漏洞挖掘、报告编写等,帮助读者系统地进行逆向工程。 第六章:代码层面的逆向分析技巧 Java/Kotlin代码的静态分析: 讲解如何通过分析反编译出的Java/Kotlin代码来理解应用逻辑。我们将演示如何识别关键函数、数据结构、算法实现,以及如何追踪敏感操作的执行路径。 Smali代码的阅读与分析: 深入讲解Smali语言的语法和指令集,以及如何阅读和理解Smali代码。我们将重点分析Smali代码中的常量池、方法调用、条件跳转、循环等,并演示如何通过修改Smali代码来实现特定的功能或绕过安全检查。 Native库(So文件)的逆向: 介绍Android Native库(`.so`文件)的组成,以及如何使用IDA Pro、Ghidra等反汇编器来分析ARM/X86架构的Native代码。我们将讲解JNI(Java Native Interface)的调用机制,以及如何分析Native库中的加密、加壳、代码混淆等。 数据加密与解密分析: 演示如何通过逆向分析来识别和破解应用中的数据加密算法,例如AES、RSA等。我们将讲解如何在运行时捕获加密密钥,以及如何分析算法实现来还原明文数据。 代码混淆与反混淆技术: 深入探讨各种代码混淆技术,包括名称混淆、控制流混淆、字符串加密等,并介绍相应的反混淆技术和工具,如Deobfuscator、String Decryptor等。 第七章:运行时与动态分析技术 Android调试器(JDB/LLDB)的使用: 详细讲解如何使用Android SDK自带的JDB(Java Debugger)以及LLDB(LLVM Debugger)来对Android应用进行远程调试。我们将演示如何设置断点、单步执行、查看变量值、内存 dump 等。 Hook技术在安全分析中的应用: 深入介绍Hook技术,包括Method Hooking(如Xposed Framework, Frida)和Inline Hooking。我们将演示如何使用Hook技术来拦截方法调用、修改方法返回值、监控敏感API的调用,以及实现运行时代码的动态修改。 Frida动态插桩框架: 详细讲解Frida强大的动态插桩框架,如何使用JavaScript编写脚本来 hook 目标应用,实现数据抓取、权限绕过、参数篡改等高级分析功能。 内存分析与数据提取: 介绍Android设备上的内存 dump 方法,以及如何使用工具(如Volatility Framework)来分析内存映像,从而发现运行时的数据、密钥、明文信息等。 网络流量捕获与分析: 演示如何使用Burp Suite、Wireshark等工具来捕获和分析Android应用的网络通信流量。我们将重点关注HTTPS抓包的配置,以及如何分析API请求和响应,发现数据传输中的安全漏洞。 第三部分:Android安全攻防综合实践 第八章:常见Android应用安全漏洞挖掘与利用 不安全的本地存储: 分析SharedPreferences、SQLite数据库、SD卡存储等数据存储方式的安全风险,讲解如何检测和利用明文存储的敏感信息。 WebView安全漏洞: 深入讲解WebView组件的常见安全漏洞,如JavaScript接口注入(addJavascriptInterface)、URL拦截绕过、文件访问漏洞等,并演示如何利用这些漏洞执行任意代码或窃取数据。 ContentProvider安全问题: 分析ContentProvider暴露不当导致的路径遍历、SQL注入、数据泄露等安全问题,以及如何通过非法的ContentProvider访问来获取敏感数据。 Intent与BroadcastReceiver安全: 讲解Intent组件在安全通信中的风险,如隐式Intent的劫持、BroadcastReceiver的权限控制不足导致的拒绝服务或信息泄露。 加固与反加固技术: 介绍Android应用程序加固的常用技术,如代码混淆、资源加密、DEX加密、反调试、反Hook等。我们将讨论如何对加固后的应用进行反加固分析,从而恢复其原始状态。 第九章:Android恶意软件分析入门 恶意软件的分类与行为模式: 介绍常见的Android恶意软件类型,如木马、间谍软件、勒索软件、广告软件等,分析它们的传播方式、主要功能和攻击目的。 恶意软件样本获取与初步分析: 讲解如何安全地获取恶意软件样本,并进行初步的静态分析,包括查看APK信息、分析`AndroidManifest.xml`、识别可疑权限等。 动态行为分析: 演示如何使用模拟器(如AndroVM、Genymotion)或真机,结合Hook工具和流量监控工具,来观察恶意软件的运行时行为,如文件访问、网络通信、短信/通话记录的窃取等。 恶意软件通信协议分析: 讲解如何分析恶意软件与C2(Command and Control)服务器之间的通信协议,识别其通信模式和数据传输方式。 利用反编译技术辅助恶意软件分析: 演示如何通过反编译恶意软件的Dex或Native代码,来理解其核心功能、加密算法、后门实现等,从而揭示其攻击原理。 第十章:Android应用安全加固策略 代码混淆与代码虚拟化: 详细介绍ProGuard、R8等混淆工具的使用,以及代码虚拟化技术如何进一步增加逆向分析的难度。 DEX加密与脱壳技术: 讲解DEX文件加密的原理,以及常见的DEX脱壳技术,如何保护应用的ClassLoader和DexClassLoader。 资源文件保护: 介绍图片、XML、字符串等资源文件的加密和混淆技术,防止资源被轻易提取和修改。 运行时安全检测: 讲解如何实现运行时安全检测,包括反调试、反Hook、Root检测、模拟器检测等,并在检测到异常时采取相应措施。 安全编码实践: 提供一套Android应用安全编码的最佳实践,从权限申请、IPC通信、数据存储、网络安全到第三方库的使用,帮助开发者编写更安全的代码,从源头上减少安全漏洞。 附录 常用Android安全工具列表及使用指南 Android安全相关术语表 进阶学习资源推荐 本书的编写理念是“理论与实践并重”。在介绍每一个安全概念或技术时,我们都会提供相应的代码示例、命令行操作或实际案例分析,力求让读者能够跟随书本的指引,动手实践,真正掌握Android系统的安全机制和反编译技术。通过本书的学习,您将能够更深刻地理解Android平台的安全挑战,并具备独立分析、检测和加固Android应用的能力,成为一名更加优秀的Android安全从业者。