安卓取证学习指南-一-

167 阅读1小时+

安卓取证学习指南(一)

原文:annas-archive.org/md5/e5389ef3843690d1ee144f281791135b

译者:飞龙

协议:CC BY-NC-SA 4.0

序言

许多取证检查员依赖于商业的、一键式工具来检索和分析数据,尽管没有任何工具能够完美完成这两项任务。

学习 Android 取证 将向你介绍最新的 Android 平台及其架构,并提供 Android 取证概述。你将了解 Android 设备如何存储数据,并学习如何设置数字取证环境。在你阅读各章节时,将学习各种物理和逻辑技术,从设备中提取数据以获取取证证据。你还将学习如何恢复已删除的数据,并借助各种开源和商业工具进行应用数据的取证分析。在最后几章中,你将探索恶意软件分析,以便能够调查涉及 Android 恶意软件的网络安全事件。

到本书结束时,你将完全理解 Android 取证流程,探索开源取证工具,并调查移动网络安全事件。

本书的目标读者

如果你是取证分析师或信息安全专业人员,想要提升你对 Android 取证的知识,那么这本书适合你。期望你具备一些 Android 移动平台的基础知识。

如何最大化阅读此书的收益

本书涵盖了 Android 设备上的各种取证方法和技术。内容组织方式使任何用户都可以检查 Android 设备并进行取证调查。不需要任何先决知识。

因为所有主题都已解释,从基础到深入。对移动平台,特别是 Android 的了解,绝对会是一个优势。只要可能,使用工具执行各种取证活动所需的步骤都被详细说明。

下载彩色图片

我们还提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图示的彩色图像。你可以在此下载:www.packtpub.com/sites/default/files/downloads/9781789131017_ColorImages.pdf

使用的约定

本书中使用了许多文本约定。

CodeInText:表示文本中的代码词、数据库表名、文件夹名称、文件名、文件扩展名、路径名、虚拟网址、用户输入和 Twitter 用户名。这里有一个例子:“启动恢复模式不会解密/data分区。”

一段代码如下所示:

from subprocess import Popen
from os import getcwd
command = "adb pull /data/data " + getcwd() + "\data_from_device"
p = Popen(command)
p.communicate()

当我们希望引起你对代码块中特定部分的注意时,相关的行或项会用粗体显示:

from subprocess import Popen
from os import getcwd
command = "adb pull /data/data " + getcwd() + "\data_from_device"
p = Popen(command)
p.communicate()

任何命令行输入或输出都如下所示:

j7xelte:/ # cat /proc/filesystems

粗体:表示新术语、重要单词或在屏幕上看到的单词。例如,菜单或对话框中的单词在文本中会像这样显示。这里有一个例子:“从主恢复界面,选择挂载。”

警告或重要提示如下所示。

提示和技巧如下所示。

联系我们

我们始终欢迎读者的反馈。

一般反馈:如果您对本书的任何内容有疑问,请在邮件主题中注明书名,并通过customercare@packtpub.com与我们联系。

勘误:尽管我们已尽力确保内容的准确性,但错误难免。如果您发现本书中的错误,我们将不胜感激,恳请您报告给我们。请访问www.packt.com/submit-erra…,选择您的书籍,点击“勘误提交表格”链接,并填写相关详情。

盗版:如果您在互联网上发现我们作品的任何非法复制品,敬请提供其位置或网站名称。请通过copyright@packt.com与我们联系,并附上该材料的链接。

如果您有兴趣成为作者:如果您在某个领域拥有专业知识,并且有兴趣写书或为书籍做贡献,请访问authors.packtpub.com

书评

请留下评论。阅读并使用本书后,为什么不在您购买书籍的网站上留下评论呢?潜在读者可以看到并参考您的客观评价来做出购买决策,我们 Packt 公司可以了解您对我们产品的看法,而我们的作者也能看到您对其书籍的反馈。谢谢!

欲了解更多关于 Packt 的信息,请访问packt.com

第一章:介绍 Android 取证

移动取证是数字取证的一个分支,正在当今的数字时代不断发展,并随着新手机的发布和操作系统的更新而不断变化。Android 取证涉及通过各种技术提取、恢复和分析 Android 设备上的数据。由于 Android 操作系统的开放性,这些取证技术和方法不仅适用于手机,还可以应用于更多设备:冰箱、汽车娱乐系统、电视、手表等许多设备都运行 Android 系统。

在我们深入了解如何提取数据之前,清晰理解平台及其他基础知识非常重要。本章将涵盖以下内容:

  • 移动取证

  • 移动取证方法

  • 移动取证中的挑战

  • Android 架构

  • Android 安全

  • Android 硬件组件

  • Android 启动过程

当今世界正经历着前所未有的技术创新,这种增长在移动设备领域几乎呈指数级增长。科技研究和咨询公司 Gartner 在 2018 年 1 月发布的预测中估计,2017 年全球手机出货量为 22.8 亿部,预计 2018 年将增加到 23.2 亿部。仅这一统计数据就反映了移动设备前所未有的增长。手机不仅数量增加,而且在功能上也变得更加复杂。从 1997 年到 2018 年,手机用户数量的增长显著。

你可能不需要被告知,智能手机已成为移动电话中越来越大的一个子集。这些设备在计算能力和数据存储方面的改进,使我们能够执行各种活动,并且我们越来越依赖这些移动设备。除了执行日常任务,如打电话、发短信等,这些设备还支持其他活动,如发送电子邮件、浏览互联网、录制视频、创建和存储文档、通过全球定位系统GPS)服务识别位置,以及管理业务任务。换句话说,移动设备现在已经成为敏感个人信息的存储库。

设备中的数据往往比设备本身更有价值。假设有一起涉及嫌疑恐怖分子智能手机的案件;如果执法机关能够访问嫌疑人发送或接收的每一条联系人、电话、短信或电子邮件,这将有多么有用?或者,更好的是,能够访问手机曾经所在的每一个位置?虽然大部分数据通常可以通过服务提供商获取,但这往往需要额外的搜查令或传票,而且可能需要相当长的时间。此外,考虑到第三方应用程序;例如,WhatsApp 聊天内容是端到端加密的,任何数量的传票都无法从 Facebook 恢复这些数据。本书将向你展示如何恢复一些数据,比如 WhatsApp 聊天内容,这些数据通过其他方法可能无法恢复。移动取证在解决 2010 年时代广场汽车炸弹袭击未遂事件和波士顿马拉松爆炸案等案件中发挥了关键作用,进一步证明了移动取证在许多案件解决中的日益重要性。

移动取证

移动设备取证是数字取证的一个分支,专门处理在取证环境下从移动设备中提取、恢复和分析数字证据或数据。简而言之,它涉及访问存储在设备上的数据,包括短信、联系人、通话记录、照片、视频、文档、应用程序文件、浏览历史等,并使用各种取证技术恢复设备中已删除的数据。如果证据必须在法庭上作为证据使用,那么恢复或访问设备详细信息的过程必须符合取证规范,以保持证据的完整性。如果证据需要在法庭上使用,重要的是只处理镜像文件,而不是原始设备本身。

取证规范这一术语常用于数字取证领域,用以澄清某一特定取证技术或方法的正确使用。由于 Android 设备在市场上占据 85%的份额(根据市场研究公司 IDC 的数据显示),移动取证,特别是 Android 取证,正在快速发展。

正如 Eoghan Casey 在他的书《数字取证与调查》中所解释的,取证的准确性不仅仅是保持原始证据不被更改。即使是使用硬件写入阻止器从硬盘驱动器获取数据的常规操作,也可能会导致硬盘上的更改(例如,使隐藏区域变得可访问)。取证准确性的关键之一是文档记录。从一开始就记录设备的处理方式非常重要。因此,如果获取过程能够保持原始数据,并且能够验证其真实性和完整性,那么调查就可以被认为是取证上有效的。证据完整性检查确保证据自收集以来没有被篡改。通过将收集时的证据数字指纹与当前状态下的证据数字指纹进行比较来进行完整性检查。

由于以下一些原因,移动取证的需求正在不断增长:

  • 移动电话存储个人信息的使用

  • 移动电话在执行在线活动中的使用增多

  • 移动电话在多种犯罪中的使用

对特定设备的移动取证主要依赖于底层操作系统。因此,我们有不同的领域,如 Android 取证、iOS 取证等。

移动设备取证方法

一旦从设备中提取数据,根据案件的不同背景,使用不同的分析方法。由于每项调查都有其独特性,因此不可能为所有案件制定一个统一的确切程序。然而,整体过程可以分为五个阶段,如下图所示:

以下部分将详细讨论每个阶段。

调查准备

这一阶段从接收到检查请求时开始。它包括准备所有必要的文书和表格,以记录证据链、所有权信息、设备型号、目的、请求方所寻求的信息等。证据链指的是按时间顺序记录的文件或纸质档案,展示了物理或电子证据的扣押、保管、控制、转移、分析和处置。根据请求方提交的细节,重要的是要清楚地了解每项检查的目标。

扣押和隔离

扣押设备时的处理是执行取证分析中的一个重要步骤。证据通常通过防静电袋运输,这些袋子旨在保护电子元件免受静电损坏。设备一旦被扣押,必须小心确保我们的操作不会导致设备上的数据修改。同时,也不应错过任何有助于调查的机会。以下是处理安卓设备时需要注意的几点:

  • 随着用户对安全性和隐私的关注不断增加,现在大多数设备默认启用屏幕锁定。在扣押期间,如果有机会(例如,手机恢复解锁状态),请禁用密码。一些设备在禁用锁屏选项时,不要求用户重新输入密码。

  • 如果设备已解锁,尝试更改设备设置以允许更大的访问权限。以下是一些可以考虑的设置,以实现这一目标:

    • 启用 USB 调试:启用此选项将通过安卓调试桥ADB)连接为设备提供更大的访问权限。我们将在第二章《设置安卓取证环境》中详细介绍 ADB。这将大大帮助取证调查人员在数据提取过程中。在安卓设备中,这个选项通常可以在设置 | 开发者选项下找到,如下图所示。从安卓 4.2 开始,新的安卓版本默认隐藏开发者选项。要启用它们,请转到设置 | 关于手机(或在安卓 8.0 及更高版本中选择设置 | 系统 | 关于手机),然后点击“版本号”七次。

    • 启用保持唤醒设置:启用此选项并在充电时将使设备保持唤醒状态;换句话说,它不会被锁定。在安卓设备中,这个选项通常可以在设置 | 开发者选项下找到,如下图所示:

    • 增加屏幕超时:这是设备解锁后保持活动状态的时间。根据设备型号,这个时间最长可以设置为 30 分钟。在大多数设备中,可以通过设置 | 显示 | 屏幕超时进行访问。

请注意,访问这些选项的位置会因安卓手机的不同版本和型号而有所不同,某些版本可能没有该选项。

在移动取证中,保护被扣押设备至关重要,以确保我们与证据的互动(或者说攻击者试图远程与设备互动)不会改变证据内容。在计算机取证中,我们可以使用软件和硬件写保护器来执行此功能。但在移动取证中,由于我们需要与设备互动以提取数据,这些写保护器并不起作用。另一个重要方面是,我们还需要防止设备与无线电网络互动。如前所述,攻击者很可能会发出远程擦除命令,删除设备上的所有数据,包括电子邮件、应用程序、照片、联系人和其他文件。

Android 设备管理器和其他一些第三方应用程序允许远程擦除或锁定手机。这可以通过登录配置在手机上的 Google 账户来完成。使用这些软件,攻击者还可以定位设备,这可能带来安全风险。出于这些原因,将设备与所有通信源隔离非常重要。

你有没有考虑过不通过互联网进行远程擦除的选项?移动设备管理MDM)软件,企业常用来管理公司设备,可以通过发送短信来提供远程擦除功能。将设备与所有通信选项隔离是至关重要的。

要将设备与网络隔离,如果我们能够访问该设备,可以将设备设置为飞行模式。飞行模式会禁用设备的无线传输功能,如蜂窝网络、Wi-Fi 和蓝牙。然而,由于现在飞机上也提供 Wi-Fi,一些设备在飞行模式下也允许连接 Wi-Fi。以下截图显示了通过从锁屏下拉顶部菜单栏访问的快速设置:

请注意,这些切换选项是可定制的,并且可能并非所有设备都能使用;有些设备可能还需要解锁设备才能进行这些更改。

另一种解决方案是使用法拉第袋或 RF 隔离盒,它们都能有效地屏蔽手机信号的收发。这些隔离方法的一个问题是,一旦使用了它们,手机的触摸屏或键盘无法正常使用,因为你无法透过隔离设备查看手机。为了解决这个问题,存在法拉第帐篷和房间,如下图所示:

即使采取了所有这些预防措施,某些自动功能,如闹钟,仍然可能会触发。如果遇到这种情况,必须正确记录。

获取阶段

获取阶段指的是从设备中提取数据。由于移动设备固有的安全特性,提取数据并不总是简单直接的。提取方法主要取决于操作系统、品牌和型号。以下是可以用于从设备中提取数据的获取方法类型:

  • 手动获取是所有获取方法中最简单的一种。检查员使用手机的用户界面浏览和调查。这里不需要特殊的工具或技术,但其限制在于只能提取通过正常用户界面可见的文件和数据。通过其他方法提取的数据也可以通过这种方式进行验证。需要注意的是,这种选项非常容易修改设备上的数据(例如,打开未读的短信将其标记为已读),因此这些更改应尽可能详细地记录。

  • 逻辑获取,也称为逻辑提取,通常指的是提取存在于逻辑存储中的文件,如文件系统分区。这包括从手机中获取如短信、通话历史记录和图片等数据类型。逻辑提取技术通过使用原始设备制造商的应用程序编程接口API)来同步手机内容与计算机。这种技术通常涉及提取以下证据:

    • 通话记录

    • 短信

    • 多媒体短信

    • 浏览器历史记录

    • 人物

    • 联系方式

    • 联系人扩展

    • 联系人组

    • 联系人电话

    • 联系人设置

    • 外部图像媒体(元数据)

    • 外部图像缩略图媒体(元数据)

    • 外部媒体、音频及杂项(元数据)

    • 外部视频(元数据)

    • 多媒体短信部分(包括通过 MMS 发送的完整图像)

    • 位置详情(GPS 数据)

    • 网络活动

    • 组织

    • 所有已安装应用及其版本列表

    • 社交网络应用数据,如 WhatsApp、Skype 和 Facebook

  • 文件系统获取是一个逻辑过程,通常指从移动设备中提取完整的文件系统。文件系统获取有时可以帮助恢复从设备中删除的内容(存储在 SQLite 文件中)。

  • 物理获取涉及对整个闪存存储设备进行逐位复制,相当于对硬盘的完整镜像。通过此方法提取的数据通常是原始数据(以十六进制转储的形式),然后可以进一步解析以获取文件系统信息或可读数据。由于所有调查工作都是在此镜像上进行的,这一过程也确保了原始证据未被更改。

检查和分析

在此阶段,使用不同的软件工具从内存映像中提取数据。除了工具外,调查员可能还需要十六进制编辑器的帮助,因为工具并不总是能提取所有数据。没有单一工具能够在所有情况下使用。因此,检查和分析需要对各种文件系统、文件头等有扎实的知识。

报告

在整个过程中应进行考试文档记录,记录下每个阶段所做的工作。以下是检查员可能记录的一些要点:

  • 考试开始的日期和时间

  • 手机的物理状况

  • 收到手机时的状态(开/关)

  • 手机的品牌、型号和操作系统

  • 手机及其各个组件的图片

  • 调查过程中使用的工具(包括版本号)

  • 在检查过程中记录的数据

从移动设备提取的数据应清晰地呈现给接收方,以便能够导入到其他软件中进行进一步分析。在民事或刑事案件中,尽可能地收集手机上存在的数据的图片,因为这些图片对陪审团来说具有视觉冲击力。

移动取证中的挑战

随着 Android 设备的使用增加以及它们支持的通信平台种类的扩展,对取证检查的需求自然也增加了。在与移动设备合作时,取证分析员面临着许多挑战。以下几点揭示了今天面临的一些移动取证挑战

  • 防止设备上的数据篡改:法医学中的一个基本规则是保留原始证据。换句话说,应用于设备上的法医技术提取任何信息时,不应改变设备上现有的数据。然而,在移动设备法医学中,这通常并不实际,因为仅仅开启设备也可能会改变设备上的某些状态变量。在移动设备中,后台进程始终在运行,从一种状态到另一种状态的突然过渡可能会导致数据的丢失或修改。因此,数据可能会被法医分析师故意或无意地篡改。除此之外,攻击者(或用户)有很大可能性能够远程更改或删除设备的内容。由于移动电话使用不同的通信通道(如蜂窝网络、Wi-Fi、蓝牙、红外等),应该消除通过这些通道进行通信的可能性。像远程数据擦除这样的功能使得攻击者能够通过发送短信或仅仅按下一个按钮来向 Android 设备发送擦除请求,从而远程擦除整个设备。与计算机法医学不同,移动设备法医学不仅仅是将设备与网络隔离,手机在检查期间不能总是保持关闭状态

  • 操作系统和设备型号的广泛性:市场上可用的各种移动操作系统使得法医分析师的工作更加困难。虽然 Android 是移动世界中最主流的操作系统,但仍有一些设备运行其他操作系统,包括 iOS、Blackberry 和 Windows,这些设备在调查中经常遇到。此外,对于给定的操作系统,有成千上万的移动设备可用,它们在操作系统版本、硬件以及其他各种特性上有所不同。根据制造商的不同,获取法医证据的方法也会有所变化。为了保持竞争力,制造商快速发布新型号和更新,难以追踪所有设备。有时,即使是同一操作系统中,数据存储选项和文件结构也会发生变化,这让工作变得更加困难。目前没有任何单一工具能够适用于所有类型的移动操作系统。因此,法医分析师必须保持对最新变化和技术的更新,并理解本书中的基本概念,以便在工具失效时仍能成功。

  • 固有的安全特性:随着隐私概念日益重要,手机制造商正朝着在设备上实施强大安全控制的方向发展,这使得获取设备数据的过程更加复杂。例如,如果设备设置了密码保护,法医调查员必须首先找到绕过密码的方法。同样,许多现代设备上实施的全盘加密机制阻止了执法机构和法医分析人员访问设备上的信息。苹果的 iPhone 默认使用内置硬件密钥加密设备上的所有数据。从 Android Nougat 开始,Android 默认强制全盘加密(尽管如果操作系统被制造商修改,可能会有所不同)。在 2017 年 Google I/O 大会上,Google 宣布 80%的 Android 7.0 Nougat 设备已加密,70%的设备使用了安全锁屏。随着越来越多的制造商在初始设置过程中强制加密,这些数字可能会继续增长。对于检查员来说,使用暴力破解等技术打破这些加密机制是非常困难的。

  • 法律问题:移动设备可能涉及跨越全球的犯罪,并可能跨越地理边界。为了应对这些跨司法管辖区的问题,法医检查员需要了解犯罪的性质和区域法律。

Android 架构

在我们深入研究 Android 法医之前,本节将向您介绍 Android 作为操作系统,并介绍一些必须理解的基本概念,这些概念是获得法医经验所必需的。

