一、纵观Android生态圈
1.了解Android的根源
2.了解Android的利益相关者
3.理解生态圈的复杂性
碎片化问题、兼容性、更新问题、安全性与开放性、公开披露
chrome的漏洞往往也存在于Android中
跟踪Android安全问题的唯一方法是阅读AOSP的修改日志,跟踪Gerrit的修改记录,或者从Android问题跟踪服务器上大海捞针。
高通公司通过Code Aurora论坛公开披露漏洞。
4.小结
在本章中,你看到了Android操作系统是如何经过多年的发展,由零开始逐渐征服移动操作系统设计市场的。本意介绍了Android生态圈的主要利益相关者,解释了他们各自的角色及参与动机。本章详细介绍了困扰Android生态圈的各种复杂性问题,以及它们是如何影响Android安全性的。有了对Android生态圈复杂性的深刻理解,你就可以很容易地找出关键问题领域,进而更有效地致力于解决Android安全性问题。
二、Android的安全设计与架构
1.理解Android系统架构
Android总体架构由5个主要层次上的组件构成:Android应用层、Android框架层、Dalvik虚拟机层、用户空间原生代码层、Linux内核层。
2.理解安全边界和安全策略执行
Android操作系统应用了两套独立但又相互配合的权限模型。在底层,Linux内核使用用户和用户组来实施权限控制,这套权限是从Linux继承过来的,用于对文件系统实体进行访问控制,也可以对其他Android特定资源进行控制,称为Android沙箱;以DalvikVM和Android框架形式存在的Android运行时实施了第二套权限模型,这套模型在用户安装应用时是向用户公开的,定义了应用拥有的权限,从而限制Android应用的能力。第二套权限模型中的某些权限直接映射到底层操作系统上的特定用户、用户组和权能(Capability)。
Android从其根基Linux继承了已经深入人心的类Unix进程隔离机制与最小权限原则。具体而言,进程以隔离的用户环境运行,不能相互干扰,比如发送信号或者访问其他进程的内存空间。因此Android沙箱的核心机制基于以下几个概念:标准的Linux进程隔离、大多数进程拥有唯一的用户ID,以及严格限制文件系统权限。
Android的权限模型是多方面的,有API权限、文件系统权限和IPC权限。在很多情况下,这些权限都会交织在一起。
3.深入理解各个层次
Android应用层:Android在与应用相关的多种用途中使用公共密钥加密算法。首先,Android使用一个特殊的平台密钥来签署预安装的应用包。使用这个密钥签署的应用的特殊之处它们拥有system用户权限。其次,第三方应用是由个人开发者生成的密钥签名的。对于预安装应用和用户安装应用,Android都使用签名机制来阻止未经授权的应用更新。
Android框架层:作为应用和运行时之间的连接纽带,Android框架层为开发者提供了执行通用任务的部件——程序包及其类。这些任务可能包括管理UI元素、访问共享数据存储,以及在用就组件中传递消息等。也就是说,框架层中包含任何仍然在DalvikVM中执行的非应用特定代码。
DalvikVM:DalvikVM是基于寄存器而不是栈的。DalvikVM拥有大约64000个寄存器。不过通常只会用到最前16个,偶尔会用到前256个。这些寄存器被指定为虚拟机内存的存储位置,用于模拟微处理器的寄存器功能。就像实际的微处理器一样,DalvikVM在执行字节码时,使用这些寄存器来保存运行状态,并跟踪一些值。DalvikVM使用JNI与底层原生代码进行交互。
Android设备启动时,Zygote进程是最先运行的进程之一。接下来,Zygote负责启动其他服务以及加载Android框架所使用的程序库。然后,Zygote进程作为每个Dalvik进程的加载器,通过复制自身进程副本来创建进程。Zygote的第二大功能是启动system_server进程,这个进程容纳了所有系统核心服务,并在system的AID用户环境中以特权权限运行。
用户空间原生代码层:程序库和核心服务。
程序库是使用原生代码开发的,因而很容易出现内存破坏漏洞。
核心服务是指建立基本操作系统环境的服务与Android原生组件。包括初始化用户空间的服务(init)、提供关键调用功能的服务(adbd和debuggerd)等。
内核:Android分支、Binder、ashmem、peme、日志记录器、Paranoid Networking
4.复杂的安全性,复杂的漏洞利用
Android设计者坚持了最低权限原则。进程隔离和减少特权往往是安全系统设计中的基石
5.小结
本章概述了Android安全设计和架构。我们引入了Android沙箱及Android使用的权限模型,包括Android对Unix系统UID/GID映射关系的特殊实现AID,以及在整个系统中实施的限制和权能。
我们也深入介绍了Android的逻辑层次,包括应用层、Android框架层、DalvikVM、用户空间原生代码和Linux内核。对于每个层次,我们都讨论了主要组件,特别是那些与安全相关的组件。我们强调了Android开发者对Linux内核所作出的重要添加与修改。
三、root Android设备
1.理解分区布局
分区是在设备持久性存储内存中划分的逻辑存储单元或分块,而布局是指对分区制定次序、偏移和尺寸。最常见的是引导区、系统区、数据区、恢复区和缓存区
2.理解引导过程
引导加载程序通常是在硬件开机之后最早运行的代码。在大多数设备上,引导加载程序是厂商的私有代码,负责对一些底层的硬件进行初始化,并为加载恢复映像或者将手机设置成下载模式提供支持。
当引导加载程序完成硬件初始化之后,它从引导分区中将Android内核和initrd装载到RAM中,最后,它将跳进内核,让内核继续启动的过程。
Android内核负责处理让Android系统在设备上正常运行所需的所有任务。例如,它会初始化内存、I/O区域、内存保护、中断处理程序、CPU调度器和设备驱动等。最后,它将挂载rot文件系统,并启动最初的用户空间进程:init。
3.引导加载程序的锁定与解锁
一般而言,通过在引导加载程序层次上实现一些限制,对引导加载程序进行锁定,可以防止终端用户修改设备固件。然而对引导加载程序进行解锁会带来严重的安全隐患。
Android的恢复系统是以软件更新包替换设备预装系统软件的一套Android标准机制,这个过程不会擦除用户数据。
4.对未加锁引导加载程序的设备进行root
第一步是解锁引导加载程序。之后用户就可以自由地对设备进行定制修改。可以通过修改出厂镜像来创建定制系统镜像,或通过源码编译自己的镜像,然后刷入系统分区中来使它第一次。最直接的方法是启动一个定制的恢复镜像。
5.对锁定引导加载程序的设备进行root
首先,确定哪种类型的引导加载程序锁。然后启动一个未能通过签名验证的分区。
如果不允许启动未能通过签名难的分区,可以通过以下方法:通过安全漏洞获得一个root shell;利用以root权限运行进程中的安全漏洞;利用adbd来获取root权限。
对开启NAND锁的设备进行永久性root,必须完成以下两件事中的一件,一是禁用基带上的安全标志位;二是将设备刷上一个不会实施NAND锁的打补丁的HBOOT或工程HBOOT。
对软root持久化:在没有开启NAND锁的手机上,只需对系统分区的写权限。如果手机有NAND锁,那么首先移除掉它,然后以读写模式重新挂载系统分区,旋转一个设置set-uid root权限的su二进制程序,然后再次以只读模式挂载。另一种方法是将定制恢复镜像写入恢复分区中。
6.历史上的一些已知攻击
内核:Wunderbar/asroot、恢复:Volez、udev:Exploid、adbd:RageAgainstTheCage、Zygote:Zimperlich和Zysploit、ashmem:KilingInTheNameOf和psneuter、vold:GingerBreak、PowerVR:levitator、libsysutils:zergRush、内核:mempodroid、文件权限和符号链接相关的攻击、adb恢复过程竞争条件漏洞、Exynos4:exynos-abuse、Diag:lit/diaggetroot
7.小结
对Android设备进行root,可以让你获得Android设备的完全控制。然而,如果你不采取任何预防措施来修补获得root高总权限的开放通道,那么系统安全可以轻易地被攻击者损害。
本意介绍了理解root过程的关键要信,包括通过合法的引导加载程序解锁的方法,如在那些引导加载程序未加锁设备上的方法,以及允许在一个引导加载程序已加锁设备上获取和持久化root访问的其他方法。最后,你看到了在过去几年里用来root许多Android设备的知名root提权利用程序。
四、应用安全性评估
1.普遍性安全问题
应用权限问题、敏感数据的不安全传输、不安全的数据存储、通过日志的信息泄露、不安全的IPC端点
2.案例分析:移动安全应用
初步剖析:收集目标应用的一些粗略信息。首先,对这个应用的目标、开发者、开发历史或评论进行大致的了解,基于应用的描述和所列出的申请权限,可以得出一些结论。
名胜古迹分析:在不直接运行应用的情况下,分析应用及其支持组件中的代码和数据。首先可以识别应用中的一些有趣字符串,如硬编码URI、认证你生气或密钥。接着可以演讲进行其他一些分析以构建调用图、确定应用逻辑和程序流程,以及发现潜在的安全问题。
动态分析:在插桩或最接近的方式下运行应用,以获取关于应用行为更具体的信息
攻击
3.案例分析:SIP客户端
了解Drozer
发现漏洞
snarfing
注入
4.小结
本章概述了影响Android应用的一般安全问题。对于每类安全问题,本章都展示了一个公开安全来帮助聚集所带来的潜在影响。你也随着我们对两个公开Android应用进行了案例分析,每个案例分析都非常详细地说明了如何使用通过工具来评估应用,挖掘安全漏洞,并利用这些漏洞。
第一个案例分析使用Androguard来对目标应用执行静态分析、反汇编和反编译。在完成这些之后,你识别出了可以攻击的安全相关组件,具体而言,你找到一个使用短信进行授权的设备加锁/解锁功能。接下来,你使用了动态分析技术(如对应用进行调试)来扩大和确认静态分析的发现。最后,你编写了一些要信难攻击代码来伪造一条短信,并攻破应用的设备解锁功能。
第二个案例分析演示了使用Drozer在应用中找出与Content Provider相关数据暴露问题的快捷简单的方法。首先,你发现了应用暴露出一些用户Activity和第三消息日志,然后,你看到了对存储数据的篡改是多么简单。最后,案例分析讨论了利用SQL注入安全漏洞从应用数据库中获取其他第三数据的细节。
五、理解Android的攻击面
1.攻击基础术语
攻击向量通常指的是攻击者实施先去的方式,描述了用来执行攻击的方法。
攻击面普遍被理解为目标的“软肋”,也就是使得目标易受攻击的功能特性。简单来讲,它描述了代码中可能存在着尚待挖掘的安全漏洞的位置。
2.对攻击面进行分类
攻击面属性:攻击向量、获取的权限、内存安全性、复杂性。
分类决策。
3.远程攻击面
网络概念、网络协议栈、暴露的网络服务、移动技术、客户端攻击面、谷歌的基础设施
4.物理相邻
无线通信、其他技术
5.本地攻击面
探索文件系统、找到其他的本地攻击面(系统调用、套接字、Binder、共享内存、基带接口、攻击硬件支持的服务)
6.物理攻击面
拆解设备、USB、其他物理攻击面
7.第三方修改
8.小结
本章探索了Android设备可能被攻击的所有不同途径,讨论了如何根据可应用的攻击向量和攻击面的不同属性对研究工作进行优先级排序。
通过根据访问复杂性将Android的攻击面分成4个高层分类,本章分别深入到每种攻击面的底层细节中,涉及了不同类型的相邻条件对可用攻击方法的影响。
本章也讨论了一些已知的攻击方法,并介绍了一些可用来进一步探索Android攻击面的工具和技术。特别是,你学到了如何识别Android设备上暴露的端点,如网络服务、本地IPC功能和USB接口等。
由于Android代码规模庞大,本章不可能详尽地分析Android的整个攻击面,因此我们鼓励你应用并扩展本章展示的技术方法进一些探索。
六、使用模糊测试来挖掘漏洞
模糊测试(fuzz testing),或称fuzzing,是一种通过构造畸形输入,来测试软件输入验证方法。
1.模糊测试的背景
选定目标
构造畸形输入:非智能模糊测试(dumb-fuzzing)、智能模糊测试(smart-fuzzing)
处理输入:将输入交给目标软件去处理
监控结果
2.Android上的模糊测试
3.对Broadcast Receiver进行模糊测试
选定目标:首先,找到某款应用或整个系统中哪些Broadcast Receiver已经被注册
生成输入:构造一个不包含其他任何属性(extras、flag、和URI等)的显式Intent对象。
传递输入:调用sendBroadcast方法并传入Intent对象
监控测试:使用logcat来判断应用是否崩溃。
4.对Android上的Chrome进行模糊测试
选择一种技术作为目标:H5的类型数组
生成输入:首先,将最短的触发代码拆分成两个独立数组的创建语句;然后,根据规范构造一个类型数组类型列表。
处理输入:BrowserFuzz使用HTTP协议来传递输入,用Twisted这个Python框架构造一个初级的HTTP服务器来传递输入,然后操纵浏览器去不断地加载相应URL的页面。
监控测试:先清空系统日志,然后打开浏览器访问HTTP服务器,给浏览器留一些时间来处理生成的输入,最后检查日志内容。
5.对USB攻击面进行模糊测试
对USB进行模糊测试的挑战、选定目标模式、生成输入、处理输入、监控测试
6.小结
本章提供了在Android上进行模糊测试所需的所有信息,从高层面上介绍了模糊测试的4个步骤,即选定目标、生成测试输入、处理输入和监控异常行为。本章还介绍了对Android进行模糊测试有哪些优势和挑战。
本章完成了3个模糊测试工具的深入讨论,前两个是专门为本章设计的,最后一个是将公开的工具迁移到Android设备上。每个例子中,模糊测试工具都能找到底层代码中的问题,这也能说明模糊测试是一种发现Android设备中bug和安全漏洞的有效手段。
七、调试与分析安全漏洞
1.获取所有信息
包括文档、源代码、二进制文件、符号文件以及可用的工具等。
2.选择一套工具链
工具链(toolchain)就是开发产品所用到的一系列工具。通常,一套工具链包含编译器、连接器、调试器,以及任何必要的系统库。推荐使用与厂商相同的工具链。
3.调试崩溃Dump
系统日志、Tombstone
4.远程调试
远程调试是在Android平台上调试的首选方法。
5.调试Dalvik代码
6.调试原生代码
使用Android原生开发工具包(NDK)来调试编译在应用内部的自定义原生代码;使用AS调试原生代码;使用AOSP在Nexus设备上调试Android浏览器;使用AOSP实现完全源代码级别的交互式调试;调试运行在非Nexus设备上的原生代码。
7.调试混合代码
8.其他调试技术
调试语句、在设备上进行调试、动态二进制注入
9.漏洞分析
明确问题根源、判断漏洞可利用性
10.小结
在本章中,我们学习了Android平台上调试和漏洞分析技术。本章包含了大师Dalvik和原生代码的调试技术,包括如何使用觉的调试工具,如何利用自动化来提高效率,如何使用AOSP支持的设备来进行源代码级别的调试,以及如何通过直接在真机上调试来提高性能。我们解释了为什么符号在ARM平台上更加重要,说明了在非AOSP设备上调试所面临的困难,并提供了解决这些问题的应对方案。
本章的最后讨论了漏洞分析的两个主要目标:分析漏洞产生的根源和判断漏洞的可自用性。为读者介绍了一些漏洞分析的觉工具和技术,以便深入理解漏洞。还带领读者分析了Android浏览器一个漏洞的成因,教会读者在判断漏洞可利用性方面应该怎样进行都是。
八、用户态软件的漏洞利用
1.内存破坏漏洞基础
栈缓冲区溢出、堆的漏洞利用
2.公开的漏洞利用
GingerBreak、zergRush、Mempodroid
3.Android浏览器漏洞利用
4.小结
本章讨论了ARM平台上用户空间的一系列内存破坏漏洞利用技术,详细介绍了栈和堆内存相关的实现细节和利用技术。尽管讨论的内容没有覆盖所有可能出现的漏洞类型或利用技术,但是为漏洞利用开发提供了思路。
基于堆的内存破坏攻击与应用本身以及分配器十分相关,是目前最常见的漏洞类型。释放后我不用漏洞可以让攻击者使用新分配内存块来我不用已经释放的内存块,相当于引入了别名引用bug。我们以Android的原生分配器dlmalloc和WebKit特定分配器RenderArena为例,讨论了这种情形。虚函数表为堆破坏漏洞提供了一种劫持原生代码执行流的方式。
通过考察一些已经公开的真实漏洞利用,可以发现简单的思路能让利用更稳定,并降低开发成本。GingerBreak利用展示了如何利用数组下标漏洞来修改GOT。zergRush利用是Android系统上栈破坏利用以及绕过栈cookie保护的一个突出例子。Mempodroid则展示了一种非传统的技术,利用内核漏洞获得权限提升。
最后,本章介绍了几种思路,用来利用Webkit渲染引擎中公开且已修复的释放后重用漏洞,解释了编写JavaScript来控制堆的关键步骤。
九、ROP漏洞利用技术
1.历史和动机
ROP(Return Oriented Programming)是一种利用内存中现有原生代码作为攻击载荷,而不是注入自定义指令载荷(即shellcode)的漏洞利用方法。
使用ROP的原因有三:XN保护技术、ARM架构中数据和指令缓存的分享机制、某些ARM平台上操作系统加载器会执行“代码签名”
2.ARM架构下的ROP基础
ROP不仅可以使用整个函数,还可以使用程序中的小块代码片段,称为gadget。为了维持对程序计数器的控制,这些gadget通常以函数返回指令为结尾。攻击者可以选取一系列gadget,来组合成他们想要的载荷。
3.案例分析:Android 4.0.1链接器
迁移栈指针、在新映射内存中执行任意代码
4.小结
通过阅读本章,可以了解到为何以及如何在ARM平台上使用ROP技术,来获得任意原生代码的执行。在最近的Android系统版本中,使用ROP的主要原因是XN保护的开启,它让攻击者无法直接执行普通内存中的数据。即使没有开启XN保护,ROP也可以用来解决ARM架构下指令和数据缓存分享的问题。
基于lr的返回指令导致ROP难度加大;但是由于有pop(pc)这样的gadget,一般基于栈的ROP依然可选。即使是以bxlr指令结尾的gadget也可以利用,只要聪明地将lr指向pop(pc)指令即可。把ARM指令混淆解析成Thumb的pop(,,,,pc)指令给我们带来了更多的gadget。ARM的执行模式可以通过Interworking机制支持来实现,即设置gadget地址的最低位就可以切换到thumb模式。在ARM这样的RISC架构中,搜索gadget是非常容易的,它们都采用长度固定的指令编码方式,用反汇编器生成的反汇编列表就能实现。
本章深入介绍了从Android动态链接器构建ROP链的案例。在Android4.0和更早的版本中,链接器基址是固定的,所以无需信息泄露就能够构造ROP链。动态链接器必须出现在所有动态链接的二进制程序中(包括Android中默认编译产生的几乎所有二进制文件),因此,它会成为很多攻击者的目标。
十、攻击内核
1.Android的Linux内核
2.内核提取
从出厂固件中提取内核、从设备中提取内核、从启动镜像中提取内核、解压内核
3.运行自定义内核代码
获取源代码、搭建编译环境、配置内核、使用自定义内核模块、编译自定义内核、制作引导镜像、引导自定义内核
4.调试内核
获取内核崩溃报告、理解Oops信息 、使用KGDB进行Live调试
5.内核涮利用
典型Android内核、 获取地址、案例分析
6.小结
本章介绍了关于攻击Android设备Linux内核的一些主题。由于采用单内核设计和分发配置方式,并且暴露了较大的攻击面,所以Android内核漏洞利用相对简单。
除此之外,本章还给Android内核利用程序开发者提供了一些工具和建议,让利用开发变得更加简单。本章涵盖编译自定义内核和模块的整个过程,展示了如何使用内核提供的各种调试工具,以及如何从设备和原厂固件镜像中提取信息。
本章的几个安全教你如何针对内核内存破坏漏洞才晓得利用程序开发。这些漏洞包括数组越界、直接内存映射、信息泄露和堆破坏等。
十一、攻击RIL无线接口层
1.RIL层简介
Android中的RIL是移动通信硬件接口与Android电话服务子系统之间的一个抽象层。它支持2g、3g、4g等所有类型的移动网络,处理移动通信中所有具体的业务,包括网络注册、语音通话、短信(SMS)、分组数据(IP通信)等。
RIL是Android中极少数可以直接从外界接触到的代码之一。它的攻击面类似于服务器上部署的网络服务,从移动网络发送到Android设备的所有数据都会经过设备中的RIL。最好的例子就是短信接收处理过程。
当短信发送至Android手机时,会由手机中的蜂窝调制解调器接收。蜂窝调制解调器从基站接收物理数据并解码,然后将解码后的消息传给Linux内核。这条消息会经过Android RIL的各个组件,最终抵达负责短信收发的应用程序。
RIL架构、智能手机架构、Android电话栈、对电话栈的定制、RIL守护程序、用于vendor-ril的API
2.短信服务
SMS消息的收发、SMS消息格式
3.与调制解调器的进行交互
模拟调制解调器用于模糊测试、在Android中对SMS进行模糊测试
4.小结
本章介绍了许多关于Android电话栈的知识,尤其是RIL。我们简单了解了RIL的功能以及硬件制造商将蜂窝通信硬件与Android框架相集成的必要工作,并进一步探索了如何监控Android RIL与蜂窝调制解调器之间的通信。
本章后半部分讲述了如何对Android设备的SMS消息子系统进行模糊测试,其中包含关于SMS消息格式的知识,以及如何构建SMS消息的模糊生成器。本章还介绍了如何使用ADB来监控Android电话栈的崩溃情况。有了这些知识,就可以开始对Android的RIL子系统进行自己的攻击实验了。
十二、漏洞利用缓解技术
1.缓解技术的分类
2.代码签名
代码签名是一种通过难密码学签名来防止未授权代码运行的机制。
3.加固堆缓冲区
4.防止整数溢出
5.阻止数据执行
6.地址空间布局随机化
7.保护栈
8.保护格式化字符串
9.只读重定位表
10.沙盒
11.增强源代码
12.访问控制机制
13.保护内核
14.其他加固措施
15.漏洞利用缓解技术总结
16.禁用缓解机制
更改personality、修改二进制文件、调整内核
17.对抗缓解技术
对抗栈保护、对抗ASLR、对抗数据执行保护、对抗内核级保护机制
18.展望未来
进行中的官方项目、社区的内核加固工作、一些预测
19.小结
本章介绍了漏洞利用缓解技术的概念以及在Android系统上的使用方法,然后解释了实现这些缓解技术需要改动硬件、Linux内核、Bionic C库、编译工具链等组件。对于每种缓解技术,都介绍了其背景情况、实现效果以及Android采用的历史。还给出了一个总结表格,详细列举了Android支持这些缓解技术的历史发展。接下来,介绍了如何有意禁用这些利用缓解机制,以及如何进行对抗。最后,对Android上漏洞缓解技术的未来作出了展望。
十三、硬件层的攻击
1.设备的硬件接口
UART串行接口、I²C、SPI和单总线接口、JTAG、寻找调试接口
2.识别组件
获得规格说明书、难以识别的组件
3.拦截、监听和劫持数据
USB、I²C、SPI和UART
4.窃取机密和固件
无损地获取固件、有损地获取固件、拿到dump文件后怎么做、
5.陷阱
定制的接口、二进制私有数据格式、熔断调试接口、芯片密码、bootloader密码和热键和哑终端、已定制的引导过程、未暴露的地址线、防止逆向的环氧树脂、镜像加密和混淆和反调试
6.小结
本章旨在带领没有任何相关经验的读者了解如何通过物理访问来攻击Android设备这样的嵌入式硬件。我们介绍了嵌入式设备中经常暴露出来的各类接口,包括UART、JTAG、I²C、SPI、USB和SD卡。接下来,介绍了如何识别这些接口并与其进行通信。通过这些接口,研究人员可以对目标设备有更深的理解。
对硬件进行物理攻击的一个主要目标是进一步发现、设计和实现不需要物理接触的攻击。我们介绍了如何借助一系列商业工具和免费工具,通过访问这些接口来读取设备中的固件。对固件进行逆向和深入分析可以了解设备的工作运转原理,进而有可能找出其中存在的严重漏洞。
最后,讨论了在实践中使用这些工具和技术可能遇到的各类陷阱,以及其中一些问题的应对之道。
附录A 工具
开发工具:Android SDK、Android NDK、Eclipse、ADT插件、ADT软件包、Android Studio
固件提取和刷机工具:Binwalk、fastboot、三星(ODIN、Kies、Heimdall)、NVIDIA(nvflash)、LG(LGBinExtractor、LG Mobile Support工具)、HTC(unruu、runveal)、摩托罗拉(RSD Lite、sbf_flash、SBF-ReCalc)
Android原生工具:BusyBox、setpropex、SQLite、strace
Hook和代码改写工具:ADBI框架、Idpreloadhook、Xposed框架、Cydia Substrate
静态分析工具:Smali和Baksmali、Androguard、apktool、dex2jar、jad、JD-GUI、JEB、Radare2、IDA Pro和Hex-Rays Decompiler
应用程序测试工具:Drozer(Mercury)框架、iSec Intent Sniffer和Intent Fuzzer
硬件安全工具:Segger J-Link、JTAGulator、OpenOCD、Saleae、Bus Pirate、GoodFET、Total Phase Beagle USB、Facedancer21、Total Phase Beagle I²C、Chip Quik、热风枪、Xeltek SuperPro、IDA
附录B 开源代码库
谷歌:AOSP、Gerrit源代码审计
SoC厂商:全志、英特尔、美满、联发科、英伟达、德州仪器、高通、三星
OEM:华硕、HTC、LG、摩托罗拉、三星、索尼
上游代码源
其他源代码:定制化固件、Linaro、Replicant、代码索引、个人代码库