任何操作系统(桌面或手机)都负责管理系统资源,并为应用程序提供与硬件或物理组件进行交互的方式,以完成某些任务。Android 操作系统也不例外。它为手机提供动力,管理内存和进程,执行安全性,处理网络问题等等。Android 是开源的,大部分代码是根据 Apache 2.0 许可证发布的。实际上,这意味着手机设备制造商可以访问它,免费修改它,并根据任何设备的需求使用该软件。这是其普及的主要原因之一。

Android 操作系统由一层层叠加运行的层组成。要最好地理解 Android 架构,需要了解这些层是什么以及它们的作用。以下屏幕截图(由developer.android.com提供)展示了 Android 软件堆栈中涉及的各个层:

Android 架构以软件栈的形式存在,包括内核、库、运行时环境、应用程序、中间件和服务。栈的每一层以及每一层中的元素,都是以一种最佳的方式集成在一起,为移动设备提供最佳的执行环境。接下来的章节将重点介绍 Android 软件栈中的不同层,从底层的 Linux 内核开始。

Linux 内核

Android 操作系统建立在 Linux 内核之上,并由 Google 做了一些架构上的改动。选择 Linux 是因为它是一个便于移植的平台,能够在不同硬件上轻松编译。Linux 内核位于软件栈的最底层,为设备硬件和上层之间提供了一个抽象层。它还充当了软件与设备硬件之间的抽象层。为了更好地理解这一点,考虑一下拍照的过程。当你按下手机上的摄像头按钮拍照时,实际发生了什么?在某个时刻,硬件指令(按下按钮)必须转换为软件指令(拍照并将照片存储到相册中)。内核包含的驱动程序可以帮助实现这一过程。当摄像头按钮点击被检测到时,指令会发送到内核中相应的驱动程序,该驱动程序向摄像头硬件发送必要的命令,类似于按下键盘上的某个键。简单来说,内核中的驱动程序控制着底层硬件。正如之前截图所示,内核包含与 Wi-Fi、蓝牙、USB、音频、显示等相关的驱动程序。

Android 的所有核心功能,如进程管理、内存管理、安全性和网络连接,都是由 Linux 内核管理的。Linux 是一个经过验证的、安全性和进程管理都非常可靠的平台。Android 利用了现有的 Linux 开源操作系统,为其生态系统构建了一个坚实的基础。每个版本的 Android 都有不同版本的底层 Linux 内核。目前,Google 要求运行 Android 8.0 Oreo 操作系统的设备至少要搭载 Linux 内核 4.4 版本。

硬件抽象层

硬件抽象层(HAL)允许更高层次的 Java API 框架通过标准接口与移动设备的硬件进行交互。这得益于多个库模块,它们为不同类型的硬件组件(如蓝牙或摄像头)提供接口。

Android 运行时

自 Android 5.0 起,每个应用程序都在自己的进程中运行,并且拥有独立的 Android 运行时(ART)实例。它通过执行 DEX(Dalvik 可执行文件)文件,使得在低内存设备上运行多个虚拟机成为可能。需要注意的是,在 5.0 版本之前,Dalvik 是 Android 运行时,因此为 Dalvik 开发的应用程序应该能在 ART 上正常运行。

原生 C/C++ 库

许多核心 Android 系统组件和服务,包括之前提到的 HAL 和 ART,都是由本地代码构建的,因此它们需要用 C 和 C++ 编写的本地库。

Java API 框架

Java API 框架允许开发者使用模块化的系统组件和服务作为构建块来创建应用程序:

  • 视图系统允许构建应用程序的用户界面,包括列表、网格、文本框、按钮等。

  • 资源管理器提供访问应用程序的非代码组件,如本地化字符串、图形和布局文件。

  • 通知管理器允许应用程序显示自定义警报。

  • 活动管理器管理应用程序的生命周期,以及它们的后退栈——即每个活动打开的顺序。

  • 内容提供者允许应用程序访问其他应用程序的数据,并共享自己的数据。

应用程序层

Android 堆栈中的最上层由应用程序(称为 应用)组成,这些是用户直接交互的程序。这里讨论了两种类型的应用程序:

  • 系统应用:这些是预装在手机上的应用程序,随手机一起出厂。像默认浏览器、电子邮件客户端和联系人等就是系统应用的例子。这些应用程序通常无法被用户卸载或更改,因为它们在生产设备上是只读的,尽管某些设备提供了禁用这些应用程序的功能。如果系统应用被禁用,应用程序及其所有数据仍然保留在设备的系统分区中,应用程序图标只是从用户界面中隐藏。这些应用程序通常可以在 /system 分区找到。在 Android 4.4 KitKat 之前,所有位于 /system 分区的应用程序都被视为平等。但从 Android 4.4 开始,安装在 /system/priv-app/ 下的应用程序被视为特权应用,并被授予带有保护级别 signatureOrSystem 的权限。

  • 用户安装的应用:这些是用户从各种分发平台(如 Google Play)下载并安装的应用程序。Google Play 是 Android 操作系统的官方应用商店,用户可以浏览和下载应用程序。根据 Statista 2017 年 12 月的统计数据,Google Play 商店中大约有 350 万款 Android 应用程序。这些应用程序位于 /data 分区。关于如何在它们之间执行安全性管理的更多信息将在接下来的章节中讨论。

Android 安全

Android 作为平台,其架构内置了某些功能,确保用户、应用程序和数据的安全性。尽管这些安全功能有助于保护数据,但有时它们会阻止调查人员访问必要的数据。从取证的角度来看,首先要了解内在的安全特性,以便清楚地了解在正常情况下可以访问哪些数据,哪些不能访问。所内置的安全功能和服务旨在实现三项目标:

  • 保护用户数据

  • 保护系统资源

  • 确保一个应用程序无法访问另一个应用程序的数据

下一节将概述 Android 操作系统中的关键安全功能。

通过 Linux 内核在操作系统级别确保安全

Android 操作系统建立在 Linux 内核之上。在过去几十年中,Linux 已经发展成为一个安全的操作系统,全球许多企业信任其安全性。通过将 Linux 内核作为平台的核心,Android 试图确保操作系统级别的安全性。此外,Android 在 Linux 中内建了大量与移动环境相关的特定代码。随着每次 Android 发布,内核版本也随之变化。下表显示了 Android 版本及其相应的 Linux 内核版本:

Android 版本Linux 内核版本
1.02.6.25
1.52.6.27
1.62.6.29
2.22.6.32
2.32.6.35
3.02.6.36
4.03.0.1
4.13.0.31
4.23.4.0
4.33.4.39
4.43.8
5.03.16.1
6.03.18.10
7.04.4.1
7.14.4.1
8.04.10
9.04.4.107, 4.9.84, 和 4.14.42

Linux 内核为 Android 提供以下关键安全特性:

  • 基于用户的权限模型

  • 进程隔离

  • 可扩展的安全 IPC 机制

权限模型

Android 为单独的应用程序实现了权限模型。应用程序必须在清单文件中声明它们需要哪些权限。在 Android 的早期版本中,用户在安装之前会看到应用程序请求的完整权限列表。

Android 的新版本在每次应用程序需要权限时,都会提示用户。这种模型允许用户在不授予应用程序所要求的所有权限的情况下使用该应用,尽管功能可能会减少。

Android 中的示例权限模型

与桌面环境不同,这为用户提供了提前了解应用程序请求访问的资源的机会。换句话说,必须获得用户许可才能访问设备上的任何关键资源。通过查看请求的权限,用户能够更清楚地意识到安装应用程序时所涉及的风险。

如前所述,开发者需要在名为AndroidManifest.xml的文件中识别权限。例如,如果应用需要访问互联网,则需要在AndroidManifest.xml文件中使用以下代码指定INTERNET权限:

<manifest 
package="com.example.rohit">
…
<uses-permission android:name="android.permission.INTERNET" />
…
</manifest>

Android 权限分为四个等级:

权限类型描述
普通权限这是默认值。此类权限属于低风险权限,不会对其他应用、系统或用户构成风险。此权限会在安装时自动授予用户,无需用户批准。
危险权限这些权限可能会对系统和其他应用造成危害,因此在安装过程中需要用户授权。
签名权限如果请求的应用与声明/创建此权限的应用使用相同证书签名,则此权限会自动授予该应用。此级别旨在允许一组应用或相关应用共享数据。
签名/系统权限只有 Android 系统镜像中的应用或与声明此权限的应用使用相同证书签名的应用,才能获得系统授予的此类权限。

应用沙箱机制

为了将应用相互隔离,Android 利用了 Linux 基于用户的保护模型。在 Linux 系统中,每个用户都有一个唯一的用户 IDUID),并且用户之间是隔离的,一个用户不能访问另一个用户的数据。特定用户下的所有资源都在相同权限下运行。同样,每个 Android 应用都分配有一个 UID,并以独立进程的方式运行。这意味着,即使已安装的应用尝试做一些恶意行为,它也只能在其自身的上下文中进行,并且只能在它拥有的权限范围内进行。这种应用沙箱机制是在内核层面实现的。应用与系统之间在进程级别的安全性是通过标准的 Linux 设施(如分配给应用的用户和组 ID)来确保的。例如,以下截图来自www.ibm.com/developerworks/library/x-androidsecurity/展示了沙箱机制:

默认情况下,应用程序不能读取或访问其他应用程序的数据,并且对操作系统的访问权限受到限制。例如,如果应用程序 A 尝试读取应用程序 B 的数据,操作系统会对此进行保护,因为应用程序 A 没有适当的用户权限。由于应用程序沙箱机制是在内核级别实现的,它适用于本地应用程序和操作系统应用程序。因此,操作系统库、应用程序框架、应用程序运行时以及所有应用程序都在应用程序沙箱内运行。绕过此沙箱机制将需要破坏 Linux 内核的安全性。

Android 中的 SELinux

从 Android 4.3 开始,增强安全 LinuxSELinux)已被 Android 安全模型所支持。Android 安全基于自主访问控制,这意味着应用程序可以请求权限,用户可以授予或拒绝这些权限。因此,恶意软件通过获得权限可以对手机造成破坏。Android 使用 SELinux 强制实施强制访问控制,确保应用程序在隔离的环境中运行;这包括作为 root 或超级用户运行的应用程序。因此,即使用户安装了恶意应用,恶意软件也无法轻易访问操作系统并破坏设备。SELinux 用于在所有进程上强制实施强制访问控制MAC),包括那些具有 root 权限的进程。SELinux 的运作原则是 默认拒绝。任何没有明确允许的操作都会被拒绝。SELinux 可以在两种全局模式下运行:宽容模式,在该模式下,权限拒绝会被记录,但不会强制执行;和强制模式,在该模式下,拒绝操作会被记录并强制执行。根据 Google 的文档,在 Android 5.0 Lollipop 版本中,Android 实现了对 SELinux 的全面强制执行。这是在 4.3 版本的宽容发布和 4.4 版本的部分强制执行基础上的进一步改进。简而言之,Android 正在从仅限于几个关键领域(installdnetdvoldzygote)的强制执行,转向对所有领域(超过 60 个领域)的全面强制执行。

应用程序签名

所有 Android 应用在安装到设备上之前都需要使用证书进行数字签名。使用证书的主要目的是识别应用的作者。这些证书不需要由证书授权机构签发,Android 应用通常使用自签名证书。应用开发者持有证书的私钥。开发者可以使用相同的私钥为应用程序提供更新,并在应用之间共享数据。在调试模式下,开发者可以使用 Android SDK 工具生成的调试证书为应用签名。你可以运行和调试以调试模式签名的应用,但该应用不能分发。要分发应用,应用需要使用你自己的证书进行签名。在此过程中使用的密钥库和私钥需要由开发者加以保护,因为它们对推送更新至关重要。以下截图显示了导出应用时显示的密钥库选择选项:

安全的进程间通信

如前所述,应用程序的沙盒机制是通过在不同的进程中以不同的 Linux 身份运行应用程序来实现的。系统服务在单独的进程中运行,并具有更多的权限。因此,为了组织这些进程之间的数据和信号,需要一个进程间通信IPC)框架。在 Android 中,这是通过使用 Binder 机制来实现的。

Android 中的 Binder 框架提供了组织各种进程间通信所需的能力。Android 应用组件,如 Intents 和内容提供者,也都是建立在这个 Binder 框架之上的。通过使用这个框架,可以执行多种操作,如调用远程对象的方法,就像它们是本地的一样,支持同步和异步方法调用,以及在进程间传递文件描述符。假设进程 A 中的应用程序想要使用运行在进程 B 中的 Service 暴露的某些行为。在这种情况下,进程 A 是客户端,进程 B 是服务。使用 Binder 的通信模型如下图所示:

Binder 通信模型

使用 Binder 框架的所有进程间通信都通过 Linux 内核驱动程序/dev/binder进行。对该设备驱动程序的权限设置为可供所有用户读取和写入,这意味着任何应用程序都可以读写该设备驱动程序。客户端和服务器之间的所有通信都通过客户端侧的代理和服务器侧的存根进行。代理和存根负责发送和接收通过 Binder 驱动程序发送的数据和命令。

每个通过 Binder 机制暴露的服务(也称为 Binder 服务)都会分配一个令牌。这个令牌是一个 32 位的值,在系统中所有进程中都是唯一的。客户端可以在发现这个值后开始与服务进行交互,这可以通过 Binder 的上下文管理器来实现。基本上,上下文管理器充当一个命名服务,使用服务的名称提供服务的句柄。为了使这个过程正常工作,每个服务必须向上下文管理器注册。因此,客户端只需要知道服务的名称即可进行通信。

名称由上下文管理器解析,客户端接收到令牌,该令牌随后用于与服务进行通信。Binder 驱动程序将发送方进程的 UID 和 PID 值添加到每个事务中。如前所述,系统中的每个应用程序都有自己的 UID,因此该值用于标识调用方。接收方可以检查获得的值,并决定是否完成该事务。因此,安全性得到了保障,Binder 令牌充当了安全令牌,因为它在所有进程中都是唯一的。

Android 硬件组件

Android 与多种硬件组件兼容。Linux 内核使这一切变得简单,因为 Linux 支持各种各样的硬件。这为制造商提供了很大的灵活性,因为他们可以根据自己的需求进行设计,而不必担心兼容性问题。这对法医分析师在调查过程中提出了重大挑战。因此,了解硬件组件和设备类型将大大有助于理解 Android 法医分析。

核心组件

设备中存在的组件因制造商和型号的不同而有所变化。然而,有一些组件在大多数移动设备中都有出现。以下章节提供了 Android 设备中常见组件的概述。

中央处理单元(CPU)

CPU,也称为处理器,负责执行手机上发生的所有操作。它告诉设备该做什么以及如何做。它的性能通过每秒可以完成的任务数量来衡量,这称为 周期。例如,一个 1 GHz 的处理器每秒可以处理十亿个周期。处理器的容量越大,手机的性能就会越流畅。在智能手机中,我们会遇到以下术语:ARM、x86(Intel)、MIPS、Cortex,以及 A5、A7 或 A9。ARM 是一家公司,授权其架构(品牌为 Cortex),每年推出不同的型号,如前面提到的 A 系列。基于这些架构,芯片制造商发布了自己的芯片系列(如 Snapdragon、Exynos 等),这些芯片被用于移动设备。较新的智能手机采用双核、四核甚至八核处理器。

基带处理器

现代智能手机支持多种移动通信协议,包括 GSM、3G、4G 和 LTE。这些协议非常复杂,需要大量的 CPU 计算能力来处理数据、生成数据包,并将其传输到网络提供商。为了处理这一过程,智能手机现在使用基带调制解调器,这是一种与主处理器通信的独立芯片。这些基带调制解调器拥有自己的处理器,称为基带处理器,并运行自己的操作系统。基带处理器管理多个无线控制功能,如信号生成、调制、编码以及频率偏移。它还可以管理信号的传输。

基带处理器通常位于与 CPU 相同的电路板上,但由一个独立的无线组件组成。

内存

安卓手机和普通计算机一样,使用两种主要的内存类型:RAM 和 ROM。尽管大多数用户对这些概念很熟悉,但在移动设备上,仍然存在一些混淆。

RAM 是随机存取存储器(Random Access Memory)的缩写。它是易失性的,意味着断电后内容会被删除。RAM 访问速度非常快,主要用于软件应用程序的运行时内存(包括设备的操作系统和所有应用程序)。换句话说,它被系统用来加载和执行操作系统及其他应用程序。可以同时运行的应用程序和进程的数量取决于 RAM 的大小。

ROM(通常被称为安卓 ROM)是只读存储器(Read-Only Memory)的缩写。它是非易失性的,这意味着即使断电,内容也会被保留。安卓 ROM 包含启动加载程序、操作系统、所有下载的应用程序及其数据、设置等。

注意,启动加载程序和安卓系统使用的那部分内存通常是锁定的,只有通过固件升级才能更改。其余部分的内存被一些厂商称为用户内存。这里存储的每个应用程序的数据不会被其他应用程序访问。一旦这部分内存被填满,设备的运行速度就会变慢。RAM 和安卓 ROM 通常被制造成一个单独的组件,称为多芯片封装MCP)。

SD 卡

SD 卡在手机取证中具有重要意义,因为它上存储的数据常常是关键证据,即使设备被锁定或加密,也能访问。许多安卓设备具有可拆卸的存储卡,通常被称为安全数字SD)卡。与此不同,苹果的 iPhone 没有 SD 卡的插槽。SD 卡是非易失性的,这意味着即使它们断电,数据仍然保存在其中。SD 卡使用闪存,这是一种电可擦可编程只读存储器EEPROM),它以大块而非单个字节的方式进行擦写。大多数多媒体数据和大文件由应用程序存储在 SD 卡中。为了与其他设备互操作,SD 卡实现了特定的通信协议和规范。

在一些手机中,尽管存在 SD 卡接口,但部分机载 NAND 内存(非易失性)被划分出来,用于创建一个模拟的 SD 卡。这实际上意味着 SD 卡是不可拆卸的。因此,法医分析师需要检查他们处理的是实际的 SD 卡还是模拟的 SD 卡。SD 内存卡有几种不同的尺寸。迷你 SD 卡和微型 SD 卡与原始 SD 内存卡使用相同的技术,但尺寸更小。

显示屏

近年来,手机屏幕发展迅速。以下是一些常见手机屏幕类型的简要描述。

  • TFT LCD代表薄膜晶体管液晶显示屏,这是手机中最常见的屏幕类型。这些屏幕下面有一盏灯,透过像素使其可见。

  • AMOLED代表主动矩阵有机发光二极管;这是一种基于有机化合物的技术,以其优异的图像质量和低功耗而闻名。与 LCD 屏幕不同,AMOLED 显示器不需要背光—每个像素都会发光—因此使用 AMOLED 的手机可能更薄。

这些内容可以在www.in.techradar.com/news/phone-and-communications/mobile-phones/Best-phone-screen-display-tech-explained/articleshow/38997644.cms上找到。

电池

电池是手机的命脉,也是现代智能手机用户最关心的因素之一。你使用设备及其组件的频率越高,电池消耗的速度就越快。以下是手机中使用的不同类型的电池:

  • 锂离子Li-Ion)电池是手机中最常用的电池,因为它们轻便易携带,且以高能量密度和低维护著称。然而,与其他类型的电池相比,它们的制造成本较高。

  • 锂聚合物Li-Poly)电池具有锂离子电池的所有特性,但具有超薄几何形状和简化的包装。它们是最新技术,只在少数移动设备中出现。

  • 镍镉NiCd)电池是旧技术电池,且会受到记忆效应的影响。因此,电池的整体容量和使用寿命都会降低。此外,镍镉电池由有毒材料制成,对环境不友好。

  • 镍氢NiMH)电池与镍镉电池相似,但可以容纳更高的能量,并且可以运行 30%到 40%更长的时间。它们仍然会受到记忆效应的影响,但相比于镍镉NiCd)电池要少得多。它们广泛应用于手机,并且价格实惠。

电池类型可以通过查看其外壳上的详细信息来识别。

通常,SD 卡位于电池后面。在取证分析过程中,访问 SD 卡可能需要拆卸电池,这将关闭设备电源。这可能会产生一些后果,后续章节将详细讨论。

除了之前描述的组件外,以下是一些其他知名组件:

  • 全球定位系统GPS

  • Wi-Fi

  • 近场通信NFC

  • 蓝牙

  • 摄像头

  • 按键盘

  • USB

  • 加速度计和陀螺仪

  • 扬声器

  • 麦克风

Android 启动过程

了解 Android 设备的启动过程有助于我们理解涉及在不同层面与设备交互的其他取证技术。当 Android 设备首次开机时,会执行一系列步骤,帮助设备将必要的固件、操作系统、应用数据等加载到内存中。以下信息来自原文发布于community.nxp.com/docs/DOC-102546

以下是 Android 启动过程中涉及的步骤顺序:

  1. 启动 ROM 代码执行

  2. 启动加载程序

  3. Linux 内核

  4. 初始化过程

  5. Zygote 和 Dalvik

  6. 系统服务器

我们将详细研究每个步骤。

启动 ROM 代码执行

在设备开机之前,设备的 CPU 处于未进行任何初始化的状态。一旦 Android 设备开机,执行将从启动 ROM 代码开始。此启动 ROM 代码是特定于设备所用 CPU 的。如下图所示,此阶段包括 A 和 B 两个步骤:

  • 步骤 A:当启动 ROM 代码执行时,它会初始化设备硬件并尝试检测启动媒体。因此,启动 ROM 代码会一直扫描,直到找到启动媒体。这与计算机启动过程中的 BIOS 功能几乎相同。

  • 步骤 B:一旦启动序列建立,初始引导加载程序会被复制到内部 RAM 中。此后,执行权转移到加载到 RAM 中的代码:

引导加载程序

引导加载程序是一个在操作系统开始工作之前执行的小程序。引导加载程序存在于台式电脑、笔记本电脑和移动设备中。在 Android 引导加载程序中,有两个阶段——初始程序加载IPL)和第二程序加载SPL)。如下面的截图所示,这涉及到这里解释的三个步骤:

  • 步骤 A:IPL 负责检测和设置外部 RAM。

  • 步骤 B:一旦外部 RAM 可用,SPL 会被复制到 RAM 中,并且执行权转移到它。SPL 负责加载 Android 操作系统。它还提供访问其他引导模式的功能,如 fastboot 和 recovery。它会初始化多个硬件组件,如控制台、显示器、键盘、文件系统、虚拟内存和其他功能。

  • 步骤 C:SPL 会尝试查找 Linux 内核。它会从引导媒体中加载该内核,并将其复制到 RAM 中。一旦引导加载程序完成这个过程,它将把执行权转移给内核:

Linux 内核

Linux 内核是 Android 操作系统的核心,负责进程管理、内存管理以及在设备上执行安全性控制。内核加载后,它会挂载根文件系统rootfs),并提供对系统和用户数据的访问:

  • 步骤 A:当内存管理单元和缓存初始化完成后,系统可以使用虚拟内存并启动用户空间进程。

  • 步骤 B:内核将在 rootfs 中查找 init 进程,并将其作为初始用户空间进程启动:

Init 进程

Init 是第一个启动的进程,是所有其他进程的根进程:

  • 步骤 A:Init 过程会寻找一个名为 init.rc 的脚本。这个脚本描述了系统服务、文件系统以及需要设置的其他参数:

    • init 进程可以在以下位置找到:<android source>/system/core/init

    • init.rc 可以在以下位置找到:<android source>/system/core/rootdir/init.rc

更多关于 Android 文件层次结构的详细内容将在第三章中讨论,理解 Android 设备上的数据存储

  • 步骤 B:Init 进程会解析 init 脚本并启动系统服务进程。在此阶段,你将在设备屏幕上看到 Android 标志:

Zygote 和 Dalvik

Zygote 是设备启动后创建的第一个初始化进程之一。它初始化 Dalvik 虚拟机,并尝试创建多个实例来支持每个 Android 进程。如前面章节所讨论,Dalvik 虚拟机是执行用 Java 编写的 Android 应用程序的虚拟机。

Zygote 通过在虚拟机中共享代码来实现,因此帮助节省内存并减轻系统负担。之后,应用程序可以通过请求新的 Dalvik 虚拟机来运行。Zygote 为 zygote 连接注册一个服务器套接字,并预加载某些类和资源。这个 zygote 加载过程已在 elinux.org/Android_Zygote_Startup 中更清晰地解释:

  • Load ZygoteInitclass:加载 ZygoteInit 类。源代码:`<Android Source> /frameworks/base/core/java/com/android/internal/os/ZygoteInit.java`

  • registerZygoteSocket():此方法为 zygote 命令连接注册一个服务器套接字。

  • preloadClasses():这是一个简单的文本文件,包含需要预加载的类列表,该文件将在此执行。该文件可以在以下位置找到:<Android Source>/frameworks/base

  • preloadResources():此方法处理本地主题和布局,并加载所有包含 android.R 文件的内容:

系统服务器

设备的所有核心功能,如电话功能、网络功能以及其他重要功能,都是由系统服务器启动的,如下图所示:

以下是该过程中启动的一些核心服务:

  • 启动电源管理器

  • 创建活动管理器

  • 启动电话注册表

  • 启动包管理器

  • 将活动管理器服务设置为系统进程

  • 启动上下文管理器

  • 启动系统上下文提供者

  • 启动电池服务

  • 启动警报管理器

  • 启动传感器服务

  • 启动窗口管理器

  • 启动蓝牙服务

  • 启动挂载服务

系统发送一个广播动作,称为 ACTION_BOOT_COMPLETED,告知所有依赖进程启动过程已完成。之后,设备会显示主屏幕,并准备好与用户交互。

如前所述,多个厂商在其设备上使用 Android 操作系统。这些设备厂商大多数会根据其硬件和其他需求定制操作系统。当 Android 发布新版本时,这些设备厂商必须将其自定义软件和调整移植到最新版本。

总结

理解 Android 架构和安全模型对于正确理解 Android 取证至关重要。Android 操作系统中固有的安全功能,如应用程序沙箱和权限模型,能够保护设备免受各种威胁,同时也成为取证专家在调查过程中面临的障碍。掌握了 Android 内部结构的知识后,我们将在下一章讨论设备上存储了哪些数据,以及这些数据是如何存储的。

第二章:设置 Android 取证环境

在开始取证检查之前,您需要一台工作站。取证分析师需要时刻完全掌控他们的工作站。本章将带您了解建立用于检查 Android 设备的取证环境所需的一切。以下主题将在本章中讨论:

  • Android 取证设置

  • Android 调试桥

  • Rooting Android

Android 取证设置

在开始任何调查之前,建立一个健全且受控的取证环境至关重要。首先使用一台全新且取证无污染的计算机。取证无污染的计算机是指能够防止交叉污染并且不引入不必要数据的计算机。这是为了确保计算机上的软件不会干扰当前的调查。安装一些基本软件,如下所列,它们是连接设备和进行分析所必需的:

  • Android SDK

  • 移动设备驱动程序

  • 办公软件包

  • 用于分析的工具

Android SDK

我们需要从 Android Studio 和 Android SDK 开始讨论。Android Studio 是一个功能齐全的 集成开发环境IDE),包含从头开始构建完整应用所需的所有工具。Android 软件开发工具包SDK)是 Android Studio 的一个子集,只包括通过命令行与设备通信所需的工具。它包括软件库、API、模拟器、参考资料以及许多其他工具,这些工具不仅有助于创建 Android 应用,还提供了有助于 Android 设备取证分析的文档和实用程序。对 Android SDK 有充分的了解,可以帮助您理解设备的特性,从而在调查过程中提供帮助。

在检查过程中,SDK 帮助我们连接到设备并访问数据。SDK 支持 Windows、Linux 和 OS X,可以从 developer.android.com/studio 免费下载。

本书仅需要 SDK。它可以在前面链接的 仅命令行工具 部分找到。

安装 Android SDK

以下是在 Windows 10 机器上安装 Android SDK 的逐步过程:

  1. 在开始安装 Android SDK 之前,确保系统已安装最新的Java 开发工具包JDK),因为 Android SDK 依赖于 Java SE 开发工具包。可以从www.oracle.com/technetwork/java/javase/downloads/index.html下载 JDK。根据您的操作系统选择正确的下载版本。

  2. developer.android.com/studio/#command-tools 下载最新版本的 SDK 工具包。

  3. 解压你刚刚下载的压缩包到你选择的位置。就是这样:你已经准备好开始使用了。

从法医角度来看,让我们看看 SDK 工具中最有趣的部分:

  • apkanalyzer:这个工具允许你快速有效地检查 APK 文件的内容。例如,你可以收集有关应用程序 ID、版本号和版本名称的信息,并分析其清单文件、其中的 DEX 文件以及资源(如文本、图片和字符串)。你可以在 \sdk\tools\bin 目录下找到它。

  • avdmanager:这个工具允许你通过命令行创建和管理Android 虚拟设备AVDs)。这些 AVD 可以帮助你进行恶意软件分析,或者如果你没有物理 Android 设备,但想研究不同的应用程序以及新的法医证据,也可以使用它。你可以在 \sdk\tools\bin 目录下找到它。

  • emulator:这是一个基于 QEMU 的设备仿真工具,允许你在实际的 Android 运行时环境中调试和测试应用程序,包括恶意应用。你可以在 \sdk\emulator 目录下找到它。

  • sdkmanager:这个工具帮助你保持 SDK 工具的更新。通过这个工具,你可以查看、安装、更新和卸载软件包。你可以在 \sdk\tools\bin 目录下找到它。

  • adb 或 Android 调试桥:这是一个命令行工具,允许你与设备进行通信。它不仅可以用来安装应用或从设备中复制数据,还可以为法医检查员提供一个 Unix shell。你可以在 \sdk\platform-tools 目录下找到它。

  • fastboot:这个工具允许你为设备刷入不同的系统镜像。例如,它可以用来刷入自定义的恢复镜像——你将在本章后面了解它们。你可以在 \sdk\platform-tools 目录下找到它。

需要注意的是,所谓的 SDK 平台工具默认并不包含在 SDK 工具中,你需要安装它;以下是安装方法:

sdkmanager.bat "platform-tools"

如果你认为不需要所有 SDK 工具,只想使用平台工具,你可以从 Android 开发者网站获取它:developer.android.com/studio/releases/platform-tools。你只需要将下载的压缩包解压到你选择的目录,就可以开始使用这些工具了。

Android 虚拟设备

安装了 Android SDK 后,你可以创建一个 AVD,这是一个在工作站上运行的模拟器。开发者通常在创建新应用时使用模拟器。然而,模拟器在法医调查中也被认为是有用的,因为它可以帮助调查员了解某些应用的行为,以及理解应用的安装如何影响设备。另一个优点是,你可以设计一个带有所需版本的模拟器。这对于处理运行较旧版本 Android 的设备尤其有帮助。而且,AVD 默认带有 root 权限。

以下步骤将指导你如何在工作站上创建 AVD:

  1. 确保在 \sdk 目录下有 emulator 子目录;如果没有,运行以下命令来安装它:sdkmanager.bat "emulator"

  2. 我们需要一个虚拟设备的系统镜像,例如 system-images;android-28;google_apis;x86;你可以通过以下方式下载它:sdkmanager.bat "system-images;android-28;google_apis;x86"

  3. 现在我们可以使用 avdmanager 创建 AVD:avdmanager.bat create avd -k "system-images;android-28;google_apis;x86" -n test。正如你可能已经猜到的,k 选项让你选择系统镜像,而 n 选项让你为 AVD 选择名称。

  4. 现在是时候启动它了!使用 emulator.exe 来启动:emulator.exe -avd test。以下是 AVD 启动成功后的屏幕截图:

运行 Android 9(Pie)的 Android 虚拟设备(AVD)

模拟器可用于配置电子邮件帐户、安装应用程序、浏览互联网、发送短信等。法医分析师和安全工程师可以通过利用模拟器,检查网络、文件系统和数据工件,了解关于 Android 及其操作的很多信息。在模拟器上工作的过程中创建的数据会存储在你的主目录下,名为.android的文件夹中。例如,在我们的示例中,我们之前创建的测试 AVD 的详细信息存储在 C:\Users\0136\.android\avd\test.avd 中。该目录下有几个文件,以下是一些对于法医分析师有用的文件:

  • cache.img:这是/cache分区的磁盘镜像。

  • sdcard.img:这是 SD 卡分区的磁盘镜像。

  • Userdata-qemu.img:这是/data分区的磁盘镜像。/data分区包含有关设备用户的重要信息。

  • config.ini:此文件包含所使用的系统镜像信息。

  • hardware-qemu.ini:此文件包含模拟器的硬件选项,如架构、RAM 大小和屏幕类型。

连接和访问 Android 设备从工作站

为了从 Android 设备中提取信息,首先需要将其连接到工作站。如前所述,必须确保工作站是法医上干净的,并且仅用于调查目的。法医上干净的工作站指的是具有正确配置并且没有恶意软件的工作站。因此,如果你熟悉虚拟机和快照,使用虚拟机可能是进行移动取证(尤其是 Android 取证)的一个好主意,因为你每次需要检查新设备时,都可以拥有一个完全干净的工作站。

当设备连接到计算机时,可以对设备进行更改,因此法医检查员必须始终保持对设备的控制。在移动设备取证领域,使用写保护机制可能帮助不大,因为它们会阻止成功获取设备数据。这是因为在获取数据时,某些命令需要推送到设备上以提取必要的数据。而且,有时甚至需要安装小型应用程序来提取更多数据,或者例如为设备获取 root 权限。

确认正确的设备数据线

安卓设备可以通过设备的物理 USB 接口与工作站连接。这个物理 USB 接口允许设备与计算机连接、共享数据并进行充电。USB 接口的类型可能因制造商而异,也因设备而异。常见的类型有 micro-USB、USB-C 和一些不太流行的专有格式。以下是最广泛使用的连接器类型的简要描述:

连接器类型描述
Micro-USB它的大小约为 6 x 1.5 毫米,两个角被切割成梯形。
USB-C它的大小为 8.4 x 2.6 毫米,呈矩形带圆角的形状。

因此,获取数据的第一步是确定需要什么类型的设备数据线。

安装设备驱动程序

移动设备只有在计算机上安装了必要的设备驱动程序后才能与计算机进行通信。如果没有必要的驱动程序,计算机可能无法识别和与连接的设备配合使用。由于安卓系统允许制造商进行修改和定制,所以没有一个通用的驱动程序能够适用于所有安卓设备。每个制造商都有自己的专有驱动程序,并与手机一同分发。因此,确定需要安装的特定设备驱动程序非常重要。当然,一些安卓取证工具包会附带一些通用驱动程序或最常用的驱动程序集合,但它们可能无法与所有型号的安卓手机兼容。某些 Windows 操作系统能够在设备插入后自动检测并安装驱动程序,但往往失败。每个制造商的设备驱动程序可以在其官方网站上找到。

访问设备

安装必要的设备驱动程序后,使用 USB 数据线将安卓设备直接连接到计算机以进行访问。使用原厂专用数据线非常重要,因为通用数据线可能与某些设备不兼容,且调查人员可能会遇到驱动程序相关的问题。有些设备可能不兼容 USB 3.0,这可能导致驱动程序安装失败。在这种情况下,建议尝试切换到 USB 2.0 端口。一旦设备连接,它会显示为一个新驱动器,你可以访问外部存储中的文件。某些旧款安卓设备可能无法访问,除非在设备的“设置 | USB 实用工具”中启用“连接存储到 PC”选项。

在这种情况下,连接设备通过 USB 后,需要选择“开启 USB 存储”选项,如下图所示:

USB 大容量存储连接

这是因为旧款安卓设备需要 USB 大容量存储模式来在计算机和设备之间传输文件。最新的安卓设备使用 MTP 或 PTP 协议,因为 USB 大容量存储协议存在一些问题。使用 USB 大容量存储时,驱动器会完全向计算机开放,就像它是一个内部驱动器一样。但问题在于,访问存储的设备需要对其进行独占访问。换句话说,当设备驱动器连接到计算机时,必须与设备上的安卓操作系统断开连接才能正常工作。因此,当设备连接到计算机时,存储在 SD 卡或 USB 存储中的文件或应用程序将无法使用。在媒体传输协议MTP)中,安卓设备不会将其整个存储暴露给 Windows。相反,当你将设备连接到计算机时,计算机会查询设备,设备会响应一个它提供的文件和目录列表。如果计算机需要下载某个文件,它会向设备发送请求,设备将通过连接发送该文件。图片传输协议PTP)也与 MTP 类似,通常由数码相机使用。在这种模式下,安卓设备将与支持 PTP 但不支持 MTP 的数码相机应用程序一起工作。在最新设备上,你可以在“设置 | 存储 | USB 计算机连接”下选择 MTP 或 PTP 选项。

在某些安卓设备上,只有在将设备连接到计算机后,才会提供选择 MTP 和 PTP 协议的选项。连接设备后,观察屏幕顶部的通知栏,你会看到 USB 图标出现。下拉通知栏,你将找到一个可以在 MTP 和 PTP 之间切换的选项。

如下图所示,MTP 和 PTP 选项仅在连接设备到计算机并下拉通知栏后才会显示:

更改 Android 设备上的 USB 连接模式

默认选择是充电。当选择文件传输选项时,它将被挂载为磁盘驱动器。当设备作为磁盘驱动器挂载时,您将能够访问设备上的 SD 卡。

从法医学的角度看,SD 卡具有重要的价值,因为它可能包含对调查重要的文件。大多数与多媒体相关的图像和大文件存储在这种外部存储器中。SD 卡通常使用 FAT32 文件系统格式化,但您可能也会遇到一些使用 exFAT 和其他文件系统的情况。正如在第一章中讨论的介绍 Android 取证,请注意,大多数最新的设备具有模拟 SD 卡功能,使用设备的 NAND 闪存创建一个非可移动的 SD 卡。因此,可以通过这种方式访问外部存储器上存在的所有敏感文件。但是,存储在/data/data下的核心应用数据将保留在设备上,不能通过这种方式访问。

Android 调试桥

在 Android 取证中,Android 调试桥ADB)起着非常关键的作用。它位于<sdk_path>/platform-tools位置。要使用 ADB,需要启用 USB 调试选项。在大多数 Android 手机和平板电脑上,您可以在设置 | 开发者选项下找到它,如下图所示:

USB 调试选项

然而,并非所有设备都是如此,因为不同的设备有不同的环境和配置功能。有时,检查人员可能需要使用某些技术来访问一些设备上的开发者选项。这些技术是特定于设备的,需要由法庭分析师根据设备类型和型号进行研究和确定。

在一些设备上,开发者选项菜单是隐藏的,可以通过点击生成号码字段(位于设置 | 系统 | 关于手机下)七次来启用。

一旦选择 USB 调试选项,设备将在后台运行 ADB 守护进程(adbd),并持续寻找 USB 连接。该守护进程通常在非特权 shell 用户账户下运行,因此无法访问内部应用数据。但在已 root 的手机上,adbd将在根账户下运行,因此可以访问所有数据。在安装了 Android SDK 的工作站上,adbd将作为后台进程运行。此外,在同一工作站上,将运行一个客户端程序,可以通过发出adb命令来调用该程序,我们将在以下部分看到。当启动 ADB 客户端时,它首先检查是否已运行 ADB 守护进程。如果没有,则启动一个新进程来启动 ADB 守护进程。守护进程通过它们的本地主机在55555585端口上进行通信。偶数端口用于与设备的控制台通信,而奇数端口用于 ADB 连接。ADB 客户端程序通过5037端口与本地的adbd通信。

使用 ADB 访问设备

正如前面所述,ADB 是一个强大的工具,允许您与 Android 设备通信。现在我们将看看如何使用 ADB 访问设备的某些无法正常访问的部分。重要的是要注意,通过 ADB 收集数据可能会根据各国法律而被接受或不被接受作为证据。以下部分列出了一些常用的 ADB 命令及其在逻辑顺序中的含义和用法。

检测连接的设备

将设备连接到工作站后,在发出其他 ADB 命令之前,了解 Android 设备是否正确连接到 ADB 服务器是很有帮助的。这可以通过 ADB devices 命令完成,该命令列出所有连接到计算机的设备,如下面的命令行所示。如果模拟器在发出命令时正在运行,则还会列出模拟器:

adb devices
List of devices attached
52037762b835835b     device

请记住,如果未安装必要的驱动程序,则上述命令将显示空白消息。如果遇到这种情况,请从制造商处下载必要的驱动程序并安装它们。

如前面的命令行所示,输出包含设备的序列号,后跟连接状态。序列号是 ADB 用于识别每台 Android 设备的唯一字符串。可能的连接状态值及其含义在以下行中解释:

  • 离线: 实例未连接到 ADB 或未响应。

  • 设备: 实例已连接到 ADB 服务器。

  • 无设备: 没有连接的设备。

  • 未授权: USB 调试未授权。

将命令定向到特定设备

如果系统连接了多个设备,则在发出命令时必须指定目标设备。例如,考虑以下情况:

adb devices
List of devices attached
4df16ac5115e4e04       device
7f1c864544456o6e        device

如前面的命令行输出所示,工作站上连接了两台设备。在这种情况下,adb 需要与 –s 选项一起使用,以向你选择的设备发出命令:

adb shell -s 4df16ac5115e4e04

类似地,d 开关可用于将 adb 命令定向到唯一连接的 USB 设备,e 开关可用于将 adb 命令定向到唯一运行的模拟器实例。

发出 shell 命令

如第一章中所述,Android 取证简介,Android 运行在 Linux 内核上,因此提供了访问 shell 的方式。使用 adb,你可以访问一个 shell 来在 Android 设备上运行多个命令。对于不熟悉 Linux 环境的人来说,Linux shell 是一个特殊程序,允许你通过键盘输入特定命令与其交互;shell 会执行这些命令并显示其输出。有关 Linux 环境下的工作原理的更多细节,请参见本章中的 Rooting Android device 部分。

adb shell 命令可用于进入远程 shell,如以下命令行输出所示。进入 shell 后,你可以执行大多数 Linux 命令:

adb shell
shell@android:/ $

执行命令后,用户会看到 shell 提示符,可以在设备上执行命令。例如,如以下命令行所示,ls 命令可用于查看目录中的所有文件:

shell@android:/ $ ls
acct
adb_keys
bin
bugreports
cache
charger
config
d
data
default.prop
dev
etc
...

以下部分将解释一些在与 Android 设备交互时非常有用的 Linux 命令。

基本 Linux 命令

接下来我们将查看一些与 Android 设备相关的 Linux 命令及其用法:

  • lsls 命令(无选项)列出当前目录中存在的文件和目录。使用 l 开关时,此命令显示文件和目录的大小、修改日期和时间、文件所有者及其权限等,如以下命令行输出所示:
shell@android:/ $ ls -l
dr-xr-xr-x 64 root root 0 2018-09-16 13:21 acct
 -rw-r--r-- 1 root root 724 2018-07-31 17:54 adb_keys
 lrw-r--r-- 1 root root 11 2018-07-31 18:13 bin -> /system/bin
 lrw-r--r-- 1 root root 50 2018-07-31 18:13 bugreports -> /data/user_de/0/com.android.shell/files/bugreports
 drwxrwx--- 2 system cache 4096 2018-07-31 17:54 cache
 lrw-r--r-- 1 root root 13 2018-07-31 18:13 charger -> /sbin/charger
 drwxr-xr-x 4 root root 0 2018-09-16 13:21 config
 lrw-r--r-- 1 root root 17 2018-07-31 18:13 d -> /sys/kernel/debug
 drwxrwx--x 39 system system 4096 2018-09-16 13:21 data
 lrw------- 1 root root 23 2018-07-31 18:13 default.prop -> system/etc/prop.default
 drwxr-xr-x 15 root root 2580 2018-09-16 13:21 dev
 lrw-r--r-- 1 root root 11 2018-07-31 18:13 etc -> /system/etc
...

类似地,以下是一些可以与 ls 命令一起使用的选项:

选项描述
a列出隐藏文件
c按时间戳显示文件
d仅显示目录
n显示长格式列表,包含 GID 和 UID 数字
R还显示子目录
t按时间戳显示文件
u显示文件访问时间

根据需求,调查人员可以使用一个或多个这些选项来查看详细信息。

  • catcat 命令读取一个或多个文件,并将其输出到标准输出,如以下命令行所示:
shell@android:/ $ cat adb_keys
QAAAADeVcId5z+6WTzB5Qtyj4RMBmP3IsbHsiLC2Q8EpmIRDAHywZ45jjUENg+2NF4TUnXlBAU0LyycR/ER7/EZBUjTaLE09gWJuMbZQ4RcwFjM9nnhHquctYFNB4MzobWNDeZxdYXaDEqzycEij50ae3zZ3H5F7eVSoCvwaulOWf3oxwxaeWQsDBNt0EX0yqznfxO2GIPQhwzOdtYQsAxJye16OaazCHCsXLwMNcuZLDYpH37em71S/mUfz8hwDrDlnN0CqnpQcvXW6Q0dE1RdkJZP+FCmbYCMautkEJR5vx70Xrfv1PE+2rXzXw582h8i8Ctq8V567l7DDRLaoyO4FtST4Lw/toV3KgTcVmHo7FHhhuml5ZNUwAMtBxkw8sDOTaoU9o5LjcPZdxK+0Iik/XFFZz2IxlNxQsmn9zErA7mJghkEjuZ2L4ZxPPB38HuCiCBXjTNecX2S4QPeOTVSq+VTHi9tHwN+9fKcYIwhczMg7JSNIxHDVOlLudjwzISSmWfp2/0i9J8nUHHH8jmXOe+bHv6QvFvzUl/8wtyV+prS5EcJ6sAqoCqu1Xr+9FdKqmjyNyYK3K6fZTkAetjLFuTJat/lkqUfiIL1B3chQyRP09mEk8EklWpugo0chec17ZL3Vv0CPPJIy/2rTITZDj7MKwdZi7kEAo6Rgcg/ypAESuHlMWQEAAQA= android-eng@google
  • > 操作符可用于将多个文件合并为一个文件。>> 操作符可用于向现有文件追加内容。

  • cdcd命令用于从一个目录切换到另一个目录。在从一个文件夹导航到另一个文件夹时,这个命令非常常用。以下示例展示了用于切换到系统文件夹的命令:

shell@android:/ $ cd /data
shell@android:/data $
  • cpcp命令可用于将文件从一个位置复制到另一个位置。此命令的语法如下:
$ cp [options] <source> <destination>

以下是此命令的主要选项:

选项描述
s创建一个symlink函数,而不是复制
l创建一个硬链接,而不是复制
R递归复制子目录中的文件
p保留时间戳、所有权和模式
  • chmodchmod命令用于更改文件系统对象(文件和目录)的访问权限。它还可以更改特殊的模式标志。此命令的语法如下:
$ chmod [option] mode files

例如,chmod 777给文件赋予所有人读、写和执行的权限。

  • dddd命令用于复制文件,并根据操作数进行转换和格式化。在 Android 中,dd命令可以用于创建 Android 设备的逐位映像。有关映像的更多详细信息,请参阅第四章,从 Android 设备逻辑提取数据。以下是与此命令一起使用的语法:
$ dd if=/test/file of=/sdcard/sample.image
  • rmrm命令可用于删除文件或目录。以下是此命令的语法:
$ rm file_name
  • grepgrep命令用于在文件或输出中搜索特定模式。以下示例展示了如何在default.prop文件中搜索secure
shell@android:/ # cat default.prop | grep secure
ro.secure=1
  • pwdpwd命令显示当前的工作目录。例如,以下命令行输出显示当前的工作目录是/data
shell@android:/data $ pwd
/data
  • mkdirmkdir命令用于创建一个新目录。以下是此命令的语法:
$ mkdir [options] directory

使用p开关,您还可以在需要时创建父目录。

  • exitexit命令用于退出当前的 shell。只需在 shell 中输入exit即可退出。

安装应用程序

在取证分析过程中,可能会有需要在设备上安装一些应用程序以提取数据的情况。为此,可以使用adb install命令。与此命令一起,如以下命令行输出所示,需要指定要安装的.apk文件的路径:

adb install C:\test.apk
Success

然而,重要的是要注意,安装第三方应用程序在法律上可能不被接受。因此,取证调查员在安装任何第三方应用程序之前需要谨慎。

从设备提取数据

您可以使用adb pull命令将 Android 设备上的文件拉取到本地工作站。以下是使用此命令的语法:

adb pull <remote> <local>

<remote> 指的是文件在 Android 设备上的路径,而 <local> 指的是本地工作站上需要存储该文件的位置。例如,以下命令行输出显示了一个 Sample.png 文件从 Android 设备被拉取到计算机上的 temp 文件夹:

adb.exe pull /sdcard/Pictures/MyFolder/Sample.png C:\temp
[100%] /sdcard/Pictures/MyFolder/Sample.png

然而,在普通的安卓手机上,由于操作系统强制实施的固有安全特性,您无法使用 adb pull 命令下载所有文件。例如,在未获得 root 权限的 Android 设备上,无法以这种方式访问 /data/data 文件夹中的文件。关于这个话题的更多细节已经在 第四章 从 Android 设备逻辑提取数据 中进行了解释。

将数据推送到设备

您可以使用 adb push 命令将文件从本地工作站复制到 Android 设备。以下是使用此命令的语法:

adb push <local> <remote>

<local> 指的是文件在本地工作站上的位置,而 <remote> 指的是 Android 设备上需要存储该文件的路径。例如,以下命令行输出显示了 filetest.pngcopied 从计算机复制到 Android 设备的 Pictures 文件夹:

adb push C:\temp\test.png /sdcard/Pictures
[100%] /sdcard/Pictures/test.png

您只能将文件推送到用户帐户具有权限的那些文件夹。

重新启动 ADB 服务器

在某些情况下,您可能需要终止 ADB 服务器进程并重新启动它。例如,如果 adb 对某个命令没有响应,您可以终止服务器并重新启动它,这可能解决问题。

要停止 ADB 服务器,请使用 kill-server 命令。然后,您可以通过执行其他任何 adb 命令来重新启动服务器。

恢复模式与 fastboot

在处理 root 过程之前,有必要先了解 Android 中的引导加载程序、恢复和 fastboot 模式。以下各节将详细解释这些内容。

恢复模式

一部安卓手机可以看作是一个包含三个主要分区的设备:引导加载程序、Android ROM 和恢复分区。引导加载程序位于第一个分区,并且是手机开机时运行的第一个程序。这个引导加载程序的主要工作是处理低级硬件初始化,并启动其他分区。默认情况下,它通常会加载被称为Android ROM的 Android 分区。Android ROM 包含所有必要的操作系统文件,以使设备能够运行。恢复分区,通常称为原厂恢复,是用于删除所有用户数据和文件,或者执行系统更新的分区。

这两个操作都可以从正在运行的 Android 系统启动,或者通过手动启动进入恢复模式。例如,当你在手机上执行恢复出厂设置时,恢复模式会启动并擦除文件和数据。同样,进行更新时,手机会启动进入恢复模式,以安装直接写入 Android ROM 分区的最新更新。因此,恢复模式是你在设备上安装任何官方更新时看到的屏幕。

进入恢复模式

恢复映像存储在恢复分区,并由硬件按钮控制的简单用户界面组成的 Linux 映像。可以通过两种方式访问恢复模式:

  • 在启动设备时按特定的按键组合(通常是启动时按住音量+、音量-和电源按钮)

  • 通过向已启动的 Android 系统发出adb reboot recovery命令

以下是 Android 设备上官方恢复模式的截图:

Android 官方恢复

Android 的官方恢复模式故意在功能上非常有限。它提供了重新启动系统、通过 ADB 和 SD 卡应用更新、恢复出厂设置等选项。然而,定制恢复提供了更多选项。

定制恢复

定制恢复是由第三方创建的恢复环境。它可以用来替换目标设备上的默认官方恢复环境,提供一个定制的恢复环境。以下是定制恢复中常见的功能列表:

  • 它提供完整的备份和恢复功能(如 NANDroid)。

  • 它允许未签名的更新包,或者允许使用自定义密钥的签名包。

  • 它会选择性地挂载设备分区和 SD 卡。

  • 它提供对 SD 卡或数据分区的 USB 大容量存储访问。

  • 它提供完整的 ADB 访问权限,且 ADB 守护进程以 root 身份运行。

  • 它包含一个功能齐全的 BusyBox 二进制文件。BusyBox 是一个将多个强大的命令行工具集合在一个单一二进制可执行文件中的工具。

市面上有多种定制恢复映像可供选择,如 ClockworkMod 恢复、TeamWin 恢复项目等。以下截图显示了TeamWin 恢复项目 (TWRP) 3.0.0.0的可用选项:

TWRP 恢复

查看日志数据

在 Android 中,logcat命令提供了一种查看系统调试输出的方法。来自各个应用程序和系统部分的日志被收集在一系列循环缓冲区中,然后可以使用此命令查看和过滤:

adb.exe logcat
--------- beginning of system
 09-17 10:04:52.463 2477 2477 I vold : Vold 3.0 (the awakening) firing up
 09-17 10:04:52.463 2477 2477 V vold : Detected support for: exfat ext4 f2fs ntfs vfat
 09-17 10:04:52.475 2477 2482 D vold : e4crypt_init_user0
 09-17 10:04:52.475 2477 2482 D vold : e4crypt_prepare_user_storage for volume null, user 0, serial 0, flags 1
 09-17 10:04:52.475 2477 2482 D vold : Preparing: /data/system/users/0
 09-17 10:04:52.476 2477 2482 D vold : Preparing: /data/misc/profiles/cur/0
 09-17 10:04:52.476 2477 2482 D vold : Preparing: /data/system_de/0
 09-17 10:04:52.477 2477 2482 D vold : Preparing: /data/misc_de/0
 09-17 10:04:52.477 2477 2482 D vold : Preparing: /data/user_de/0
 09-17 10:04:52.477 2477 2482 D vold : e4crypt_unlock_user_key 0 serial=0 token_present=0
 09-17 10:04:52.712 2477 2480 D vold : Disk at 7:64 changed
 09-17 10:04:52.933 2590 2590 I android.hardware.wifi@1.0-service: Wifi Hal is booting up...
 09-17 10:04:53.023 2619 2619 I installd: installd firing up
 09-17 10:04:53.166 2627 2627 I wificond: wificond is starting up...
 09-17 10:04:53.285 2626 2666 I /system/bin/storaged: storaged: Start
 09-17 10:04:55.120 2760 2760 I SystemServer: InitBeforeStartServices
 09-17 10:04:55.122 2760 2760 I SystemServer: Entered the Android system server!
 09-17 10:04:55.358 2760 2760 I SystemServer: StartServices
 09-17 10:04:55.358 2760 2760 I SystemServer: Reading configuration...
 09-17 10:04:55.358 2760 2760 I SystemServer: ReadingSystemConfig
 09-17 10:04:55.359 2760 2760 I SystemServer: StartInstaller
 09-17 10:04:55.360 2760 2760 I SystemServiceManager: Starting com.android.server.pm.Installer
 09-17 10:04:55.362 2760 2760 I SystemServer: DeviceIdentifiersPolicyService
 09-17 10:04:55.362 2760 2760 I SystemServiceManager: Starting com.android.server.os.DeviceIdentifiersPolicyService
 09-17 10:04:55.363 2760 2760 I SystemServer: StartActivityManager
 09-17 10:04:55.363 2760 2760 I SystemServiceManager: Starting com.android.server.am.ActivityManagerService$Lifecycle
 09-17 10:04:55.382 2760 2760 I ActivityManager: Memory class: 192
 09-17 10:04:55.406 2760 2760 D BatteryStatsImpl: Reading daily items from /data/system/batterystats-daily.xml
 09-17 10:04:55.421 2760 2777 E BatteryExternalStatsWorker: no controller energy info supplied for telephony
...

这里显示的日志信息只是示例消息,在调查过程中,日志需要仔细分析,以收集位置信息、日期/时间信息、应用程序详细信息等。每条日志以消息类型指示符开头,如下表所示:

消息类型描述
V详细信息
D调试
I信息
W警告
E错误
F致命
S静默

获取 Android Root 权限

获取 Root 权限是一个与 Android 设备相关的常见术语。作为一名取证专家,了解这一点至关重要。这将帮助你获得必要的知识,以理解设备的内部结构,并在调查过程中获得处理若干问题的专业知识。获取 Android 手机的 Root 权限已成为一种常见现象,取证过程中常常会遇到已 Root 的手机。此外,根据不同的情况和需要提取的数据,取证专家本身也可能需要对设备进行 Root 以提取某些数据。接下来的部分将详细介绍获取 Android 设备 Root 权限以及其他相关概念。

什么是获取 Root 权限?

要理解获取 Root 权限,首先必须了解类 Unix 系统的工作原理。原始的 Unix 操作系统是 Linux 和其他类 Unix 系统的基础,它从一开始就被设计为多用户系统。之所以这样设计,主要是因为个人电脑当时尚未普及,因此需要一种机制来隔离并保护各个用户的资源,同时允许他们同时使用系统。但为了执行一些特权任务,比如授予和撤销普通用户的权限,或者访问关键的系统文件来修复或升级系统,就需要一个具有超级用户权限的系统管理员账户。因此,我们有两种类型的账户:具有较少权限的普通用户账户和具有所有权限的超级用户或root 账户

因此,root 是指默认情况下具有对 Linux 或其他类 Unix 操作系统中所有命令和文件的访问权限的用户名或账户。它也被称为 root 账户、root 用户和超级用户。所以,在 Linux 中,root 用户有权限启动/停止任何系统服务、编辑/删除任何文件、更改其他用户的权限等。我们之前了解到 Android 使用的是 Linux 内核,因此 Linux 中的大多数概念也适用于 Android。然而,当你购买一部 Android 手机时,通常并不允许你以 root 用户身份登录。获取 Android 手机的 Root 权限就是通过获得该设备的 root 权限,执行通常不允许在设备上进行的操作。

还需要理解 rootingjailbreaking 之间的区别,因为两者常常被误认为是相同的。对运行 Apple iOS 操作系统的设备进行越狱,可以移除 Apple 设置的一些限制和限制。例如,Apple 不允许在设备上安装未签名的应用程序。因此,通过越狱,你可以安装未经 Apple 批准的应用程序。相反,Android 在功能上允许侧载应用程序。越狱手机涉及同时绕过多个安全限制。因此,获取设备的 root 权限只是越狱设备的一个方面。

为什么要 root?

很多人 root Android 设备的目标是克服运营商和硬件制造商对 Android 设备的限制。通过 root 一个 Android 设备,你可以修改或替换系统应用程序和设置,运行需要管理员权限的专用应用程序,或者执行普通 Android 用户无法访问的操作,例如卸载手机自带的默认应用程序(特别是那些预装的垃圾应用)。Rooting 也常用于极限定制;例如,可以下载并安装新的自定义 ROM。然而,从取证分析的角度来看,root 的主要原因是访问那些通常无法访问的系统部分。大多数公共 root 工具会导致永久性 root,所做的修改即使设备重启后也会持续存在。而在临时 root 中,一旦设备重启,所做的修改将丢失。在取证案件中,应该始终优先选择临时 root。

如第一章《介绍 Android 取证》所述,在 Linux 系统中,每个用户都会分配一个唯一的用户 IDUID),用户之间被隔离,以防一个用户访问另一个用户的数据。类似地,在 Android 中,每个应用程序都会分配一个 UID,并作为一个独立的进程运行。应用程序 UID 通常按照安装顺序分配,从 10001 开始。这些 ID 存储在 /data/system 目录下的 packages.xml 文件中。除了存储 UID 之外,该文件还存储了每个程序在其清单文件中描述的 Android 权限。每个应用程序的私有数据存储在 /data/data 位置,仅该应用程序可以访问。因此,在调查过程中,无法访问该位置下的数据。但通过获取 root 权限,可以访问任何位置的数据。需要注意的是,获取 root 权限会带来一些影响,具体如下:

  • 安全风险:root 手机可能会使设备暴露于安全风险之中。例如,想象一下一个恶意应用,它可以访问整个操作系统以及设备上所有其他应用程序的数据。

  • 变砖您的设备:如果 Root 操作不正确,可能会导致设备变砖。变砖是一个通常用于那些无法开机的手机的术语。

  • 取消保修:根据制造商和运营商的不同,对设备进行 Root 可能会取消您的保修,因为它会使设备面临多种威胁。

  • 取证影响:对 Android 设备进行 Root 可以让调查人员访问更多数据,但这涉及到对设备某些部分的更改。因此,只有在绝对必要时才应对设备进行 Root。

Fastboot 模式

Fastboot 是一种协议,可用于在设备上重新刷写分区。它是 Android SDK 随附的工具之一,是用于安装、更新和在某些情况下解锁启动加载器的替代方法。在 fastboot 模式下,您可以通过 USB 连接从计算机修改文件系统映像。因此,在某些情况下,这是安装恢复映像和仅仅启动的一种方式。一旦手机进入 fastboot 模式,您就可以向内部存储器刷写镜像文件。例如,可以以这种方式刷入之前讨论过的自定义恢复映像,如 TWRP 恢复。

您只需输入几个命令。首先,将设备重启至引导加载器/快速启动模式:

adb reboot bootloader

然后,使用以下命令刷入 TWRP:

fastboot flash recovery twrp.img

现在您可以使用以下命令重启设备:

fastboot reboot

在刷入 TWRP 之前,请确保您已阅读 XDA Developers 论坛关于目标设备的主题(forum.xda-developers.com/)。

锁定和解锁的启动加载器

启动加载程序可以被锁定或解锁。锁定的启动加载程序不允许您通过在启动加载器级别实施限制(通常通过加密签名验证)对设备的固件进行修改。因此,无法向设备刷入未签名代码。换句话说,要运行任何恢复映像或自己的操作系统,首先需要解锁启动加载器。解锁启动加载器可能会导致严重的安全问题。如果设备丢失或被盗,攻击者可以通过上传自定义 Android 引导映像或刷入自定义恢复映像来恢复其中的所有数据。这样做后,攻击者就可以完全访问设备上包含的数据。因此,在解锁锁定的启动加载器时会在手机上执行出厂数据重置,以便擦除所有数据。因此,仅在绝对必要时执行此操作非常重要。某些设备有正式解锁它们的方法。对于这些设备,可以将设备置于 fastboot 模式并运行 fastboot oem unlock 命令来解锁启动加载器。这将解锁启动加载器并完全擦除 Android 设备。

其他一些制造商通过不同的方式提供解锁功能,例如通过其官网。以下截图显示了小米官网提供的解锁支持:

小米官网提供解锁引导加载程序的支持

如何获取 root 权限

本部分内容基于底层引导加载程序是锁定还是解锁。对于解锁的引导加载程序设备,获取 root 权限非常容易,而对于锁定的引导加载程序设备,获取 root 权限则相对复杂。接下来的部分将详细解释这一点。

获取 root 权限(针对解锁的引导加载程序)

在类 Unix 系统中,超级用户是一个用于系统管理的特殊用户帐户,具有访问和修改操作系统中所有文件的权限。root 权限的过程主要涉及将su(超级用户)二进制文件复制到当前进程路径中的某个位置(/system/xbin/su),并使用chmod命令授予其可执行权限。因此,第一步是解锁引导加载程序。如引导加载程序的锁定与解锁部分所解释,根据设备的不同,解锁引导加载程序可以通过 fastboot 模式或按照厂商特定的引导加载程序解锁流程完成。

su二进制文件通常会伴随一个 Android 应用程序,如 SuperUser,该应用程序在每次应用程序请求 root 权限时提供图形提示,如下图所示:

超级用户请求

一旦引导加载程序解锁,你就可以对设备进行所有想要的修改。因此,复制su二进制文件并授予其可执行权限的方法有很多。最常见的方法是启动自定义恢复镜像,这样可以将su二进制文件复制到系统分区,并通过自定义更新包设置相应的权限。

这里是如何获取三星 Galaxy S7(国际版 SM-G930F/FD/X、韩国版 SM-G930K/L/S 和加拿大版 SM-G930W8 Exynos 模型)root 权限的方法:

  1. 确保在开发者选项中启用OEM 解锁

  2. 下载 ODIN(可以从此处获取:build.nethunter.com/samsung-tools/Odin_3.12.3.zip),并将压缩包中的内容解压到你选择的目录中。

  3. 下载 TWRP 镜像(可以从此处获取:teamw.in/devices/samsunggalaxys7.html)。

  4. 重启设备进入下载模式。方法是,在设备重启时按住[音量下] + [Home]按钮。当你看到下载模式警告屏幕时,按[音量上]继续。

  5. 启动 Odin 并将 TWRP 镜像放入[AP]插槽;不要忘记禁用自动重启。开始刷入恢复。

  6. 要退出下载模式,按住[音量下] + [Home] + [电源];当屏幕熄灭时,立即将[音量下]更改为[音量上]。

  7. 通过向右滑动来允许系统修改。

  8. 下载SuperSU(可在此处下载:download.chainfire.eu/supersu)。

  9. 通过 MTP 将 SuperSU 存档传输到设备,并通过相应的 TWRP 选项进行安装。

自 Android 4.1 版本起,引入了一项名为 sideload 模式的新功能。此功能允许通过 ADB 应用更新 ZIP,而无需事先将其复制到设备。要 sideload 更新,运行 adb sideload su-package.zip 命令,其中 su-package.zip 是你电脑上更新包的文件名。

或者,你也可以修改工厂镜像以添加 su 二进制文件。这可以通过解压缩一个 ext4 格式的系统镜像,添加 su 二进制文件并重新打包来完成。如果刷入该镜像,它将包含 su 二进制文件,并且设备将被 Root。

Root 是一个高度设备特定的过程,因此法医调查员在对任何 Android 设备应用这些技术之前需要谨慎。

解锁启动引导器进行 Root

当启动引导器被锁定并且无法通过任何可用方式解锁时,Root 设备需要找到可以利用的安全漏洞。但在此之前,首先要识别启动引导器锁的类型。它可能因制造商和软件版本而异。有些手机可能不允许通过 fastboot 访问,但你仍然可以使用制造商专有的闪存协议进行刷机,例如三星的 ODIN。一些设备只对特定分区(如 boot 和 recovery)强制执行签名验证。因此,可能无法进入自定义恢复模式。然而,你仍然可以修改出厂镜像以包括 su 二进制文件,如前一部分所述。

如果启动引导器无法通过任何方式解锁,那么唯一的选择是找到设备上的某个漏洞,利用该漏洞并添加su二进制文件。漏洞可能存在于 Android 内核中,或者在以 root 身份运行的进程中,或其他任何问题。这是设备特定的,必须在尝试之前进行广泛的研究。

以下是最受欢迎的 Android 根权限应用:

在 Root 设备上的 ADB

我们已经看到如何使用 ADB 工具与设备交互并在设备上执行某些命令。然而,在正常的 Android 手机上,某些位置,例如/data/data,是无法访问的。例如,以下是尝试访问正常设备上的/data/data时的命令行输出:

adb shell
shell@android:/ $ cd /data/data
cd /data/data
shell@android:/data/data $ ls
ls: .: Permission denied

这是因为所有应用程序的私人数据都存储在此文件夹中,Android 会对其进行安全性保护。只有 root 用户才能访问此位置。因此,在 root 设备上,你将能够看到此位置下的所有数据,正如以下命令行所示:

adb shell
shell@android:/ $ su
shell@android:/ # ls /data/data
android
 com.android.backupconfirm
 com.android.bips
 com.android.bluetooth
 com.android.bluetoothmidiservice
 com.android.calllogbackup
 com.android.camera2
 com.android.captiveportallogin
 com.android.carrierconfig
 com.android.carrierdefaultapp
 com.android.cellbroadcastreceiver
 com.android.certinstaller
 com.android.companiondevicemanager
 com.android.contacts
 com.android.cts.ctsshim
 com.android.cts.priv.ctsshim
 com.android.defcontainer
 com.android.development
 com.android.dialer
 com.android.documentsui
 com.android.dreams.basic
 com.android.dreams.phototable
 com.android.egg
 com.android.email
 com.android.emergency
 com.android.externalstorage
 com.android.facelock
 com.android.gallery3d
...

如前面的代码所示,现在可以轻松地通过导航到相应的文件夹来查看所有应用程序的私人数据。因此,在 root 设备上,ADB 工具非常强大,允许检查员访问设备上所有已安装应用程序的数据,前提是设备没有设置图案锁或 PIN 码保护,或没有通过 RSA 密钥注册到计算机。

有时候,即使在已获得 root 权限的手机上,你也会看到权限被拒绝的提示。在这种情况下,执行adb shell命令后,可以尝试通过输入su进入 SuperUser 模式。如果 root 权限已经启用,你将看到#,且不需要输入密码。

总结

在对 Android 设备进行调查之前,搭建一个合适的取证环境至关重要。安装 Android SDK 是必要的,因为其中包含了 ADB 等工具。通过 ADB,检查员可以与设备进行通信,查看设备上的文件夹,提取数据,并将数据复制到设备上。然而,并非所有文件夹都能在普通手机上通过这种方式访问,因为设备的安全措施会阻止检查员查看包含私人数据的位置。因此,root 设备可以解决这个问题,因为它提供了对设备上所有数据的无限访问权限。解锁引导加载程序的设备 root 过程相对简单,而锁定引导加载程序的设备 root 则涉及到利用一些安全漏洞。

在掌握了如何访问设备的知识后,我们将继续讨论第三章,理解 Android 设备上的数据存储中有关数据如何组织以及其他许多细节。

第三章:理解安卓设备的数据存储

法医分析的主要目的是从设备中提取必要的数据。因此,为了有效的法医分析,必须知道设备上存储了什么类型的数据,数据存储的位置,存储的方式,以及数据存储的文件系统的详细信息。对于法医分析员来说,这些知识非常重要,可以帮助他们做出明智的决定,了解在哪些位置寻找数据,并且可以使用哪些技术来提取数据。本章我们将学习以下内容:

  • 安卓分区布局

  • 安卓文件层次结构

  • 设备上的应用数据存储

  • 安卓文件系统概述

安卓分区布局

分区是设备持久存储内存中创建的逻辑存储单元。分区允许你将可用空间逻辑地划分为多个可以独立访问的部分。

安卓中常见的分区

分区布局在不同厂商和版本之间有所不同,但所有安卓设备都存在一些共同的分区。以下是大多数安卓设备中常见的一些分区:

  • BOOT:顾名思义,此分区包含了手机启动所需的信息和文件。它包含内核和 RAMDisk,因此没有这个分区,手机无法启动其进程。

  • CACHE:此分区用于存储经常访问的数据以及其他各种文件,如恢复日志和通过空中下载的更新包。

  • RECOVERY:恢复分区允许设备启动到恢复控制台,通过该控制台可以执行如手机更新及其他维护操作。为此,存储了一个最小的安卓启动镜像,作为故障安全保护。

  • SYSTEM:此分区包含除内核和 RAMDisk 以外的所有主要组件。此处的安卓系统镜像包含安卓框架、库、系统二进制文件和预安装应用程序。如果没有这个分区,设备无法正常启动。

  • USERDATA:此分区通常称为数据分区,是设备的内部存储,用于存储应用程序数据。大量的用户数据存储在此,并且这是我们大多数法医证据所在的位置。它存储了所有的应用数据和标准通讯记录。

识别分区布局

对于给定的安卓设备(如三星 Galaxy J7),可以通过多种方式确定分区布局。/proc下的分区文件将提供关于设备上所有可用分区的详细信息。

以下截图显示了分区文件的内容:

安卓中的分区文件

上面的条目仅显示了分区名称。要获取这些分区与其逻辑功能的映射,请查看位于/dev/block/platform/13540000.dwmmc0目录下的目录内容。以下截图显示了该目录的内容:

块与其逻辑功能的映射

如前面的输出所示,SYSTEMUSERDATA等多个分区出现在分区布局中。

安卓文件层次结构

要对任何系统(桌面或移动设备)进行取证分析,理解底层的文件层次结构非常重要。基本理解安卓如何在文件和文件夹中组织数据,有助于取证分析师将研究范围缩小到特定位置。如果你熟悉类 Unix 系统,你会非常了解安卓的文件层次结构。在 Linux 中,文件层次结构是一个单一的树形结构,树的顶端表示为/,称为根目录。这与 Windows 中按驱动器组织文件的概念不同。

无论文件系统是本地的还是远程的,它都将位于根目录下。安卓的文件层次结构是现有 Linux 层次结构的定制版本。根据设备制造商和底层的 Linux 版本,该层次结构可能会有一些不太显著的变化。要查看完整的文件层次结构,您需要 root 权限。以下截图显示了安卓设备上的文件层次结构:

安卓根目录下的文件夹

目录概览

以下各节概述了安卓设备文件层次结构中的目录。

acct 目录

这是acct控制组(cgroup)的挂载点,它提供了用户计费功能。

cache 目录

这是 Android 存储经常访问的数据和应用组件的目录(/cache)。清除缓存不会影响你的个人数据,只是删除了其中现有的数据。此文件夹中还有另一个名为lost+found的目录,用于存储因文件系统损坏(如未卸载直接移除 SD 卡)而恢复的文件(如果有的话)。缓存中可能包含与取证相关的文件,如图像、浏览历史记录和其他应用数据。

config 目录

该目录包含 SDCardFS(内核中的 FAT32 仿真层)和 USB 小工具的配置文件。

数据目录

/data/data分区包含所有应用程序的私有数据。大多数属于用户的数据存储在此文件夹中。该文件夹从取证角度来看具有重要意义,因为它保存了有价值的数据。此分区在内部存储部分中有详细介绍。以下截图显示了数据分区的内容:

安卓设备的数据分区内容

dev 目录

该目录包含所有设备的特殊设备文件。这是tempfs文件系统的挂载点,该文件系统定义了应用程序可用的设备。

mnt 目录

该目录作为所有文件系统(包括内外部 SD 卡等)的挂载点。以下截图显示了该目录中存在的挂载点:

proc 目录

这是 procfs 文件系统的挂载点,它提供对内核数据结构的访问。多个程序使用 /proc 作为信息来源。它包含有关进程的有用信息。例如,以下截图所示,/proc 下的 meminfo 文件提供有关内存的信息:

Android 中 proc 文件夹下的 meminfo 文件

sbin 目录

该目录包含多个重要守护进程的二进制文件。从取证角度来看,它并不特别重要。

存储目录

在这里,你可以找到 SD 卡的内容。请注意,这张 SD 卡可以是可拆卸存储或不可拆卸存储。任何具有 WRITE_EXTERNAL_STORAGE 权限的应用程序都可能在此位置创建文件或文件夹。大多数手机中都存在一些默认文件夹,如 AndroidDCIMDownloads。以下截图显示了 /storage/self/primary 位置的内容:

/storage/self/primary 的内容(/sdcard 是一个符号链接)

数码相机图像DCIM)是数码相机、智能手机、平板电脑及相关固态设备的默认目录结构。一些平板电脑有一个 Photos 文件夹,指向相同的存储位置。在 DCIM 文件夹内,你会找到你拍摄的照片、视频和缩略图(缓存文件)。照片存储在 /DCIM/Camera 中。

Android 开发者参考资料中解释了有一些公共存储目录,这些目录并不绑定到特定的程序。以下是这些文件夹的快速概览:

  • Music:媒体扫描器将此位置下的所有媒体分类为用户音乐

  • Podcasts:媒体扫描器将此位置下的所有媒体分类为播客

  • Ringtones:此处的媒体文件被归类为铃声

  • Alarms:此处的媒体文件被分类为闹钟

  • Notifications:该位置下的媒体文件用于通知声音

  • Pictures:所有照片,除了用相机拍摄的,都会存储在此文件夹中

  • Movies:所有电影,除了用相机拍摄的,都会存储在此文件夹中

  • Download:杂项下载

系统目录

该目录包含库、系统二进制文件和其他与系统相关的文件。与手机一起预安装的应用程序也存储在此分区中。以下截图显示了 Android 设备上系统分区中的文件:

Android 设备系统分区的内容

设备上的应用数据存储

Android 设备通过应用存储大量敏感数据。虽然我们之前将应用分为系统应用和用户安装的应用,但这里有一个更详细的划分:

  • 随 Android 附带的应用

  • 制造商预装的应用

  • 无线运营商预装的应用

  • 用户安装的应用

所有这些都在设备上存储不同类型的数据。应用数据通常包含大量与调查相关的信息。以下是 Android 设备上可能找到的一些数据的示例:

  • 短信

  • 彩信

  • 聊天信息

  • 备份

  • 电子邮件

  • 通话记录

  • 联系人

  • 图片

  • 视频

  • 浏览器历史

  • GPS 数据

  • 下载的文件或文档

  • 属于已安装应用的数据(如 Facebook、Twitter 和其他社交媒体应用)

  • 日历预约

不同应用的数据可以存储在内部或外部。在外部存储(SD 卡)的情况下,数据可以存储在任何位置。但在内部存储的情况下,位置是预定义的。具体来说,设备上所有应用的内部数据(无论是系统应用还是用户安装的应用)会自动保存在 /data/data 的一个以包名命名的子目录中。例如,默认的 Android 邮件应用的包名为com.android.email,其内部数据存储在/data/data/com.android.email。我们将在后续章节中详细讨论这一点,但目前这些知识足以理解以下细节。

Android 为开发者提供了一些选项来将数据存储到设备上。可以使用的选项取决于要存储的底层数据。属于应用的数据可以存储在以下位置之一:

  • 共享首选项

  • 内部存储

  • 外部存储

  • SQLite 数据库

  • 网络

以下各节提供了有关这些选项的详细说明。

共享首选项

共享首选项提供了一个框架,用于以 XML 格式存储原始数据类型的键值对。原始数据类型包括布尔值、浮动、整数、长整型和字符串。字符串以Unicode 转换格式UTF)存储。这些文件通常存储在应用的/data/data/shared_pref路径下。例如,Android 邮件应用的shared_pref文件夹包含以下三个 XML 文件:

Android 邮件应用的 shared_prefs 文件夹内容

如第二章《设置 Android 法医环境》中所解释的,可以使用cat命令查看这些文件的内容。以下截图显示了UnifiedEmail.xml文件的内容:

Android 邮件应用的共享首选项文件内容

不同的 XML 文件可能包含不同的有用信息,例如帐户名甚至密码,这对法医检查非常有帮助。

内部存储

这里存储的文件位于内部存储中。它们通常位于应用的 /data/data 子目录中。存储在这里的数据是私有的,其他应用无法访问。即使是设备所有者也无法查看这些文件(除非他们具有 root 权限)。

然而,根据需求,开发者可以允许其他进程修改和更新这些文件。以下截图展示了应用在 /data/data 目录下以包名存储的详细信息:

Android 中的 /data/data 文件夹内容

每个应用的内部数据存储在各自的文件夹中。例如,下面的截图展示了 Android 设备上属于 YouTube 应用的内部存储:

Android YouTube 应用的内部存储

通常,databaseslibshared_prefcache 文件夹会为大多数应用创建。以下表格简要描述了这些文件夹:

子目录描述
shared_prefs共享偏好设置的 XML 文件
lib应用所需的自定义库文件
files开发者保存的文件
cache应用缓存的文件
databasesSQLite 和日志文件

除这些文件夹外,其他文件夹是应用开发者创建的自定义文件夹。databases 文件夹包含对司法调查至关重要的数据。如以下截图所示,这个文件夹中的数据以 SQLite 文件形式存储:

Android 浏览器应用中 databases 文件夹下的 SQLite 文件

可以使用如 DB Browser for SQLite 等工具查看这些数据。关于如何提取数据的更多细节,请参考第四章,从 Android 设备中逻辑地提取数据

外部存储

应用也可以将文件存储在外部存储中。外部存储可以是可移动的媒体,如 SD 卡,或者是手机自带的不可移动存储。在可移动 SD 卡的情况下,只需移除 SD 卡并插入其他设备,数据就可以在其他设备上使用。SD 卡通常采用 FAT32 文件系统格式,但越来越多的使用 EXT3 和 EXT4 文件系统。与内部存储不同,外部存储没有严格的安全措施。换句话说,存储在这里的数据是公开的,其他应用可以访问,只要请求应用具有必要的权限。

SQLite 数据库

SQLite 是一种流行的数据库格式,广泛应用于许多移动系统中,用于结构化数据存储。SQLite 是开源的,并且与许多其他数据库不同,它具有紧凑性并提供丰富的功能。Android 通过专用的 API 支持 SQLite,因此开发者可以利用这一特性。SQLite 数据库是法医数据的重要来源。应用程序使用的 SQLite 文件通常存储在 /data/data/<ApplicationPackageName>/databases 路径下。例如,在 Android 邮件应用中,以下截图展示了其数据库文件夹中的 SQLite 文件。我们将在接下来的章节中进一步探讨这些细节。从法医的角度来看,这些文件非常有价值,因为它们通常存储了应用程序处理的大量重要数据。

网络

你可以使用网络存储和检索你自己基于 Web 的服务中的数据。要进行网络操作,可以使用 java.net.*android.net.* 包中的类。这些包为开发者提供了与网络、Web 服务器等交互所需的低级 API。

Android 文件系统概述

在 Android 法医分析中,理解文件系统非常重要,因为它帮助我们了解数据是如何存储和检索的。关于文件系统的属性和结构的知识在法医分析中非常有用。文件系统指的是数据如何存储、组织和从存储设备中检索的方式。一个基本的安装可能基于一个卷划分成多个分区;在这种情况下,每个分区可以由不同的文件系统管理。Microsoft Windows 用户通常熟悉 FAT32 或 NTFS 文件系统,而 Linux 用户则更熟悉 EXT2 或 EXT4 文件系统。正如在 Linux 中一样,Android 使用挂载点而非驱动器(即 C:E:)。每个文件系统都定义了自己管理卷上文件的规则。根据这些规则,每个文件系统在文件检索、速度、安全性、大小等方面提供不同的表现。Linux 使用多种文件系统,Android 也如此。从法医角度来看,了解 Android 使用了哪些文件系统,并识别对调查具有重要意义的文件系统非常重要。例如,存储用户数据的文件系统对我们来说是主要关注点,而用于启动设备的文件系统则较为次要。

如前所述,Linux 以支持大量文件系统而闻名。系统使用的这些文件系统不是通过驱动器名称访问的,而是合并成一个单一的层级树结构,代表了一个整体的文件系统。每当一个新的文件系统被挂载时,它就被加入到这个单一的文件系统树中。

在 Linux 中,挂载是将一个额外的文件系统附加到当前可访问的计算机文件系统的过程。

因此,文件系统被挂载到一个目录上,位于该文件系统中的文件现在成为该目录的内容。这个目录称为挂载点。无论文件系统存在于本地设备上还是远程设备上,都没有区别。一切都整合到一个以根目录为起点的单一文件层级中。每个文件系统都有一个单独的内核模块,它将其支持的操作注册到一个叫做虚拟文件系统VFS)的东西中。VFS 使得不同的应用程序可以以统一的方式访问不同的文件系统。通过将实现与抽象分离,添加新的文件系统变得只是编写另一个内核模块的问题。这些模块要么是内核的一部分,要么是在需要时动态加载。Android 内核提供了一个包含从日志文件系统JFS)到 Amiga 文件系统等多种文件系统的子集。所有的后台工作都由内核处理,当文件系统被挂载时。

查看 Android 设备上的文件系统

可以通过检查proc文件夹中存在的filesystems文件的内容来确定 Android 内核支持的文件系统。可以使用以下命令查看该文件的内容:

j7xelte:/ # cat /proc/filesystems
 nodev sysfs
 nodev rootfs
 nodev tmpfs
 nodev bdev
 nodev proc
 nodev cgroup
 nodev devtmpfs
 nodev debugfs
 nodev securityfs
 nodev sockfs
 nodev pipefs
 nodev ramfs
 nodev configfs
 nodev devpts
 ext3
 ext2
 ext4
 nodev sdcardfs
 cramfs
 vfat
 msdos
 sdfat
 nodev ecryptfs
 fuseblk
 nodev fuse
 nodev fusectl
 f2fs
 nodev pstore
 nodev selinuxfs
 nodev functionfs

在前面的输出中,带有nodev属性的文件系统未被挂载到设备上。

常见的 Android 文件系统

Android 中存在的文件系统可以分为三大类:

  • 闪存文件系统

  • 基于媒体的文件系统

  • 假文件系统

可以通过逻辑方式恢复哪些数据?

在大多数情况下,任何和所有的用户数据都可以通过逻辑方式恢复:

  • 联系人

  • 通话记录

  • 短信/MMS

  • 应用数据

  • 系统日志和信息

这些数据的绝大部分存储在 SQLite 数据库中,因此通过逻辑提取恢复大量删除的数据成为可能。

闪存文件系统

闪存是一种持续供电的非易失性存储器,它可以在称为块的内存单元中被擦除并重新编程。由于闪存的特殊性质,写入媒体并处理某些块长时间擦除的文件系统需要特殊设计。虽然不同的 Android 设备支持的文件系统各不相同,但常见的闪存文件系统如下:

  • 扩展文件分配表exFAT)是微软专有的文件系统,专为闪存驱动器优化。由于许可要求,它不包含在标准 Linux 内核中。但仍然有一些厂商提供对该文件系统的支持。

  • 闪存友好文件系统F2FS)是三星推出的一种开源文件系统。其基本目的是构建一个考虑到基于 NAND 闪存存储设备特性的文件系统。

  • 日志闪存文件系统版本 2JFFS2)是 Android 使用的一种日志结构化文件系统。自冰淇淋三明治版本以来,JFFS2 一直是Android 开源项目ASOP)的默认闪存文件系统。像 LogFS、UBIFS、YAFFS 等文件系统已经被开发出来,作为 JFFS2 的替代方案。

  • 另一个闪存文件系统版本 2YAFFS2)是一个开源的单线程文件系统,发布于 2002 年。它主要设计用于在处理 NAND 闪存时具有较高的速度。YAFFS2 利用带外OOB)存储,而在法医数据采集过程中,这些信息往往无法正确捕获或解码,这使得分析变得困难。YAFFS2 曾一度是最受欢迎的版本,至今在 Android 设备中仍广泛使用。YAFFS2 是一个日志结构化文件系统,即使在突然断电的情况下,数据完整性也能得到保证。2010 年,发布的公告称,在 Gingerbread 版本之后,设备将从 YAFFS2 迁移到 EXT4。目前,YAFFS2 不再在更新的内核版本中得到支持,但某些手机制造商可能仍会继续支持它。

  • 强大的文件系统RFS)支持三星设备上的 NAND 闪存。RFS 可以总结为一个启用了事务日志的 FAT16(或 FAT32)文件系统。许多用户抱怨三星应该坚持使用 EXT4。已知 RFS 存在滞后问题,减缓了 Android 的功能表现。

基于媒体的文件系统

除了前述的闪存文件系统,Android 设备通常还支持以下基于媒体的文件系统:

  • EXT2/EXT3/EXT4(扩展文件系统),是 1992 年专为 Linux 内核推出的文件系统,是最早的文件系统之一,使用了虚拟文件系统。EXT2、EXT3 和 EXT4 是后续版本。EXT3 相比 EXT2 的主要优势是引入了日志功能。使用 EXT3 时,在发生意外关机时,不需要验证文件系统。EXT4 文件系统,作为第四版扩展文件系统,在实现双核处理器的移动设备中变得尤为重要。已知 YAFFS2 文件系统在双核系统上存在瓶颈。随着 Android Gingerbread 版本的发布,YAFFS 文件系统被 EXT4 取代。

  • FAT(文件分配表)文件系统,如 FAT12、FAT16 和 FAT32,由 MSDOS 驱动程序支持。

  • VFAT(虚拟文件分配表)是 FAT16 和 FAT32 文件系统的扩展。微软的 FAT32 文件系统被大多数 Android 设备支持。它几乎可以被所有主要操作系统(包括 Windows、Linux 和 macOS)支持。这使得这些系统能够轻松读取、修改和删除 Android 设备上 FAT32 分区中的文件。大多数外部 SD 卡都是使用 FAT32 文件系统格式化的。

虚拟文件系统

除了这些文件系统外,还有伪文件系统,可以将其视为文件的逻辑分组。以下是一些在 Android 设备中常见的重要伪文件系统:

  • cgroup 伪文件系统提供了一种访问和定义多个内核参数的方法。存在许多不同的进程控制组。如以下命令行输出所示,可以在 /proc/cgroups 文件中查看到组的列表:

Android 设备使用该文件系统来跟踪它们的工作。它们负责聚合任务并跟踪任务的状态。

  • rootfs 文件系统是 Android 的主要组成部分之一,包含启动设备所需的所有信息。当设备启动时,它需要访问许多核心文件,因此会挂载根文件系统。此文件系统挂载在 /(即 root 文件夹)下。因此,这是所有其他文件系统逐步挂载的文件系统。如果该文件系统损坏,设备将无法启动。

  • Procfs 文件系统包含有关内核数据结构、进程和其他系统相关信息,这些信息存储在 /proc 目录下。例如,/proc/filesystems 文件显示设备上可用文件系统的列表。以下命令显示设备 CPU 的所有信息:

  • sysfs 文件系统挂载了 /sys 文件夹,其中包含有关设备配置的信息。以下输出显示了 Android 设备中 sys 目录下的各个文件夹:
j7xelte:/sys # ls -1
 bcm-dhd
 block
 bus
 class
 dev
 devices
 firmware
 fs
 kernel
 mms_ts
 module
 power

由于这些文件夹中的数据大多与配置相关,通常对法医调查员来说并没有太大意义。但在某些情况下,我们可能需要检查手机上是否启用了某个特定设置,分析这个文件夹可能会在这种情况下有用。请注意,每个文件夹包含大量文件。通过法医获取这些数据是确保在检查过程中数据不会被更改的最佳方法。

  • tmpfs 是设备上的一种临时存储设施,将文件存储在 RAM(易失性内存)中。通常,它会挂载在 /dev 目录下。使用 RAM 的主要优点是访问和检索速度更快。但是,一旦设备重启或关闭,这些数据将不再可访问。因此,对于法医调查员来说,在设备重启之前检查 RAM 中的数据或提取数据非常重要。

你可以使用 mount 命令查看设备上可用的不同分区及其文件系统,命令如下:

j7xelte:/ # mount
 rootfs on / type rootfs (ro,seclabel,size=850052k,nr_inodes=212513)
 tmpfs on /dev type tmpfs (rw,seclabel,nosuid,relatime,mode=755)
 devpts on /dev/pts type devpts (rw,seclabel,relatime,mode=600)
 proc on /proc type proc (rw,relatime,gid=3009,hidepid=2)
 sysfs on /sys type sysfs (rw,seclabel,relatime)
 selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
 /dev/block/mmcblk0p20 on /system type ext4 (ro,seclabel,relatime,errors=panic,data=ordered)
 none on /acct type cgroup (rw,relatime,cpuacct)
 tmpfs on /mnt type tmpfs (rw,seclabel,relatime,mode=755,gid=1000)
 none on /config type configfs (rw,relatime)
 none on /dev/cpuctl type cgroup (rw,relatime,cpu)
 pstore on /sys/fs/pstore type pstore (rw,seclabel,relatime)
 /dev/block/mmcblk0p3 on /efs type ext4 (rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered)
 adb on /dev/usb-ffs/adb type functionfs (rw,relatime)
 tmpfs on /storage type tmpfs (rw,seclabel,relatime,mode=755,gid=1000)
 /dev/block/mmcblk0p4 on /cpefs type ext4 (rw,seclabel,nosuid,nodev,noatime,data=ordered)
 /dev/block/mmcblk0p21 on /cache type ext4 (rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,errors=panic,data=ordered)
 /dev/block/mmcblk0p24 on /data type ext4 (rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,errors=panic,data=ordered)
 tmpfs on /sbin type tmpfs (rw,seclabel,relatime)
 /dev/block/mmcblk0p20 on /sbin/.core/mirror/system type ext4 (ro,seclabel,relatime,errors=panic,data=ordered)
 /dev/block/mmcblk0p24 on /sbin/.core/mirror/bin type ext4 (rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,errors=panic,data=ordered)
 /sbin/.core/block/loop08 on /sbin/.core/img type ext4 (rw,seclabel,relatime,data=ordered)
 /dev/fuse on /mnt/runtime/default/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other)
 /dev/fuse on /storage/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other)
 /dev/fuse on /mnt/runtime/read/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other)
 /dev/fuse on /mnt/runtime/write/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other)
 /dev/block/mmcblk0p24 on /sbin/.core/db-0/magisk.db type ext4 (rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,errors=panic,data=ordered)

如前述命令行输出所示,不同的分区有不同的文件系统,它们会根据需要进行挂载。

总结

熟悉 Android 的分区布局、文件系统和重要位置,将有助于取证调查员在从设备中提取数据的过程中进行工作。Android 设备上的 userdata 位置包含大量用户信息,这些信息对任何取证调查都可能至关重要。然而,这些文件大多数只能在已 root 的手机上访问(尤其是/data/data目录下的文件)。我们还讨论了 Android 数据存储选项、Android 使用的各种文件系统及其重要性。

有了这些知识,我们将在接下来的章节中学习如何从 Android 设备中逻辑和物理地提取数据。

第四章:从安卓设备中逻辑提取数据

本章将涵盖逻辑数据提取,尽可能使用免费和开源工具。本章中大多数内容将使用之前在第二章中讨论过的Android 调试桥ADB)方法,设置安卓取证环境

到本章结束时,读者应熟悉以下内容:

  • 逻辑提取概述

  • 手动 ADB 数据提取

  • ADB 备份提取

  • ADB dumpsys

  • 绕过安卓锁屏

  • 安卓 SIM 卡提取

逻辑提取概述

在数字取证中,逻辑提取一词通常用于指不恢复删除数据或不包括证据的完整逐位复制的提取方法。然而,逻辑提取的更准确定义,也在第一章中定义,介绍安卓取证,是任何需要与基本操作系统进行通信的方法。由于与操作系统的交互,取证员不能确定是否已恢复所有可能的数据;操作系统在决定允许取证员访问哪些数据。因此,在传统的计算机取证中,逻辑提取类似于复制和粘贴一个文件夹来提取系统中的数据;此过程仅会复制用户可以访问和看到的文件。如果在被复制的文件夹中有任何隐藏或已删除的文件,它们将不会出现在粘贴的文件夹中。

然而,正如你将看到的,在移动设备取证中,逻辑提取和物理提取之间的界限,比传统计算机取证中更为模糊。例如,由于 SQLite 数据库广泛用于存储数据,删除的数据通常可以从移动设备的逻辑提取中恢复。此外,几乎所有的移动提取都需要与安卓操作系统进行某种形式的交互;没有类似于拔出硬盘并对其进行镜像而不启动硬盘的简单等效物。就我们而言,我们将逻辑提取定义为获取用户可见数据的过程,并可能包括已标记为删除的数据。

Root 访问权限

在进行安卓设备的取证分析时,限制因素通常不是所寻求的数据类型,而是检查员是否能够访问数据。Root 访问权限在第二章中已做过详细讨论,设置安卓取证环境,但这一点足够重要,值得重复。之前列出的所有数据,当存储在内部闪存中时,都受到保护,并且需要 Root 权限才能读取。唯一的例外是存储在 SD 卡上的应用数据,本书后续将进行讨论。

没有 root 访问权限,取证检查员无法简单地从 /data 分区复制信息。检查员将不得不找到某种方法来提升权限以访问联系人、通话记录、短信/MMS 和应用程序数据。这些方法通常伴随着许多风险,如可能销毁砖化设备(使其无法启动),并可能修改设备上的数据以获得永久性。

方法通常因设备而异,没有通用的一键方法可以获取每台设备的 root 访问权限。商业移动取证工具如 Oxygen Forensic Detective 和 Cellebrite UFED 具有内置功能,可以临时和安全地 root 许多设备,但不涵盖所有 Android 设备的广泛范围。

在本章中,我们将注意到每个技术演示所需的 root 权限位置。

决定对设备进行 root 是根据您当地的操作程序和法院意见。通过 root 获取的证据的法律接受度因司法管辖区而异。

手动 ADB 数据提取

adb pull 命令可用于直接从设备将单个文件或整个目录拉到取证检查员的计算机。这种方法在涉及短信消息的严格调查中尤其有用,检查员可以选择仅拉取相关文件,如果可能的话。

USB 调试

在本书中先前已讨论了设置 ADB 环境。但是,检查的设备也必须正确配置。USB 调试是取证员计算机与设备通信的实际方法。USB 调试位于设置菜单中的开发者选项下。然而,截至Android 8.1,开发者选项菜单是隐藏的;要显示它,用户必须转到设置 | 系统 | 关于手机,然后点击构建号字段七次。返回到上一个屏幕—现在可以找到开发者选项了;简单地打开这个菜单并选择启用 USB 调试。

除了 USB 调试外,检查员计算机上必须安装正确的驱动程序。通常可以在线找到它们,要么是从制造商的网站,要么是从www.xda-developers.com。如果在机器上安装了商业取证工具,则可能已经安装了适当的驱动程序。

在 Android 4.2.2 之前,启用 USB 调试是与设备通过 ADB 通信的唯一要求。在 Android 4.2.2 中,Google 添加了安全 USB 调试。安全 USB 调试增加了在设备屏幕上选择连接到计算机的额外要求;这可以防止来自不受信任计算机的 ADB 访问已锁定设备:

RSA 指纹对话框(Android 8.1)

一旦启用了 USB 调试并且通过了 安全 USB 调试 检查(根据 Android 版本的不同),设备就可以开始检查了。为了验证设备是否已连接并准备好使用 ADB,可以执行以下命令:

adb devices

如果选择了“始终允许此计算机连接”,设备将存储计算机的 RSA 密钥,并且未来连接该计算机时,即使设备处于锁定状态,也不会再次出现提示。

如果设备状态显示为 离线未授权,需要在屏幕上选择安全调试提示:

如果一切正常,设备 状态应该显示如下界面:

恢复模式

为了确保法医取证的有效性,ADB 数据提取不应在手机开启时进行。设备在运行时,时间戳可能会被修改,应用程序也可能在后台运行并更新文件。为了避免这种情况,审查员应尽可能将设备置于自定义恢复模式,如第二章《设置 Android 法医环境》中所示。标准 Android 恢复模式下无法进行 ADB 访问。通常,刷入自定义恢复模式是获取设备 ROOT 权限过程中的第一步,以便在出现问题时能够修复设备。ROOT 设备更可能包含自定义恢复模式,但也可以将自定义恢复模式刷入非 ROOT 设备。这种方法还可以让审查员避开新版 Android 中的安全 USB 调试提示,尽管我们的测试表明,这在 Android Lollipop 及更高版本中不起作用。恢复模式通常不需要启用 USB 调试,这使得它成为绕过锁定设备的理想选择。

该方法无法在启用了完整磁盘加密的设备上使用。启动恢复模式时不会解密 /data 分区。

启动恢复模式的过程因设备而异。通常,需要关机并同时按住音量键和电源键。针对特定型号的指南可以轻松在线查找。

标准恢复模式通常会显示一个正在操作的 Android 图标:

标准恢复模式

需要注意的是,恢复模式下将无法进行 ADB 通信;运行 adb devices 会显示没有设备。

许多设备的自定义恢复镜像可以在以下位置找到:

twrp.me/Devices/

如果设备处于自定义恢复模式,并且在审查员的计算机上已安装正确的驱动程序,设备可以像实时设备一样通过 ADB 访问。请注意,使用 adb devices 命令时,它的状态现在显示为处于恢复模式:

在检查员可以开始通过 ADB 提取数据之前,还有一个最后步骤:必须挂载/data分区才能访问用户数据。一些自定义恢复可能会自动挂载此分区,而其他的可能不会。如果使用前面提到的网址中的Team Win Recovery Project镜像,可以通过选择 Mount 然后选择/data分区来挂载。恢复菜单通常可以通过使用音量键上下移动,电源键选择,或者根据使用的自定义恢复镜像可能是触摸操作的方式进行导航。

对于 TWRP 恢复,请按照以下步骤操作:

  1. 从主恢复屏幕,选择 Mount:

  1. 选择 Mount 后,选择要挂载的分区:

一旦/data分区(以及检查员想要调查的其他分区)被挂载,检查员就可以进行 ADB 数据提取,如本章前面所示。

在许多运行 Android 6.0(Marshmallow)或更高版本的设备上,userdata 分区默认加密,因此无法使用自定义恢复镜像挂载和提取。

如果设备没有自定义恢复,以下部分将展示如何启动到自定义恢复或如何刷入自定义恢复镜像。

启动到自定义恢复镜像

一旦确认引导加载程序已解锁,检查员将需要从一个自定义恢复镜像启动。一个很好的恢复镜像来源是 twrp.me/Devices/

选择正确的恢复镜像对于被检查的设备至关重要;它们不可互换,启动错误的镜像可能会使设备变砖。

一旦选择并下载了恢复镜像,设备需要进入 fastboot 模式。这可以通过以下两种方式之一实现:

  • ADB

  • 物理设备按钮

要通过 ADB 进入 fastboot 模式,设备必须已经启用 USB 调试。以下是通过 ADB 进入 fastboot 模式的命令:

adb reboot bootloader

如果无法启用 USB 调试或无法使用 ADB,通常也有一组按键可以在设备启动时按下,类似于进入恢复模式。每个设备的确切组合可以在网上查找。

一旦设备进入 fastboot 模式,运行以下命令将验证设备是否已连接并准备好进行通信:

fastboot devices

以下命令将把自定义恢复镜像加载到 RAM 中并启动设备进入恢复模式:

fastboot boot 'path to image'

设备现在应该重新启动并进入恢复模式。如恢复模式部分所示,可能需要挂载/data分区才能访问用户数据。

如果 fastboot boot 命令失败,可能表示设备的引导加载程序已锁定。

使用 adb shell 来确定设备是否已 root

确定设备是否已 root 的最简单方法是使用 adb shell。这将在设备上打开一个 shell,并将其访问权限传递到检查员的计算机;这意味着在 shell 中运行的任何命令都将在设备上执行。一旦启用了 USB 调试并绕过了安全 USB 调试(或从恢复模式,如后续讨论的那样),在本地计算机上打开终端并运行以下命令:

adb shell

shell 可能以两种方式之一出现,要么是 $,要么是 #

在 Linux 系统上,# 用于表示 root 用户;$ 表示非 root 用户。如果 shell 返回显示 #,则说明 shell 已具有 root 权限:

在一些已 root 的设备上,可能需要进一步的步骤。如果 shell 返回 $,尝试运行 su 命令(如前面的截图所示):

su

如果设备上安装了 su 二进制文件(通常是 root 过程的一部分),则如果 shell 没有以 root 权限打开,这将提升 shell 的权限为 root。

请注意,一些旧设备会自动以 root 权限运行 shell;只需打开 adb shell 可能就足以给检查员 root 权限。

adb pull

如第二章中所述,设置 Android 法医环境adb pull 用于将文件从设备传输到本地工作站。以下显示了 adb pull 命令的格式:

adb pull [-p] [-a] <remote> [<local>]

可选的 –p 标志显示传输的进度,而可选的 –a 标志将复制文件的时间戳和模式。<remote> 参数是设备上文件的确切路径。可选的 <local> 参数是文件将在检查员的工作站上写入的路径。如果没有指定本地路径,文件将写入当前工作目录。一个示例 adb pull 命令可能如下所示:

adb pull –p /sdcard/Pictures/1.png D:\Test 

让我们看看以下截图:

该命令将从设备中提取图像文件并将其写入我们选择的目录。同样,请注意,如果您希望提取例如 mmssms.db 数据库(该数据库包含已发送和接收的 SMS 和 MMS),设备必须是 root 的;否则,输出只会显示提取了 0 个文件。

输出显示文件大小为 599401 字节。根据我们的命令,1.png 现在位于 Test 文件夹中。

类似地,如果调查员希望提取整个应用程序的文件,也可以使用 adb pull

这次,adb pull 命令提取了 Pictures 目录中的每个文件。如前面的截图所示,提取了三个文件。传输的总大小显示为 1310468 字节。

甚至可以执行以下操作:

adb pull –p /data/data/ D:\Test

这将从 /data/data 目录中提取所有可用的逻辑文件,并将它们放入检查员的 Test 文件夹中。这与物理镜像不同,因为某些文件会被跳过,已删除的文件不会被复制,但它是提取用户大部分应用数据的简单方法。

adb pull 命令的另一个优势是它对脚本化非常有用。经验丰富的检查员可以维护一个常见文件路径的列表,并编写一个脚本,自动从设备中提取这些文件,甚至让脚本自动提取整个 /data/data 目录。以下是执行此功能的简单 Python 代码示例:

from subprocess import Popen
from os import getcwd
command = "adb pull /data/data " + getcwd() + "\data_from_device"
p = Popen(command)
p.communicate()

请注意,代码并不精细;它的唯一目的是说明 adb 命令脚本化的简便性。至少,正确实现代码应该包括指定输出目录的选项并处理任何错误。然而,之前展示的六行代码足以在启用 USB 调试并且设备已获取 root 权限的情况下,逻辑上提取整个 /data/data 目录。

Fastboot 模式

Fastboot 是 Android 软件开发工具包中内置的另一种协议工具,用于直接与设备的引导加载程序进行交互。从本质上讲,它是 ADB 的更低级版本,常用于将新镜像刷入设备。那么,这对检查员有什么帮助呢?

Fastboot 允许检查员从自定义恢复镜像启动设备,并临时获得 root 权限,从而访问通常无法获得的数据。Fastboot 不要求启用 USB 调试或 root 权限。将自定义引导加载程序加载到设备上的过程通常被商业取证工具用来临时获取设备的 root 权限,但熟练的检查员也可以手动执行该过程。使用这种方法,恢复镜像被加载到 RAM 中;设备上的任何永久性数据都不会以任何方式被更改。

使用 fastboot 的最重要要求是解锁引导加载程序;锁定的引导加载程序不允许设备从没有被制造商专门签名的代码启动。不幸的是,对于取证目的,大多数设备现在都不再出厂时解锁引导加载程序,因为这会带来严重的安全风险,而手动解锁引导加载程序通常会清除用户数据。因此,这种方法可行的设备数量有限。但当它有效时,它对检查员来说是一个非常宝贵的工具。

如果设备启用了全盘加密,这种方法将无法使用。启动到恢复模式将不会解密 /data 分区。

确定引导加载程序状态

与所有涉及 Android 取证的内容一样,没有一种方法可以百分百确定引导加载程序是否被锁定,因为这取决于制造商。要启动到引导加载程序,请使用 adb 命令:

adb reboot bootloader

设备应启动到显示引导加载程序信息的屏幕。通常,这个屏幕会显示引导加载程序的状态,如下图所示。

以下是来自 Nexus 5 的通用标准 fastboot 菜单。请注意,锁定状态指示引导加载程序已解锁:

以下是标准的三星 Odin 模式屏幕;Odin 是三星专有的 fastboot 等效模式:

三星 Odin 模式屏幕

ADB 备份提取

Google 从 Android 4.0(冰淇淋三明治)开始实现了 ADB 备份功能。它允许用户(以及取证检查员)通过 ADB 将应用程序数据备份到本地计算机。这一过程不需要 root 权限,因此对取证非常有用。然而,它并不会获取设备上所有安装的应用程序。当开发者创建一个新应用时,默认情况下允许备份,但开发者可以修改这一设置。实际上,大多数开发者会保持默认设置,这意味着备份会捕获大多数第三方应用程序。不幸的是,大多数 Google 应用禁用了备份功能;像 Gmail 和 Google Maps 这样的应用的完整数据将不会被包含在内。大多数消息应用也存在同样的问题——它们的数据无法通过 ADB 备份获取。

此方法在设备被锁定时无效;需要用户与屏幕进行交互。

通过 ADB 提取备份

adb backup命令的格式如下所示:

adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]

可用的标志如下:

  • -f:指定输出文件的路径。如果未指定,默认为当前工作目录中的backup.ab

  • [-apk|noapk]:选择是否备份.apk文件。默认值为–noapk

  • [-obb|-noobb]:选择是否备份.obb(APK 扩展)文件。默认值为–noobb

  • [-shared|-noshared]:选择是否备份共享存储和 SD 卡中的数据。默认值为–noshared

  • [-all]:包含所有已启用备份的应用程序。

  • [-system|-nosystem]:选择是否包括系统应用程序。默认值为–system

  • [<packages>]:明确指定要备份的应用程序包。如果使用–all–shared,则无需指定。

一个示例adb backup命令,用于捕获所有可能的应用程序数据如下:

adb backup –f C:/Users/0136/Test/backup.ab –shared –all

或者,一个示例adb backup命令,用于捕获特定应用程序的数据如下:

adb backup –f C:/Users/0136/Test/facebook.ab com.facebook.katana

你应该看到类似以下内容的屏幕:

在执行备份时,用户必须在设备上批准备份;这意味着在绕过屏幕锁定之前无法执行备份:

根据安装的应用程序数量,备份过程可能会花费相当长的时间。

解析 ADB 备份

生成的备份数据以.ab文件的形式存储,但实际上是一个经过 Deflate 算法压缩的 TAR 文件。如果在备份创建时在设备上输入了密码,文件还会进行 AES 加密。还应该提到,这些文件可能存在于嫌疑人的计算机上,并可以使用相同的方法进行分析。

有许多免费的工具可以将.ab备份文件转换为可以查看的.tar文件。一个这样的工具是 Android Backup Extractor,网址为:sourceforge.net/projects/adbextractor/

要使用 Android Backup Extractor,只需将其文件提取到备份所在的目录中。运行该工具的命令如下所示:

java –jar abe.jar unpack backup.ab backup.tar

.tar文件将位于命令行指定的路径中,如果没有指定路径,则位于当前工作目录中。可以在 Linux 命令行手动解压.tar文件,也可以使用诸如 WinRAR 或 7Zip 等 Windows 压缩工具:

备份中的目录,在 7-Zip 中查看

ADB 备份中的数据位置

现在,备份已被转换为.tar文件并提取出来,检查员可以查看备份中包含的数据。在我们的示例中,备份根目录下发现了两个目录:

  • apps:包含备份中包含的应用程序的/data/data中的数据

  • shared:包含来自 SD 卡的所有数据;仅在命令行传递了 shared 参数时才会出现

请注意,apps 目录中的文件按其包名存储在目录中(就像在adb shell中看到的/data/data),shared 目录则是用户将 SD 卡插入计算机后看到的内容。以下是从备份中提取的用户数据的良性示例,显示了用户的 Pandora 活动。Pandora 是一款在 Google Play 商店下载量达到百万的流媒体音乐服务。Pandora 的应用数据将包含在备份的apps文件夹中,文件夹名为com.pandora.android

来自备份的 Pandora 目录

这是 Android 应用程序的一个标准布局,如第二章《设置 Android 取证环境》中所讨论的那样。应用程序的数据库将位于db文件夹中:

Pandora 备份的 db 文件夹中的文件

XML 配置设置将位于sp文件夹中:

Pandora 备份的 sp 文件夹中的文件

使用数据库查看器查看pandora.db可以查看用户创建的电台以及创建时间戳:

从备份中的 pandora.db 内容

查看 XML 配置文件,可以在 firstInstallId 下找到应用安装的时间戳。注意,转换时间戳的确切方法在第七章,Android 应用程序的法医分析中有展示:

XML 配置文件内容

如果由于某些奇怪的原因,用户的 Pandora 使用情况在调查中是一个重要问题,那么检查员可以从这两个看似无害的文件中得出什么结论?

首先,lastTransmissionfirstInstallID 时间戳的毫秒级差异表明,应用程序安装后从未被使用。此外,每个站点的创建日期早于应用程序的安装日期,有些情况下提前几年。这可能表明用户在其他设备上使用过 Pandora;这可能对调查高度相关。

虽然 Pandora 通常与数字法医调查无关,但它是可以通过简单的 ADB 备份获取的数据的一个示例。更详细的应用程序分析将在第七章,Android 应用程序的法医分析中介绍。

ADB dumpsys

Dumpsys 是 Android 操作系统中内置的工具,通常用于开发目的,显示设备上正在运行的服务的状态。然而,它也可能包含法医分析中有趣的信息。Dumpsys 不需要 root 权限,但像所有 ADB 命令一样,需要在设备上启用 USB 调试并绕过安全 USB 调试。

可查看的精确服务因设备和 Android 版本而异。要查看所有可能的可转储服务列表,请运行以下命令:

adb shell service list

命令的输出将显示为一个列表,如下所示:

位于冒号前的服务名称是我们将传递给 dumpsys 的参数。一个有效的 dumpsys 命令,使用前面提到的服务编号七(iphonesubinfo),如下所示:

adb shell dumpsys iphonesubinfo

在下文中,我们看到 iphonesubinfo 服务的输出包括设备 IMEI:

有许多在法医分析中有趣的 dumpsys 服务;以下是几个示例。由于 dumpsys 服务可能因操作系统版本和设备而有所不同,此列表并非全面,旨在展示 dumpsys 对法医检查员的实用性:

  • iphonesubinfo

  • batterystats

  • procstats

  • user

  • appops

  • wifi

  • notification

Dumpsys batterystats

Batterystats 用于显示正在运行的应用程序的使用情况。其输出可能非常冗长,具体取决于使用的应用程序数量;在以下截图中,由于输出内容太多,无法在 Windows 命令行中显示,因此将输出重定向到文件:

这显示了我们 Google Chrome 的网络使用情况。此信息可用于证明该应用程序最近被使用,即使 Chrome 在隐身模式下使用,也不会在其他地方留下取证证据,这些信息仍然存在。

注意,Wakelock 部分对于检测恶意软件非常有用。Wakelock 是一种保持设备处于唤醒状态(即不进入睡眠模式)的方法,通常表示某个应用程序试图保持在后台运行。

Dumpsys procstats

Procstats 是一个显示运行中的应用程序处理器使用情况的服务。与 batterystats 类似,它是另一种可以用来显示某个应用程序最近在设备上被使用的方法:

Dumpsys 用户

从 Android Jelly Bean 开始,谷歌为平板设备添加了多用户支持。随着 Lollipop 的发布,谷歌将这一支持扩展到手机设备。在数字取证中,长期以来最具挑战性的问题之一就是证明在进行有罪行动时,设备由谁使用,也就是:谁在键盘后面?

对用户服务运行 dumpsys 将显示所有用户的最后登录信息:

由于一次只能登录一个用户,因此查看最近登录的用户可以识别当前在设备上使用的账户。

Dumpsys App Ops

App Ops 可能是最有趣的 dumpsys 服务。App Ops 这个术语通常用来指代应用程序可以访问的权限。在 Android 的早期版本中,有传言称谷歌将为用户提供撤销特定权限的功能,虽然这一功能从未实现,但这个服务至少保留了下来,并显示应用程序最后一次使用每个可访问权限的时间。以下是来自 Google Chrome 的另一个示例:

在前面的输出中,我们可以看到大约 appopsdumpsys 导出前的 1 小时 7 分钟,Chrome 使用了 TAKE_AUDIO_FOCUS 权限,之后又使用了 AUDIO_MEDIA_VOLUME。这表明 Chrome 被用来听某些东西,并且说明了它发生的时间。

一个更有趣的例子是电话应用:

44 分钟前,用户使用了电话应用并要求 READ_CONTACTS 权限,随后立即使用了 WRITE_CALL_LOG 权限。我们可以推测,用户在 44 分钟前打了一个电话;即使他们之后删除了通话记录。

Dumpsys Wi-Fi

Wi-Fi 服务将显示已保存连接的所有 SSID 列表。例如,这对于证明用户曾经在某个位置是有用的。更详细的 Wi-Fi 信息也可以在文件系统中找到,但需要 root 权限才能查看。使用 dumpsys,我们可以无需 root 权限就能访问这些数据:

Dumpsys 通知

通知服务将提供当前活动通知的信息。这对于记录设备在被扣押时的状态或识别哪个应用正在显示特定通知可能会很有用。每个通知可能非常大,包含大量信息,其中只有一部分可能有用。以下是一个来自 Gmail 应用的来邮件通知示例,其中包含主题(这是测试邮件)和正文(查看测试通知):

Dumpsys 结论

运行不带服务名称的dumpsys命令将对所有可用服务运行dumpsys。然而,输出将非常大,应该将其重定向到文本文件中。在大多数平台上,执行此操作的命令通常如下:

adb shell dumpsys > dumpsys.txt

这将把输出写入当前工作目录下的dumpsys.txt文件。然后可以搜索该输出或运行解析脚本以提取已知的相关字段。

Dumpsys 是一个非常强大的工具,可以显示设备上无法通过其他方式获得的信息。我们建议在每个 Android 设备被扣押后,关闭前运行dumpsys。这样可以保存各种有可能后续使用的信息,并且不需要 root 权限。

Helium 备份提取

根据开发者的说法,Helium 是Android 设备缺失的应用同步和备份解决方案。它不需要 root 权限,可以提取一些 ADB 备份无法获取的数据;例如,短信和通话记录。

实际上,检查员需要两个应用:一个 Android 应用和一个 PC 应用。Android 应用可以从 Google Play 下载:

play.google.com/store/apps/details?id=com.koushikdutta.backup

桌面版本可以在这里获取:

www.clockworkmod.com/carbon

让我们按照以下步骤提取数据:

  1. 一旦你打开 Android 应用,你将看到以下界面:

  1. 打开桌面应用并启用 Helium。你将看到一条消息,提示 Helium 已在你的 Android 设备上启用。

  2. 你可以选择你想备份的数据;在我们的例子中,是消息和通话记录:

  1. 由于我们希望将备份保存到法医工作站,让我们进入右上角的菜单,选择适当的选项,PC 下载:

  1. 检查 Helium 服务器的 IP 地址和端口;在我们的例子中,它是192.168.1.715000

  1. 从你选择的网页浏览器访问该地址,选择你要备份的应用程序,然后点击“开始备份”:

在你的默认下载文件夹中,你会找到一个名为 backup.zip 的 ZIP 压缩包。

压缩包中有三个文件:

  • backup.json:它包含有关备份的信息,如包名、备份日期和智能手机的操作系统版本。

  • com.android.providers.telephony.ab:它本身是一个备份,包含提取的数据,在我们的案例中,是短信和通话记录。

  • com.android.providers.telephony.png:它备份了应用程序的图标。

同样,要提取 com.android.providers.telephony.ab 的内容,我们需要使用 Android Backup Toolkit(sourceforge.net/projects/adbextractor/)中的某个工具,这次使用 Helium Backup Extractor:

java -jar hbe.jar -force com.android.providers.telephony.ab

现在,在当前的工作目录中,有一个 app 文件夹,在 apps\com.android.providers.telephony\cb 目录下,我们可以找到 custom.cb 文件。这个文件包含了以 JSON 格式备份的应用程序数据;这是一个例子:

{"number":"+79165555555","new":1,"duration":10,"date":1540479309458,"type":1}

number 字段显示电话号码,new 字段(如果是最近的通话),duration(通话时长),date(通话日期,采用 Unix 时间戳格式——毫秒),以及 type(通话类型);在我们的案例中,它是 1,即来电。

当然,这种方法可能在法医上不太可靠,因为我们需要在目标移动设备上安装一个应用程序,但有时这是提取宝贵数字证据的唯一方法。更重要的是,许多商业移动法医工具使用小型应用程序,即所谓的代理,在逻辑获取过程中提取更多数据。你将在第八章中了解更多关于 Android 法医工具的内容,Android 法医工具概述

绕过 Android 锁屏

锁屏是 Android 法医检查中最具挑战性的部分。调查的整个过程通常取决于检查员是否能够访问被锁定的设备。虽然有一些绕过的方法,但这往往取决于操作系统版本、设备设置以及检查员的技术能力。没有任何一种方法能够在所有设备上每次都奏效。像 Cellebrite 和 Oxygen 这样的商业法医工具具有相当强大的绕过能力,但远非万无一失。本章将展示检查员如何利用免费工具和方法提高绕过锁定设备的几率。

检查员绝不应尝试猜测设备上的图案/PIN/密码。许多制造商实现了一种设置,在多次失败尝试后会擦除设备。许多厂商还允许用户减少这个失败次数。

锁屏类型

用于保护设备的方法有很多,绕过每种方法的方式各不相同:

  • 无/滑动

  • 图案

  • PIN

  • 密码

  • 智能锁:可信面部、可信声音、可信位置、可信设备、身体检测

可能还存在其他安全选项;由于 Android 是开源的,可能性仅受开发者想象力的限制。这些是 Google 发布的 Android Oreo 系统原生版本中提供的选项。大多数厂商使用的安全选项通常都使用其中一种原生选项作为备用,以防用户无法使用其独特选项登录。首次使用该设置的版本也被称为原生 Android;不同厂商可能会更早实现这些选项。

无/滑动锁屏

滑动解锁 屏幕是大多数 Android 设备的默认设置。它不提供任何安全性,通过在屏幕上按指示方向滑动手指即可绕过。

图案锁屏

图案锁屏是 Android 的标志性安全方法。通常被称为 滑动密码 或类似名称,这要求用户用手指在设备上划出一个图案。绕过此锁定的常见方法是 污迹攻击,通过观察用户手指留下的图案来破解。

密码/PIN 锁屏

熟悉苹果 iOS 的用户会识别此选项。它要求用户输入密码或 PIN 码才能解锁设备。它们被归为一类,因为从取证角度来看,它们是相同的:它们以相同的方式存储密码。

智能锁

智能锁是 Android Lollipop 中引入的术语,尽管面部解锁选项之前已经存在。它们需要特定条件来解锁设备:用户的面部必须被识别,用户必须处于已知位置,或者必须有特定的其他设备在附近。

信任面部

面部解锁按字面意思工作:它通过面部识别来判断用户是否已经设置为信任用户。较早版本的面部锁定容易被信任用户的照片欺骗,尽管较新的版本可能需要用户眨眼才能解锁设备。

信任语音

OK Google 语句可被用户用来解锁手机。这种类型的锁定并不适用于许多设备,因为手机需要在屏幕关闭时持续监听用户的声音,这会消耗电池。

信任位置

信任位置也常被称为 地理围栏。如果用户处于已标记为可信的位置(如家或工作地点),设备将不会锁定。用户无需任何输入,但必须启用 GPS。

信任设备

信任设备通过蓝牙工作;如果设置为信任设备的设备在附近,锁屏将被禁用。这可以与智能手表、通过蓝牙配对的车辆、蓝牙耳机或任何其他支持蓝牙的设备一起使用。

体感检测

体感检测利用手机的运动传感器,例如加速度计和陀螺仪,当设备处于用户手中、口袋或包内时,保持解锁状态。

所有智能锁选项都需要图案/PIN/密码作为备用安全方法。这意味着我们只需要学习如何绕过图案/PIN/密码,就能破解所有的安全选项。

一般绕过信息

在所有情况下,绕过锁屏将需要从设备中获取文件。图案锁以哈希值存储在/data/system/gesture.key,而 PIN/密码锁以哈希值存储在/data/system/password.key(直到 Android 5.0,Lollipop)。此外,password.key的哈希值是加盐的;盐值存储在 Android 4.4 之前的设备中/data/data/com.android.providers.settings/databases/settings.db,在 Android 4.4 及更高版本的设备中则存储在/data/system/locksettings.db

Android 6.0(Marshmallow)引入了 Gatekeeper 密码存储——一种新的 PIN 和图案锁的混淆层。现在,锁存储在gatekeeper.pattern.keygatekeeper.password.key中,不再使用哈希值。Gatekeeper 使用基于哈希的消息认证码HMAC)和硬件支持的密钥来管理和验证密码。

如果设备被锁定,检查员该如何访问这些文件?再次强调,没有一个能够每次都有效的魔法解决方案,但以下是一些可选方案:

  • ADB:

    • 需要 root

    • 需要 USB 调试

    • 需要安全的 USB 调试配对(取决于操作系统版本)

  • 启动进入自定义恢复模式:

    • 不需要 root(root 将通过恢复镜像提供)

    • 不需要 USB 调试(通过 fastboot 实现)

    • 不需要安全的 USB 调试(这一点完全被绕过)

    • 需要解锁的引导加载程序

    • 不适用于加密 userdata 分区的设备

  • JTAG/芯片脱机:

    • 高度复杂

    • 不需要任何特定的设备设置或选项

    • 不适用于加密 userdata 分区的设备

移除 Android 锁屏

PIN 或密码可以通过简单地覆盖或删除文件来绕过。然而,这会改变原始证据,在你的管辖范围内可能不具有法医效力。

使用 ADB 移除 PIN/密码

根据你正在检查的设备及其操作系统版本,可能需要删除不同的文件。如果设备中包含*.key文件在/data/system/目录下,你需要删除这些文件;如果没有此类文件,可能需要删除locksettings.db,如果可能的话,或者更新其中的一些记录(请参见下一节)。

下面是如何通过 ADB 删除感兴趣的文件:

adb shell
su
cd /data/system
rm *.key

现在设备应该重新启动。重启后,将不再需要 PIN 或密码。

使用 ADB 和 SQL 移除 PIN/密码

最近的 Android 设备上没有*.key文件,如运行 Oreo 或 Pie 的设备,但仍然存在/data/system目录下的lockscreen.db数据库。

下面是如何删除此数据库中用于更改的 PIN 或密码的方法:

adb shell
su
cd /data/system
sqlite3 locksettings.db
update locksettings set value=0 where name='lockscreen.password_salt';
update locksettings set value=0 where name='sp-handle';
.quit

重启设备,屏幕锁将被移除。

Android SIM 卡提取

传统上,SIM 卡用于在设备之间传输数据。过去,SIM 卡用于存储多种类型的数据,如下所示:

  • 用户数据

  • 联系人

  • 短信

  • 拨打的电话

  • 网络数据

  • 集成电路卡标识符(ICCID):SIM 卡的序列号

  • 国际移动用户身份(IMSI):将 SIM 卡与特定用户账户绑定的标识符

  • MSISDN:分配给 SIM 卡的电话号码

  • 位置区域标识符(LAI):标识用户所在的基站

  • 认证密钥(Ki):用于认证移动网络

  • 其他各种网络特定信息

随着设备存储容量、SD 卡和云备份的增加,将数据存储在 SIM 卡上的必要性已经减少。因此,大多数现代智能手机通常不会在 SIM 卡上存储大量甚至任何用户数据。前面提到的所有网络数据仍然保留在 SIM 卡上,因为 SIM 卡是连接所有现代(4G)蜂窝网络所必需的。

然而,像所有 Android 设备一样,虽然没有明确规定不能将用户数据存储在 SIM 卡上,但默认情况下它不会发生。各个设备制造商可以轻松决定将用户数据写入 SIM 卡,个人用户也可以下载应用程序来提供该功能。这意味着在取证检查过程中,设备的 SIM 卡应始终进行检查。这是一个非常快速的过程,绝不能忽视。

获取 SIM 卡数据

SIM 卡应始终从设备中取出并单独检查。虽然一些工具声称可以通过设备接口读取 SIM 卡,但这可能无法恢复已删除的数据或 SIM 卡上的所有数据;取证人员要确保所有数据已被获取,唯一的方法是通过经过测试和验证的独立 SIM 卡读取器读取 SIM 卡。

SIM 卡的位置因设备而异,但通常存储在电池下方或位于设备侧面的托盘中。移除 SIM 卡后,应将其放入 SIM 卡读取器中。市场上有数百种 SIM 卡读取器可供选择,所有主要的移动取证工具都配有与其软件兼容的读取器。通常,取证工具还会支持第三方 SIM 读取器。

出人意料的是,市场上缺乏完善且免费的 SIM 卡读取软件。任何使用的软件在实际取证调查之前,应该始终在一个已填充已知数据的 SIM 卡上进行测试和验证。此外,请注意,许多免费的软件适用于较旧的 2G/3G SIM 卡,但可能无法在现代 4G SIM 卡上正常工作。我们在以下截图中使用了 Mobiledit! Lite,这是 Mobiledit!的免费版本。可以在以下网址下载:www.mobiledit.com/downloads

以下是从运行 Android 4.4.4 版本的 Android 手机中提取的 4G SIM 卡示例;请注意,尽管该 SIM 卡已活跃使用超过一年,但未获取任何可视为用户数据的内容,尽管诸如 ICCID、IMSI 和 MSISDN(本机号码)等字段可能对传票/令状或调查的其他方面有所帮助:

SIM 卡提取概述

以下截图突出了 SIM 卡上的短信:

以下截图突出了 SIM 卡的通讯录:

以下截图突出了 SIM 卡的电话号码(也称为 MSISDN):

SIM 卡安全

由于 SIM 卡符合既定的国际标准,所有 SIM 卡提供相同的安全功能:一个 4 到 8 位的 PIN。通常,必须通过设备上的菜单来设置此 PIN。在 Android 设备上,这个设置可以在“设置”|“安全”|“设置 SIM 卡锁定”中找到。SIM PIN 完全独立于任何锁屏安全设置,只有在设备启动时才需要输入。SIM PIN 仅保护 SIM 上的用户数据;即使 SIM 卡被 PIN 锁定,所有网络信息仍然是可以恢复的。

SIM 卡允许三次输入 PIN 尝试;如果其中一次正确,计数器将重置。另一方面,如果所有尝试都失败,SIM 卡将进入个人解锁密钥PUK)模式。PUK 是由运营商分配的 8 位数字,通常可以在购买 SIM 卡时的文档中找到。通过任何商业法医软件都无法绕过 PUK;因此,检查员绝不应尝试在设备上输入 PIN,因为设备不会显示剩余尝试次数,直到 PUK 激活为止。检查员可能会不小心将 SIM 卡锁定在 PUK 模式,无法访问设备。然而,法医工具会显示在 PUK 激活前剩余的尝试次数,如前面的截图所示。

SIM 卡的常见运营商默认 PIN 是 0000 和 1234。如果在激活 PUK 前剩余三次尝试,检查员可能会使用这些默认 PIN 成功解锁 SIM 卡。

运营商在发放 SIM 卡时通常会保留 PUK 密钥。这些密钥可能通过对运营商发出的传票或令状获得。

SIM 卡克隆

SIM PIN 本身几乎不会提供额外的安全性,并且可以通过 SIM 克隆轻松绕过。SIM 克隆是几乎所有商业移动取证软件都提供的功能,尽管“克隆”这个术语有点误导。在移动取证的情况下,SIM 克隆是指将网络数据从一个锁定的 SIM 卡复制到一个法医干净的 SIM 卡上,这个 SIM 卡没有激活 PIN。手机会基于这些网络数据(通常是 ICCID 和 IMSI)识别克隆的 SIM 卡,并认为它与之前插入的 SIM 卡相同,但这次没有 SIM PIN。此克隆 SIM 卡也无法访问蜂窝网络,这使得它成为类似于飞行模式的有效解决方案。因此,SIM 克隆将允许检查员访问设备,但原始 SIM 卡上的用户数据仍然无法访问,因为它被 PIN 保护。

我们不知道任何可以执行法医 SIM 克隆的免费软件。然而,几乎所有商业移动取证工具包都支持此功能。这些工具包通常包括一个 SIM 卡读取器、用于执行克隆的软件以及多个空白 SIM 卡用于克隆过程。

总结

本章讨论了与 Android 设备的逻辑提取相关的多个主题。作为总结,以下是各种方法及其要求:

方法要求
ADB 拉取
  • 启用 USB 调试

  • 在 4.2.2+ 版本中绕过安全 USB 调试

  • 获取 root 权限以获取用户数据

|

从恢复模式下拉取 ADB
  • 必须使用自定义恢复模式才能启用 ADB 访问

  • 获取 root 权限以获取用户数据

|

从自定义恢复镜像启动 Fastboot
  • 解锁的引导加载程序

  • 设备的启动镜像

|

ADB 备份
  • 启用 USB 调试

  • 在 4.2.2+ 版本中绕过安全 USB 调试

  • 必须从正在运行的设备执行(不能在恢复模式下)

|

ADB Dumpsys
  • 启用 USB 调试

  • 在 4.2.2+ 版本中绕过安全 USB 调试

  • 必须从正在运行的设备执行(不能在恢复模式下)

|

SIM 卡提取
  • 无要求,应该独立于设备执行

|

此外,用户的有价值数据还可以从 SD 卡恢复,这将在第五章中讨论,从 Android 设备中物理提取数据

如果屏幕被锁定,检查员可以通过前面列出的方法,从 locksettings.db 数据库中删除关键文件或删除某些记录。

本章包含了大量数据,为了简化理解,下面展示了一个建议的 最佳实践 流程图:

Android 取证流程图