安卓取证教程(一)

原文:zh.annas-archive.org/md5/CEAE4A4C2A963DFCD507E6E1C793EDA6

译者:飞龙

协议:CC BY-NC-SA 4.0

第一章

安卓和移动取证

本章信息

• 安卓平台

• Linux、开源软件和取证

• 安卓开源项目

• 国际化

• 安卓市场

• 安卓取证

引言

数字取证是一个激动人心、发展迅速的领域,可以在各种情况下产生强烈影响,包括内部企业调查、民事诉讼、刑事调查、情报收集以及涉及国家安全的事务。移动取证无疑是发展最快、变化最大的数字取证学科,提供了大量的机会以及挑战。虽然安卓取证有趣的部分涉及从设备获取和分析数据,但重要的是要广泛了解平台和调查中将要使用的工具。深入的了解将帮助取证检查员或安全工程师成功调查和分析安卓设备。

小贴士

书籍更正、更新和软件

本书的所有更正、更新以及软件样本都将在线维护,具体页面如下:

viaforensics.com/education/android-forensics-mobile-security-book/

请定期访问该网站,随着时间的推移,它会不断演进,为读者提供重要且日益增加的价值。除了更正和更新之外,书中提到的部分软件将可供下载。

安卓平台

安卓是一个基于 Linux 2.6 内核的开源移动设备平台,由开放手持设备联盟管理,该联盟由运营商、移动设备和组件制造商以及软件供应商组成。

安卓在智能手机市场产生了重大影响,因此在取证领域也产生了影响。第一款安卓设备推出两年一个月后(2008 年 10 月),安卓成为第二大智能手机平台,占据了 6150 万美国智能手机订阅用户的 26.0%(comScore 报告,未标明日期)。表 1.1 显示了根据 comScore 公司 2010 年 11 月的顶级智能手机平台。

表 1.1 2010 年 11 月美国智能手机订阅用户总数(13 岁以上)

平台智能手机订阅用户的份额(%)
RIM33.5%
谷歌26.0%
苹果25.0%
微软9.0%
棕榈3.9%

但安卓的影响力远远超出了美国市场。根据 Gartner 公司的数据,2010 年第三季度,安卓操作系统(OS)是第二大受欢迎的操作系统,占全球智能手机销量的 25.5%(Gartner 表示,未标明日期),如表 1.2 所示。

表 1.2 2009-2010 年第三季度全球按操作系统划分的终端用户智能手机销售量(以千为单位)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据谷歌投资者网站,谷歌 CEO 埃里克·施密特报告称,截至 2011 年 2 月,每天有超过 35 万台安卓设备被激活(谷歌投资者,未标明日期)。这些统计数据关注的是智能手机市场,而智能手机市场只是市场上众多安卓设备类型中的一种。

安卓的开源性质不仅为行业确立了新的方向,而且使开发者、懂代码的法医分析师,以及(不幸的是)高级犯罪分子能够在最基础的层面上理解设备。随着核心平台的快速成熟并继续免费提供,运营商和硬件供应商都可以将精力集中在旨在保留客户的定制化工作上。

安卓的历史

三十多年来,公司投入了大量资源研发手持计算设备,希望它们能开辟新市场。与传统计算机一样,构建这些设备的核心硬件组件已经取得了显著进步,现在提供了一个虽小但强大的移动平台,用于手持计算机。

安卓开发的核心人物是安迪·鲁宾,他的前雇主包括机器人公司、苹果、WebTV 和 Danger Inc.。他的前公司 Danger Inc.开发了一款智能手机及其支持操作系统,最为人熟知的是 T-Mobile Sidekick。这个移动操作系统 DangerOS 是用 Java 构建的。它提供了一个软件开发工具包,并具有当前智能手机的一些功能。2004 年,鲁宾离开 Danger 公司,开始着手几个新想法。他再次回到智能手机开发领域,并与前公司的几位工程师合作。鲁宾于 2003 年成立的公司名为 Android, Inc.

在团队开始开发时,鲁宾积极向潜在投资者和无线运营商推广安卓系统。他接触的公司之一就是谷歌,随后谷歌在 2005 年 7 月收购了安卓。这次收购,结合涉及移动的新专利和服务,以及大额的无线频谱竞标,引发了人们猜测谷歌正在开发自己的智能手机,甚至可能目标是成为全面的无线运营商。

然而,在 2007 年 11 月 5 日,安迪·鲁宾在谷歌官方博客上宣布了一个更为雄心勃勃的计划(官方谷歌博客,未标明日期):

Android 是第一个真正开放且全面的移动设备平台。它包括操作系统、用户界面和应用程序——所有运行移动电话所需的软件,但没有阻碍移动创新的专有障碍。我们与开放手机联盟合作开发了 Android,该联盟由包括摩托罗拉、高通、HTC 和 T-Mobile 在内的 30 多家技术和移动领导者组成。通过与运营商、设备制造商、开发人员和其他方面的深入合作,我们希望创建一个标准的、开放的移动软件平台,为移动世界启用一个开放生态系统。我们认为,最终结果将是一个更好、更快的创新步伐,为移动客户带来前所未有的应用程序和能力。

一周后,谷歌向开发者发布了一个早期的 Android 软件开发工具包(SDK)预览。这使得谷歌能够从 2008 年 1 月至 2008 年 4 月举办第一届 Android 开发者挑战赛。谷歌预留了 100 万美元奖励最具创新性的 Android 应用。前 50 个应用可以在code.google.com/android/adc/adc_gallery/进行查看。

2008 年 8 月,谷歌宣布推出 Android 市场,开发者可以在那里上传他们的应用,供移动设备所有者浏览和安装。最初的版本不支持付费应用。然而,在 2009 年初增加了这个功能。最后,2008 年 10 月标志着 Android 开源项目(AOSP)的正式发布(Bort, n.d.)以及首款公开可用的 Android 智能手机,T-Mobile G1 的发布。

自成立以来,Android 生态系统已经显著增长,并包含了多样化的贡献者群体。表 1.3 总结了 Android 平台的重要里程碑。

表 1.3 Android 里程碑

日期事件
2005 年 7 月 1 日谷歌收购了 Android 公司
2007 年 11 月 12 日Android 发布
2008 年 8 月 28 日宣布了 Android 市场
2008 年 9 月 23 日发布了 Android 1.0 平台
2008 年 10 月 21 日Android 作为开源软件发布
2009 年 2 月 13 日Android 市场:美国接受付费应用
2009 年 3 月 12 日Android 市场:英国接受付费应用
2009 年 4 月 15 日发布了 Android 1.5(纸杯蛋糕)平台
2009 年 9 月 16 日发布了 Android 1.6(甜甜圈)平台
2009 年 10 月 5 日发布了 Android 2.0/2.1(闪电泡芙)平台
2010 年 5 月 20 日发布了 Android 2.2(冻酸奶)平台
2010 年 5 月 23 日发布了适用于 Nexus One 手机的 Android 2.2
2010 年 12 月 6 日发布了 Android 2.3(姜饼)平台
2011 年 2 月 2 日发布了 Android 3.0(蜂巢)预览版
开放手机联盟

开放手机联盟(OHA)是由移动技术公司组成的合作组织,包括无线运营商、手机和组件制造商、软件开发者以及其他支持和集成公司。该联盟成立于 2007 年 11 月 5 日,最初有 34 个成员。然而,到了 2011 年 1 月,成员数量已接近 80 个。

OHA 承诺“加快移动领域的创新,并为消费者提供更丰富、更便宜、更好的移动体验”([联盟常见问题解答,不详])的主要焦点是协调、开发和发布 Android 设备。谷歌是 OHA 和 AOSP 背后的推动力。有些人抱怨说,这个联盟只是一种营销手段,对成员或消费者几乎没有价值。然而,在 2010 年,新成员不断加入,OHA 无疑将在未来继续发展。截至 2011 年 2 月 3 日,表 1.4 中列出的成员按移动运营商、手机制造商、半导体公司、软件公司和商业化公司分类([联盟成员,不详])。

表 1.4 开放手机联盟成员

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Android 功能特性

尽管我们在下一章中会更深入地探讨各种 Android 设备类型,但这里我们可以讨论大多数 Android 设备共有的几个特性。

首先,Android 从一开始就被设计为可以在线使用,无论是通过全球移动通信系统/码分多址(GSM/CDMA)这样的蜂窝网络,还是无线网络(Wi-Fi)。无论在何种场合,能够保持在线是任何 Android 设备的核心功能。实际上,许多设备都是智能手机,因此支持发送和接收电话、短信以及蜂窝网络上其他的服务。与设备的交互通常是通过触摸屏完成的,但许多设备也允许使用键盘或其他按钮,以便支持用户交互。

Android 设备的第二个核心功能是能够从 Android Market 下载并安装应用程序(app)。这对于许多用户来说是一个主要功能,因为它允许他们扩展设备的功能性。这些应用程序通常也是法医分析师丰富的信息来源。

最后一个核心功能是用户能够在设备上存储他们的数据。这当然是本书详细介绍的取证工作的基础。大多数 Android 设备都配备了一些使用闪存(NAND)内存的设备内存储,以及一个可移动的外部 SD 卡,用于存储更大的数据量。一些近期推出的 HTC 设备现在配备了模拟 SD 卡,这是一个单独的 USB 设备 ID,映射到 NAND,并呈现为 SD 卡。模拟 SD 卡通常使用微软的 FAT32 文件系统格式化。

支持的蜂窝网络

由于智能手机是安卓设备中最大的类别,因此了解安卓目前支持的多种蜂窝技术至关重要。

第一款安卓设备,HTC DREA100 或 T-Mobile G1,是一款全球移动通信系统(Global System for Mobile Communications,简称 GSM)的手机。GSM 是使用最广泛、支持最全面的蜂窝系统,在全球范围内都有很好的支持。在美国支持 GSM 的主要无线提供商包括 AT&T 和 T-Mobile。GSM 系统利用订阅者身份模块(SIM)或通用订阅者身份模块(USIM)来向蜂窝网络识别用户。

安卓支持的下一个蜂窝系统是码分多址(Code Division Multiple Access,简称 CDMA)。CDMA 是用于编码和发送 CDMA 手机使用的语音、数据和控制信号的技术。它在美国很受欢迎,但在世界范围内就不那么受欢迎了。在美国,主要使用的技术标准称为 CDMA2000。主要运营商包括 Verizon Wireless、Sprint、U.S. Cellular 和 Cricket Communications。

安卓支持的最后一个蜂窝系统是集成数字增强网络(Integrated Digital Enhanced Network,简称 iDEN),其主要的吸引力在于支持流行的对讲(push-to-talk,简称 PTT)功能。在美国,唯一支持 iDEN 的大型运营商是 Sprint Nextel(他们也拥有 Boost Mobile)。iDEN 的开发者摩托罗拉还开发了首款支持 iDEN 的安卓手机,摩托罗拉 i1。

谷歌的策略

安卓显然是一个强大的移动设备平台,其开发成本非常高昂。那么为什么谷歌要免费提供安卓呢?

这个问题的答案始于谷歌明确规定的使命 (企业信息:关于,n.d.):

谷歌的使命是组织世界的信息,使其普遍可访问并有用。

手机是最受欢迎的消费品,数量超过 40 亿部。因此,通过免费提供先进的移动技术栈,谷歌认为他们正在实现使命中普遍可访问的部分。但是,显然谷歌还是必须从中获得一些好处。当更多的人上网,更多的人使用搜索,这最终会推动广告收入——这是谷歌主要的收入来源。在 2009 年 3 月的采访中,安迪·鲁宾解释说:

谷歌围绕广告有着很好的商业模式,开源与广告商业模式之间有着自然的联系。开源基本上是一种分销策略,它完全消除了采用的入门障碍。

(Krazit, n.d.)

对 Android 的一项批评是,现在市场非常分散,有不同版本和变种的 Android,这是谷歌向制造商发布 Android 的直接结果。这与其他设备,如 iPhone 形成对比,苹果对硬件和操作系统拥有完全控制权,并对第三方应用程序产生重大影响。然而,鲁宾为这一模式辩护。在同一个采访中,鲁宾进一步评论了这一方面(Krazit, n.d.):

控制整个设备固然很好,(但是)我们要谈论的是 40 亿部手机。当你控制整个设备时,来自单一供应商的快速创新能力是相当有限的。你可以有创新的高峰。你可以在企业市场、某些界面技术或者手机上网业务方面取得成功,但你不能面面俱到。你总是会处于某个细分市场。我们所说的是走出一个细分市场,让人们以他们期望的方式访问互联网。我不想创造互联网的某种衍生物,我不想仅仅拿走互联网的一小部分,我不想在某个角落里用简化版的互联网,我想在真正的互联网上。

因此,通过创建一个既满足消费者需求又满足制造商和无线运营商需求的移动操作系统,谷歌为其盈利的搜索和广告业务提供了一个优秀的分发平台。

应用程序

Android 超越核心移动技术堆栈支持创新的一个重要方式,是允许第三方应用在 Android 上的开发和分发。截至 2011 年 1 月,已有超过 20 万个 Android 应用被开发出来。这当然与苹果的策略相似。然而,它们的做法有一些关键的区别。苹果对其应用商店保持着严格的控制,要求开发者提交到一个有时颇为漫长的审查过程,并由苹果最终批准应用。应用可能会因为多种标准而被拒绝,尤其是如果它们包含任何苹果认为令人反感的内容。另一方面,谷歌在 Android Market 发布应用时几乎不需要审查。尽管谷歌有能力禁止开发者、从 Android Market 移除应用,甚至远程从 Android 设备卸载应用,但总的来说,他们对应用管理的做法是不过多干预的。

Nexus 手机

2010 年 1 月,谷歌发布了自家智能手机,即图 1.1 所示的 Nexus One (N1)。N1 由 HTC 开发,在所有方面,它都是制造商应该如何开发手机的一个理想模型。处理器非常快(1 GHz),运行最新版本的 Android,并且有创新之处,如三个麦克风,用于监测背景噪音并将你的声音融合,以创造尽可能清晰的对话。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.1 由 HTC 制造的谷歌 Nexus One。

N1 由谷歌直接销售,且为解锁状态——许多分析师认为这是对运营商锁定模式的直接挑战,在这种模式下,客户必须签署为期两年的协议才能在设备上获得折扣。N1 也可以通过 T-Mobile 以较低价格获得,前提是用户签署长期合同。最终,N1 的销售并不令人印象深刻,有猜测认为谷歌在实施上失败了(图 1.1)。

然而,当时谷歌也在尝试展示他们认为安卓手机应该如何发布和维护。令许多人惊讶的是,一年后谷歌发布了由三星制造的 Nexus S,如图 1.2 所示。Nexus S 一个有趣的功能是它运行的是 Android 2.3 系统,允许使用 VoIP(语音通话)的本地功能。如果设备有数据连接,无论是Wi-Fi.com还是其他网络,那么它可以使用众多流行的 VoIP 服务来发送和接收电话。在美国,这部手机只在 Best Buy 商店销售,并通过 T-Mobile 提供服务(图 1.2)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.2 由三星制造的谷歌 Nexus S。

目前尚不清楚谷歌推出 Nexus 系列智能手机的总体目标是什么。然而,很明显他们打算发布谷歌品牌的手机,并最终可能会为消费者提供购买和使用智能手机的新灵活性。

Linux、开源软件和取证

开源软件对数字取证领域产生了巨大影响。作为免费开源软件发布的取证工具比闭源解决方案具有巨大优势,包括以下方面:

• 审查源代码并了解确切步骤的能力

• 改进软件并将增强功能与整个社区共享的能力

• 价格

尽管许多免费的开源软件包不提供商业支持模式,但一些公司专门提供支持服务。例如,红帽公司建立了提供 Linux 操作系统支持和服务的重要业务。此外,许多免费开源软件包的维护者通常非常易于接触并对询问作出响应,并且由于他们直接维护软件,通常可以提供更优质的支持。

最重要和典型的免费开源软件就是 Linux 操作系统。Linux 不仅是 Android 的关键组成部分,还可以用作强大的取证工具。

Linux 简史

关于 Linux 的书籍已经有很多,而只将一个部分献给如此重要的操作系统是困难的。网上也有很多关于 Linux 的优秀资源,其中一些专注于将 Linux 作为取证工具。

1991 年,Linus Torvalds 是赫尔辛基大学的学生,他决定开发一个终端模拟器,以便连接到大学的系统。代码是为他的计算机特定开发的,该计算机配备了 Intel 386 处理器。完成初步开发后,他意识到这段代码实际上可以构成一个操作系统的基础,并在 Usenet newsgroup comp.os.minix 上发布了以下著名的消息(Torvalds, 1991):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阅读这篇文章,许多热衷于 Linux 用户的思维方式体现在了想要理解、修改、创建和 otherwise 钻研复杂系统(通常被称为黑客心态)的愿望中。Linus 发布消息的 newsgroup 是为 Minix OS,当时许多想要测试和开发类似 Unix 的 OS 的人选择的操作系统。然而,Minix 的许可限制以及技术局限性是 Linus 想要克服的。

在近 20 年的时间里,Linux 已经显著成熟,并用于许多个人电脑、服务器,现在也用于移动设备。有数千个强大的工具以及许多编程语言的完整开发环境可供使用。有许多针对不同需求(包括服务器、工作站、笔记本电脑、嵌入式设备、安全套件等)的发行版。

在 VirtualBox 中安装 Linux

Linux 是一个真正令人惊叹的操作系统,我们将在本书中以实例的形式利用它的力量,让读者跟随并完成。本书中的所有示例都是在运行虚拟机(VM)的 Ubuntu 10.10 64 位桌面安装上执行的。尽管来自多个供应商的虚拟机软件是兼容的(包括在 Mac OS X 上运行的 VMWare Fusion),但本书关注的是免费、开源或两者兼备的选项。在这种情况下,VirtualBox 既是开源软件,也是免费提供的。

注意

本书将广泛使用这个 Ubuntu VM 进行所有示例。后续章节将在此基础上增加更多工具和脚本。我们鼓励读者创建这个 Ubuntu VM,跟随所有示例以最大化知识吸收。Ubuntu VM 可以直接用于 Android 取证案例。

VirtualBox 现在归 Oracle 所有,并根据 GPLv2 许可进行分发。Oracle 的网站上有一个部分,专门解答关于许可的常见问题。

您可以从www.virtualbox.org/为许多操作系统下载 VirtualBox,包括 Microsoft Windows、Mac OS X 和 Linux(2.4 和 2.6)。安装 VirtualBox 后,您将看到 Oracle VM VirtualBox Manager,如图 1.3 所示,在这里您可以创建和管理新的虚拟机。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.3 Oracle VM VirtualBox Manager for OS X。

当你创建新的虚拟机时,请确保你有足够的硬盘空间(至少推荐 20 GB)和尽可能多的可用 RAM。对于 Android 构建,谷歌建议至少有 1536 MB(1.5 GB)的 RAM(获取 Android 源代码,未确定日期)。

使用 VirtualBox 管理器的图形用户界面(GUI)设置新的虚拟机非常直接。但是,如果你可以访问 Ubuntu Linux 64 位工作站或服务器,但没有能力运行桌面应用程序,以下是你设置、配置和运行新虚拟机(VirtualBox 3.2.10)的步骤。

从 ssh 会话中,最好使用“screen”程序,这样如果你与服务器失去连接,你的虚拟机仍然保持活动状态。然后,按照以下步骤操作:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这一点上,虚拟机将启动,你可以使用任何远程桌面协议(RDP)查看器访问安装,例如 Windows 上的远程桌面连接,Linux 上的 rdesktop,或者 Mac 上的 Microsoft 远程桌面连接客户端。要访问上述会话,你可以连接到<主机服务器的 IP:3392>。从那里,按照安装指导操作,直到需要重启。

如果您关闭或重新启动 VBoxHeadless 会话,会话将结束;你可以再次运行命令来启动服务器备份。然后,通过 RDP 重新进入机器并安装 openssh 服务器,这样我们可以使用效率更高的 ssh 而不是 RDP:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可以通过运行 ifconfig 并查看 eth0 的“inet addr”来找到虚拟机的 IP 地址。你可以使用你喜欢的 ssh 程序(如果在 Windows 上,可以尝试出色的免费客户端 Putty)并通过 ssh 进入虚拟机。

The Sleuth Kit(TSK)

布莱恩·卡里尔有一个优秀的开源取证工具包,名为 The Sleuth Kit(TSK),本节将讨论这个工具。本书中的示例将广泛使用 TSK。布莱恩开发并继续维护 TSK,为我们的行业提供了巨大的服务。如果你不熟悉 TSK,请访问sleuthkit.org/的网站,并考虑使用这些程序。TSK 的网站上有很多信息,以及许多取证博客和书籍。如果你打算按照本书中的示例操作,你应该在 Linux 工作站上安装 TSK,命令如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

希望其他人能跟随布莱恩的脚步,为取证社区提供如此重要的工具包和服务。

禁用自动挂载

关键是取证工作站不能启用自动挂载,正如其名称所暗示的,当在连接的设备上发现文件系统时,它会自动挂载。在 Ubuntu 中禁用自动挂载的选项是按用户进行的,因此如果工作站将拥有多个用户账户,请确保你更改每个账户:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后导航到 apps > nautilus > preferences,并确保“media_automount”和“media_automount_open”选项未勾选,如图 图 1.4 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.4 在 Ubuntu 上禁用自动挂载。

然后,你可以关闭 Gnome 配置编辑器。现在,自动挂载已禁用。对于普通用户来说,这需要更多的工作。然而,对于取证分析师来说,这是绝对必要的(使用硬件写保护器也是必要的)。

Linux 和取证—基本命令

在我们设置和配置 Linux 取证工作站之前,提供 Linux 与取证相关性的概述很有帮助。由于对许多文件系统的广泛支持、可用的先进工具以及开发和编译源代码的能力,Linux 工作站是取证调查的强大工具。然而,由于许多检查员不熟悉 Linux,以下部分提供了某些更常见 Linux 命令的分解,包括命令的描述、一般用法以及一个或多个如何应用该命令的示例。

man

“man”命令可以在终端窗口中拉起所请求命令的在线手册。手册将提供命令的详细描述以及其用法(包括该命令的所有选项或“标志”)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在以下示例中,第一个命令列出了“mount”命令手册页的开头,而第二个命令搜索包含“grep”字符的所有手册,这是一个强大的搜索工具。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

help

“help”命令会显示有关请求命令的信息,包括用法和示例,类似于“man”。一些命令使用–help 表示法,而其他命令则简单地使用-h 或-help。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

cd

此命令用于切换到另一个目录。在 Linux 中,特殊字符~用来表示当前用户的家目录。例如,用户 ahoog 在 Linux 系统上的家目录位于/home/ahoog。在文件系统的任何位置,你都可以使用来引用/home/ahoog。这对于文档编写来说很方便,因此在本书中我们都会提到,即使你设置了不同的用户名,命令仍然可以按预期工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

mkdir

“mkdir”命令在当前位置创建一个目录,除非另有指定。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

rmdir/rm

这个命令根据指定的标志删除现有目录或文件。“rmdir” 命令只删除空文件夹。如果目录中有文件,这些文件需要先被删除,然后才能运行“rmdir”命令。“rm” 命令可用于删除文件和文件夹,并在删除前提示用户。你可以使用 -f 选项覆盖提示,但需谨慎使用,因此有“rm minus rf”或 rm -rf 的说法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

nano

“nano”是一个基于终端的编辑器,允许创建和修改文本文件。要创建文件,只需输入命令。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入“nano”将会在终端窗口或 ssh 会话中打开文本编辑器,允许用户输入他们希望的内容,如图 1.5 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.5 使用“nano”创建文件。

输入文本后,按下 Control X 将退出文本编辑器并提示你保存文件。在这种情况下,我们将文件名设置为 newfile.txt。

要修改现有文件,只需在 nano 命令后跟文件名或完整路径和文件名(如果文件在不同的目录中):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ls

这个命令列出文件和文件夹。“ls” 命令在没有指定任何选项的情况下,将只列出当前目录中的文件/文件夹名称。添加“-lh”选项将提供更详细的列表,包括权限、所有权、大小以及日期和时间戳。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

tree

“tree”命令显示指定目录的文件夹层次结构。如果没有指定参数,将使用当前目录。在 Linux 中,当前目录被称为单个“.”,而上一层目录是双点“…”。在以下输出中,使用了当前目录,恰好是当前用户的主目录。用户可以使用“-L”标志指定他们希望查看的目录级别。在第一个示例中,显示了一个级别。而在第二个示例中,显示了源目录和文件的两个级别。别忘了:你可以通过查看手册页(man tree)或指定命令的帮助参数(tree --help)来了解命令的所有细节。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

less

“less”命令一次显示一个指定的文件页面。这个命令通常与其他命令结合使用,以一次显示一个页面的输出。以下命令将在终端窗口中一次显示 sanitize-csv.sh 文件的内容一屏幕。一旦你进入了 less 工具,有几个关键命令需要记住:

• h: 访问帮助菜单

• q: 退出帮助菜单

• 空格键: 显示下一屏幕/页

• b: 显示上一屏幕/页

• /: 搜索一个模式

• Enter: 向下移动一行

• y: 向上移动一行

这个强大的实用工具还有更多的命令和技巧,所以请阅读帮助屏幕,手册页,或者直接在互联网上搜索更多有用的技巧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

cat

“cat”命令将文件内容输出到屏幕或如果指定了则输出到新文件(不保留文件的格式)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此命令还可以用于将多个文件合并为一个(即,通常称为连接文件)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

find

“find”命令用于在目录层次结构中搜索文件。以下命令将列出指定用户主目录中包含的所有文件,包括完整路径。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“find”命令的输出也可以在另一个命令中使用。例如,以下命令将对“find”命令中的文件运行“md5sum”命令。指定了几个参数:

• find:该命令

• ∼:在当前用户的主目录中查找文件

• -type f:只列出普通文件(不列出目录)

• -exec:运行以下命令

• sha256sum:计算文件 sha256 哈希值的实用工具

• {} ;:疯狂的 shell 转义和符号!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你针对大量文件的运行命令,可能会遇到问题。在这种情况下,你应该研究将 file 命令的输出管道传输到一个名为 xargs 的实用工具。

对于大多数 Linux 命令,你还可以将命令的输出保存到文件中。例如,上面相同命令的输出可以保存在用户主目录中的名为 md5.txt 的文件中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对 sha256sum 实用工具运行的 find 命令的输出被重定向到用户主目录中的 sha256sum.txt 文件。

chmod

“change mode”的缩写,这个命令用于改变文件或文件夹的权限。以下列表中提供了许多示例。请注意,这些命令必须在存储“textfile.txt”的目录中运行,或者提供文件的完整路径。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“chmod”命令也可以对一组文件或文件夹运行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

chown

“chown”命令用于更改指定文件或目录的所有者或组。在以下示例中,“textfile.txt”的原始所有者和组是 ahoog。chown 命令将所有者更改为“root”。此命令需要“sudo”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

sudo

在任何命令前加上“sudo”可以让用户获得提升的权限,使他们能够以超级用户或其他用户的身份运行命令。对于某些命令,例如 apt-get(安装软件)、chown(如果你不是所有者,更改所有权)、mount、访问原始磁盘设备等,需要 sudo 权限。要使用 sudo,只需在命令前加上“sudo”,然后系统会提示你输入密码。然后记录命令在 sudo 日志中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

apt-get

apt-get 命令中的“apt”部分代表高级包装工具,允许用户安装和卸载软件,升级现有软件,甚至执行系统更新。要运行此命令,需要 sudo 权限。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

grep

“grep”命令可以在一个文件或一系列文件和文件夹中搜索一个特定的短语。这相当于打开一个文档并执行“查找”特定短语的操作。搜索是区分大小写的,所以如果你不确定一个字母是大写还是小写,你应该指定“-i”(不区分大小写)标志。这个选项可能会根据被搜索文件的大小花费更长时间。

常规用法是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下面包含了一些“grep”用法示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一个命令在用户桌面的所有文件内容中搜索单词“unnecessary”。结果显示这个单词在“textfile.txt”中被找到,并且在“WXP-PRO-OEM.iso”中也匹配到了这个单词。因为这是一个二进制文件,需要执行进一步的技术才能查看内容。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当你更广泛地使用 Linux 进行法医调查时,grep 将变成一个不可或缺的工具。

管道和重定向文件(| 和 >)

管道符“|”(在大多数键盘上位于“Enter”键上方)允许将一个命令的输出发送到另一个命令进行进一步处理。输出也可以使用“>”重定向到另一个文件中。

下面的命令将“cat file.txt”的结果传递给“less”命令,允许用户一次查看一页内容。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一个命令使用 grep 命令在“ch1.xml”中搜索“android”,然后取该搜索的结果并执行另一个不区分大小写的“forensics”搜索。最终结果通过“less”管道显示,一次查看一页。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重定向命令的输出也可以很有帮助。下面的命令将“book.txt”的输出(使用“cat”命令)并复制到用户桌面上名为“newdocument.txt”的文件中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在对特定文件甚至整个磁盘映像运行“strings”命令时,重定向可能非常有帮助,这将在第七章中进一步探讨。

安卓开源项目

安卓背后的开放策略自然导致了安卓源代码通过 AOSP 在 2008 年 10 月 21 日的发布。该网站称(获取安卓源代码,n.d.):

我们创建安卓是为了响应我们在发布移动应用时的自身经验。我们希望确保始终有一个开放的平台供运营商、OEM(原始设备制造商)和开发者使用,以实现他们的创新想法。我们希望确保没有中央故障点,一个行业参与者不能限制或控制其他任何人的创新。我们选择的解决方案是一个开放且开源的平台。

开发策略专注于旗舰设备(例如,Nexus 系列),这使得谷歌能够承担新平台的大部分风险。制造商可以在他们的设备上使用最新版本的安卓,而 AOSP 则开发下一个主要版本。

AOSP 许可证

AOSP 受两个主要软件许可证管理,分别是 Apache 软件许可证 2.0(Apache 2.0 或 ASL2.0)和 GNU 公共许可证 v2(GPLv2)。GPLv2 是一个限制性更强的许可证,它迫使贡献者以相同的许可证分发所有源代码。谷歌认为这将限制安卓的商业支持,因此 GPLv2 主要涵盖将 Linux 内核核心用于安卓的使用。

Apache 2.0 许可证更受商业实体接受,因为它限制较少,不会强迫公司开源所有相关软件。AOSP 解释了为何选择 Apache 2.0 许可证的问题(Licenses, n.d.):

有时有人问为何 Apache 软件许可证 2.0 是安卓首选的许可证。对于用户空间(即非内核)软件,我们确实更喜欢 ASL2.0(以及类似 BSD、MIT 等许可证)而不是其他许可证,如 LGPL。

安卓关于自由和选择。安卓的目的是在移动世界中推动开放,但我们认为不可能预测或规定人们将如何使用我们的软件。因此,尽管我们鼓励每个人制造开放且可修改的设备,但我们认为强迫他们这样做并非我们的职责。使用 LGPL 库通常会强迫他们这样做。

这里有一些我们具体的考虑:

  1. LGPL(简单来说)要求以下其一:向应用程序提供源代码;提供书面源代码要约;或者动态链接 LGPL-ed 库,并允许用户手动升级或替换库。由于 Android 软件通常以静态系统映像的形式发布,因此遵守这些要求最终会限制 OEM 的设计。(例如,用户很难在只读闪存存储上替换库。)

  2. LGPL 要求允许客户修改和逆向工程以调试这些修改。大多数设备制造商不想受到这些条款的约束,因此为了最小化这些公司负担,我们在用户空间最小化使用 LGPL 软件。

  3. 从历史上看,LGPL 库是下游设备制造商和应用程序开发人员合规问题的来源。不幸的是,教育工程师这些问题既困难又进展缓慢。对于设备制造商尽可能容易地遵守许可至关重要。鉴于过去遵守 LGPL 的困难,如果可以避免,最谨慎的做法是根本不使用 LGPL 库。

上文讨论的问题是我们在自己的代码中偏好 ASL2.0 的原因。这不是对 LGPL 或其他许可证的批评。我们对这个话题有强烈的看法,甚至到了我们特意确保尽可能多的代码使用 ASL2.0 的地步。然而,我们热爱所有自由和开源许可证,并尊重其他人的观点和偏好。我们只是决定 ASL2.0 符合我们目标的权利许可证。

开发过程

AOSP 是一个非常复杂且复杂的开源项目,需要全球许多开发者的协作。因此,AOSP 有一套定义明确的角色和流程,必须遵循这些角色和流程才能为项目做出贡献。这些角色包括以下:

• 贡献者/开发者:为项目贡献代码的个人和公司

• 验证人:测试代码更改的个人

• 审批者:决定更改是否被采纳或排除的有经验的开发者

• 项目负责人:通常是负责 AOSP 项目整体管理的谷歌员工

任何人都可以下载、编译和增强 AOSP 项目。图 1.6 展示了开发流程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.6 AOSP 开发过程。

开源在取证中的价值

并非所有的法医鉴定人员都会或需要直接为 AOSP 做出贡献。然而,下载这个软件具有极大的价值。例如,在检查来自 Android 1.5 设备的 Yet Another Flash File System2(YAFFS2)物理镜像时,使用 strings 提取 ASCII 文本时,“silly old name”这个短语经常出现。对于大多数文件系统,鉴定人员可能只能猜测“silly old name”的相关性。但是,通过下载源代码,鉴定人员可以快速搜索这个短语,识别代码,并检查它以获取更多信息。在这种情况下,当更新 YAFFS2 对象的头部(例如,一个文件)时,在特定情况下,名称字段会被设置为“silly old name”。

在 AOSP 的文件 kernel/fs/yaffs2/yaffs_guts.c 中,有一个名为 yaffs_UpdateObjectHeader 的函数。代码中的注释和函数头如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建一个名为“oldName”的变量,内容为“silly old name”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当之前的“ChunkId”大于 0 时,对象头部的名称字段被更新为“oldName”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码还检查原始调用函数是否为对象传递了一个新名称。如果没有为函数提供新的名称值,则使用 oldName 的值(仍然是“silly old name”):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然不是每个鉴定人员都擅长解读程序员代码(在本例中是 C 语言),显然这些信息在法医鉴定中可能是有用的。当然,还有许多其他情况,比如短信如何被时间戳标记或地理标记如何实现,这些都可能为鉴定带来巨大的价值。

下载并编译 AOSP

希望在之前的 YAFFS2 示例中已经证明了参考 Android 源代码的价值。以下部分将介绍你应该遵循的步骤,以从 AOSP 下载并编译最新版本。虽然 Android 2.2 及更早版本可以在 32 位机器上编译,但 AOSP 的最新版本(Android 2.3)及以后的版本需要 64 位计算机。

使用我们之前构建的 Ubuntu 虚拟机,我们现在可以开始更新默认的 Ubuntu 安装,然后从源代码构建 Android。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

恭喜你,你已经从源代码构建了 Android(或者开始了构建过程——这需要一段时间)。

现在,如果你遇到了需要更深入理解的 Android 方面,你可以搜索源代码并了解更多。表 1.5 列出了核心 Android 项目,你会发现这与 Android 源代码树中的目录大致对应。项目信息可以在 AOSP 网站找到,地址是sites.google.com/a/android.com/opensource/projects,该网站提供了每个项目功能的简要描述。

表 1.5 核心 Android 项目

项目描述
bionicC 运行时:libc, libm, libdl, 动态链接器
bootloader/legacy引导加载程序参考代码
build构建系统
dalvikDalvik 虚拟机
development高级开发和调试工具
frameworks/base核心 Android 应用框架库
frameworks/policies/base框架配置策略
hardware/libhardware硬件抽象库
hardware/ril无线接口层
kernelLinux 内核
prebuilt支持 Linux 和 Mac OS 构建的二进制文件
recovery系统恢复环境
system/bluetooth蓝牙工具
system/core最小可启动环境
system/extras低级调试/检查工具
system/wlan/tiTI 1251 WLAN 驱动和工具

国际化

Android 在整个平台对国际语言和地区设置有广泛支持。这不仅允许手机以多种语言显示菜单、网站和其他图形用户界面方面,还支持各种国际键盘格式的输入。

Unicode

Android 支持多种语言的能力的关键在于其对 Unicode 字符的编码和解码能力,Unicode 是行业标准编码方案,支持超过 600 种语言(Languages and scripts, n.d.)。

小贴士

楔形文字支持

对于那些好奇且勇于探索的读者,Unicode 确实支持楔形文字,尽管我们仍在等待有人将 Android 用户界面实现为苏美尔-阿卡德楔形文字。可以在unicode.org/repos/cldr-tmp/trunk/diff/supplemental/languages_and_scripts.html查看 Unicode 支持的语言和脚本的全列表。

键盘

Android 支持许多不同类型的键盘,有时被称为输入方法。例如,在运行 Android 虚拟设备(AVD)时,模拟器允许你更改键盘输入的语言,如图图 1.7 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.7 配有中文数字键盘的 Android 虚拟设备。

AVD 系统自带处理多种语言的能力。在法医调查中,这一点具有重要意义,分析人员必须保持警惕,考虑到一些数据可能以意想不到的语言编码。

ADV 的同一功能在物理 Android 设备上也同样可用。例如,在美国由 Verizon Wireless 分销的 HTC Incredible 手机上,有一个名为语言和键盘的设置。你可以为手机用户界面选择两种语言:英语和西班牙语。然后在文本设置下,你可以选择你的触摸输入设置。从这里,你可以指定键盘类型(QWERTY,电话键盘或紧凑型 QWERTY),从 20 多种国际键盘中选择,为中文文本输入选择特定选项(繁体中文或简体中文),以及许多其他选项。最新版本的 Android(姜饼,2.3)现在支持 57 种语言(Android 2.3 平台, n.d.)。

最后,Android 支持用户安装第三方键盘。一个越来越受欢迎的替代键盘叫做 Swype,它允许用户在键盘上连续拖动手指到每个字母。软件然后能够确定,你输入的单词的概率很高。该软件支持多种语言,是一个可插拔键盘输入的好例子。

定制分支

由于 Android 是作为开源发布的,任何人(包括你,在上面的步骤之后!)都可以下载并定制 Android 源代码。虽然许多最终将他们的更改反馈给 Google 以便纳入 Android 的人,但有些人完全分支了代码并发布了他们自己的 Android 版本。

市场后固件

定制 Android 分支(也称为 Mods,固件和 ROMs)最丰富的例子可能来自 Android 黑客和爱好者社区。这个社区是一个非常庞大且多元化的群体,他们有动力去开发、实验和黑客攻击 Android。他们的一些工作可能涉及在 Android 设备上获取 root 权限,启用新功能,或者仅仅吹嘘他们最新的定制成果。这个社区充满激情,成果丰富,是信息(以及误信息)的绝佳来源,并且他们回应了许多求助请求。如果认真的 Android 研究人员忽视了这个社区,那将是一个疏忽。然而,信息的庞大量使得这成为一个非常耗时的努力。

最受欢迎的社区之一名为 XDA Developers,其自述为“Android 和 Windows Mobile 平台的智能手机爱好者和开发者最大的互联网社区”(xda-developers, n.d.)。他们的网站拥有超过 320 万的注册用户,并运营着一个令人印象深刻的论坛。

许多定制 Mod 在 XDA 上发布,而且开发者本身也经常活跃在社区中。或许最受欢迎的售后固件就是 CyanogenMod。这个固件基于 AOSP,它增加了新功能,并尝试在基于 Android 的 ROM 上提高设备的性能和可靠性,这些 ROM 是由厂商和运营商直接发布的(CyanogenMod,未标明日期)。目前,CyanogenMod 支持来自六家制造商的 17 种不同的智能手机和平板设备:Commitva、Dell、HTC、Motorola、Samsung 和 Viewsonic。这些售后固件在设备上启用了 root 权限,正如我们将在第六章中讨论的,这是获取设备物理获取的关键。

OPhone OS

开放移动手机操作系统(OPhone OS)基于 Android,由中国的软件开发商 Borqs 开发。OPhone OS 是为中国政府的子公司中国移动设计的,中国移动是世界上最大的移动运营商,拥有超过 5 亿用户。2010 年 6 月,OPhone OS 2.0 在北京发布,尽管 Borqs/OPhone OS 在中国以外相对不知名,但它们显然在 Android 生态系统中的重要性和影响力正在增长。在中国内部,Borqs 的 CEO 表示他们只与一家运营商合作,即中国移动,因为在那个国家“你不能侍奉两个主人”(中国的 OPhone,未标明日期)。

因此,他们为中国移动软件保留了 OPhone OS 这个名字。然而,根据他们的网站,他们还开发了一个名为 Android+的 Android 软件分支(中国的 OPhone,未标明日期)。在他们的新闻稿中,Borqs 解释了 Dell Aero 配备了他们的 Android+软件,其中包括类似苹果的用户界面,并且他们的软件也通过 Dell 在巴西和墨西哥进行分发。

在 iPhone(及其他非 Android 设备)上运行 Android

或许最具有争议性的售后固件之一就是能让 Android 在 iPhone 上运行的固件。由于许多移动设备基于 ARM 处理器,因此移植过程是可行的。这使得 Android 能够运行在那些设计用来运行其他操作系统(如 Windows Mobile、Symbian、iOS 等)的设备上。向苹果粉丝展示你那运行着 Android 的漂亮 iPhone,感觉绝对独一无二!

Android 市场

安卓市场是第三方开发者向任何拥有安卓设备的用户发布应用程序的途径。安卓市场最早是在 2008 年 8 月 28 日在谷歌开发者博客上宣布的,作为“一个开放的 内容分发系统,帮助最终用户在他们的安卓设备上找到、购买、下载和安装各种类型的内容”(Android 开发者博客,n.d.)。市场在 2008 年 10 月首次推出时,并不支持付费应用程序。然而,到了 2009 年初,安卓市场在美国和英国都支持付费应用程序。到 2011 年 1 月,安卓市场在 29 个国家支持付费应用程序(支持地区,n.d.)。其他几个国家,尤其是印度,可以使用安卓市场,但目前无法安装付费应用程序。

谷歌对安卓市场的宽松管理方式与苹果对其应用商店的严格管理形成了鲜明对比。尽管安卓市场对用户有服务条款(Android Market 条款,n.d.)和针对开发者的安卓市场开发者分销协议(Android Market 开发者,n.d.),但应用程序发布到市场时无需经过审批过程。相反,谷歌认为应用程序评分将筛选出有缺陷或价值不高的应用程序。

要在安卓市场上发布应用程序,开发者必须注册,支付 25 美元的费用,并使用私钥签署他们的应用程序,这将唯一标识他们在市场上的身份。当用户购买应用程序时,开发者获得 70%的购买价格,剩余的 30%归谷歌所有(有时还包括涉及的运营商)。最初,用户有一个 48 小时的窗口期可以退回应用程序。然而,在 2010 年 12 月,谷歌将这个窗口期缩短到了 15 分钟。

谷歌不仅有能力从安卓市场远程删除应用程序,还可以直接从安卓设备上删除。远程应用程序移除功能是安卓拥有的一种安全控制措施,能够迅速且可扩展地移除危险应用程序,以防止用户进一步暴露于风险之中(Android 开发者博客:锻炼,n.d.)。这项安全控制措施首次在 2010 年 6 月实施,当时一名安全研究员发布了一款概念验证应用程序,该程序可以允许下载并在设备上安装另一个应用程序(Mills, n.d.)。

在安卓开放的精神下,谷歌并不阻止用户直接从开发者的网站在他们的手机上安装应用程序,也不阻止开发一个竞争的应用市场。除了安卓市场,还有几个较小的替代市场。此外,一些大型公司已经宣布或表示有意创建替代的应用商店,包括亚马逊、百思买和威瑞森。

安装应用程序

要从 Android 市场(如图 Fig. 1.8 所示)安装应用,用户首先必须运行市场应用并使用 Gmail 账户登录。该账户允许用户通过 Google Checkout 账户购买付费应用,并提供地址和信用卡信息。最近,谷歌与一些运营商合作,用户可以直接将应用购买费用计入月度无线运营商账单,而不使用 Google Checkout 的信用卡。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.8 显示了运行 Android 2.2 的 HTC Incredible 上的 Android 市场。

市场应用允许用户搜索应用,并按主题或流行度浏览。选择一个应用后,会显示一个专门的应用页面,用户可以从该页面安装应用。专门页面还提供一般信息,如描述、下载次数、平均评分、详细评论、相关应用、开发者信息,最后还提供了反馈或标记应用不适当的机会。

正如我们将要讨论的,权限是 Android 安全性的核心组成部分。一旦用户决定安装应用,他们会看到显示应用请求的所有权限的屏幕,如图 Fig. 1.9 所示。此时,用户可以接受权限并继续安装,或返回上一个屏幕。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.9 显示了 Android 应用权限。

应用随后会被下载并安装,结果会显示在设备顶部的通知栏中。从那里,用户可以运行应用,或随时从应用列表中访问。

要卸载应用,用户可以访问设备的设置,选择应用设置。从那里,他们可以管理应用(参见 Fig. 1.10),这将显示具有各种特征的应用列表,如已下载、正在运行和位于 SD 卡上。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.10 管理应用。

用户选择一个应用后,可以看到应用信息屏幕,显示有关应用的各种信息,并允许用户进行强制停止、清除数据、清除缓存和卸载等操作,如图 Fig. 1.11 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1.11 应用信息,包括卸载。

应用统计

Android 市场正在快速成长。发布六个月后,T-Mobile 的首席技术官 Cole Brodman 表示,用户需要更多过滤器才能从市场上近 2300 个应用中成功找到应用 (Lawson, n.d.)。到 2011 年 1 月,市场上已有超过 20 万个应用,仅 2010 年 11 月就增加了 27,227 个 (Android Market statistics, n.d.)。估计下载应用的数量已超过 25 亿。

显然,应用程序是安全和取证的关键关注领域。第四章中,我们将详细探讨应用程序如何将数据持久化到 Android 设备上,存储了哪些类型的信息,以及如何恢复和分析数据。

安卓取证

显然,我们需要安卓取证。智能手机通常是了解个人信息的唯一电子设备。对于大多数人来说,他们的智能手机在任何时候都很少离他们超过几英尺远,甚至包括睡觉时。该设备融合了个人和公司信息,并有能力存储大量数据,包括短信、电子邮件、GPS 位置、图片、视频等。人们倾向于对智能手机比对任何其他个人或设备更诚实。为什么?因为人们觉得设备是安全的,可以为他们提供问题的答案,这些问题他们可能选择不与任何人分享。不止一位取证检验员开玩笑说,“你搜索的东西代表了你”,这显然是亲眼看到人们如何诚实用手机的第一手经验。

挑战

当然,值得一做的事情都不容易,移动取证尤其是安卓取证面临着许多必须克服的挑战。

数字取证的一个基本目标是防止检验员对目标设备进行任何修改。然而,移动电话缺少可以关闭、连接写保护器并以取证方式镜像的传统硬盘。与智能手机的任何互动都会以某种方式改变设备。因此,检验员在检查移动设备时必须使用他们的判断力,如果设备被修改了,他们必须解释它是如何被修改的,以及为什么做出这样的选择,这同样重要。

一些取证检验员对此方法持有异议,并引发了争论。然而,可能改变针对取证目标的计算机的技术已经被使用了一段时间。例如,在恶意软件攻击的调查中,通常需要进行实时内存分析。同样,如果硬盘被加密,检验员必须在设备运行时进行镜像处理,否则他们可能永远无法访问硬盘上的数据。其他典型的例子是因复杂环境而必须保持在线的系统,这在涉及大型企业服务器的案件中很常见。尽管每位检验员都应努力不改变他们正在调查的设备,但在移动世界中这几乎是不可能的。因此,如果不能修改设备,那么唯一的选择就是不对设备进行检验。显然,这种选择是不可接受的,因为移动取证在许多调查中都是关键证据,甚至已经解决了很多犯罪案件。

进一步复杂化 Android 取证的是设备的多样性、Android 版本以及应用程序。仅设备和 Android 版本的排列组合就有数千种,每个设备加上平台都有其独特的特性。尽管可以对每部 Android 手机进行逻辑分析,但庞大的组合使得完全物理获取所有 Android 设备几乎不可能实现。即使是 Android 版本中的微小差异,在高风险案件中也可能需要广泛的测试和验证。

摘要

Android 是一个快速成长、功能丰富且令人兴奋的移动平台。特性、连接性和流行度的结合自然导致了 Android 取证需求的增长。尽管移动取证的难度在增加,但其价值也在提升。Android 的开源特性极大地帮助取证分析师掌握了所需的基础知识,使得 Android 成为一个理想的作业平台。

参考文献

开放手持设备联盟常见问题解答。(未注明日期)。2011 年 1 月 3 日检索。

开放手持设备联盟成员。(未注明日期)。开放手持设备联盟。2011 年 3 月 9 日检索自 www.openhandsetalliance.com/oha_members.html

Android 开发者博客:Android 市场:一个用户驱动的 content 分发系统。(未注明日期)。2011 年 1 月 9 日检索。

Android 开发者博客:锻炼我们的远程应用移除功能。(未注明日期)。2011 年 1 月 9 日检索。

Android Market 开发者分发协议。(未注明日期)。2011 年 1 月 9 日检索。

Android Market 服务条款。(未注明日期)。2011 年 1 月 9 日检索。

来自 AndroLib 的 Android Market 统计数据,Androlib,Android 应用和游戏目录。(未注明日期)。2011 年 1 月 9 日检索。

Android 2.3 平台和 Android 开发者。(未注明日期)。2011 年 1 月 8 日检索。

9. Bort, D.(未注明日期)Android 现在可以作为开源使用。Android 开源项目。2011 年 1 月 3 日检索自sites.google.com/a/android.com/opensource/posts/opensource

10. 中国的 OPhone 将作为 Android 进入美国市场+。(未注明日期)。2011 年 1 月 8 日检索自www.borqs.com/news.jsp

11. 公司信息:关于。(未注明日期)。谷歌。2011 年 1 月 4 日检索自www.google.com/corporate/

12. comScore 报告 2010 年 11 月美国移动用户市场份额。(未注明日期)。comScore 公司。2011 年 1 月 9 日检索自www.comscore.com/Press_Events/Press_Releases/2011/1/comScore_Reports_November

13. 关于 CyanogenMod 的 Rom,CyanogenMod。(未注明日期)。2011 年 1 月 8 日检索自www.cyanogenmod.com/about

14. 高德纳报告称,2010 年第三季度全球手机销量增长了 35%,智能手机销量增加了 96%。(未注明日期)技术研究和商业领袖洞察。高德纳公司。2011 年 3 月 9 日检索自www.gartner.com/it/page.jsp?id=1466313

15. 获取 Android 源代码,Android 开源。(未注明日期)。2011 年 3 月 9 日检索自source.android.com/source/download.html

16. 谷歌投资者:谷歌 Android 每天激活 350,000 个设备(数据可视化视频)“顶级全球智能手机平台”。(未注明日期)。2011 年 3 月 9 日检索自googinvestor.blogspot.com/2011/03/google-android-activations-350k-daily.html

17. Krazit, T.(未注明日期)谷歌的 Rubin:Android“一场革命”。数字媒体—CNET 新闻。技术新闻—CNET 新闻。2011 年 1 月 5 日检索自news.cnet.com/8301-1023_3-10245994-93.html

18. 许可证。(未注明日期)Android 开源。2011 年 1 月 5 日检索自source.android.com/source/licenses.html

19. 语言和脚本。(未注明日期)Unicode 联盟unicode.org/repos/cldr-tmp/trunk/diff/supplemental/languages_and_scripts.html

20. Lawson, S.(未注明日期)T-Mobile 表示 Android 市场需要更多过滤器。ITworld,IT 新闻,技术分析和操作资源。2011 年 1 月 9 日检索自www.itworld.com/personal-tech/64481/android-market-needs-more-filters-t-mobile-says

21. Mills, E.(未注明日期)。谷歌远程清除 Android 手机上的应用。InSecurity Complex—CNET 新闻。科技新闻—CNET 新闻。2011 年 1 月 9 日检索,来自 news.cnet.com/8301-27080_3-20008922-245.html

22. 官方谷歌博客:我的 Gphone 在哪里?(未注明日期)。2011 年 1 月 2 日检索,来自 googleblog.blogspot.com/2007/11/wheres-my-gphone.html

23. 商家支持的位置——Android Market 帮助。(未注明日期)。2011 年 1 月 9 日检索,来自 www.google.com/support/androidmarket/bin/answer.py?hl = en&answer = 150324。

24. Torvalds, L.(1991 年 10 月 5 日)。适用于 386-AT 的类似 Minix 的自由内核源代码——comp.os.minix。Google 群组。2011 年 3 月 3 日检索,来自 groups.google.com/group/comp.os.minix/msg/2194d253268b0a1b

25. xda-developers。(未注明日期)。2011 年 1 月 8 日检索,来自 www.xda-developers.com/

第二章

安卓硬件平台

本章信息

• 核心组件概述

• 不同设备类型概述

• 只读存储器和引导加载器

• 制造商

• 特定设备

引言

安卓被设计为与广泛的硬件兼容。这在很大程度上是通过 Linux 内核实现的,多年来它已经演变为支持各种硬件。这是平台的一个重要特点,因为它允许制造商在设计、采购或以其他方式整合理想的安卓设备组件时拥有自由。这一策略导致了强大的双核安卓设备的开发,这些设备具有显著的处理器性能,以及针对入门级无线计划的入门级设备。尽管硬件兼容性对制造商、无线运营商和最终消费者都有利,但多样性给法医分析师和安全工程师带来了挑战。了解安卓的硬件组件、设备类型和启动过程将有助于您全面了解安卓。

核心组件概述

安卓被开发出来以支持广泛的设备和制造商。因此,任何主要组件的列表可能一列出就过时了。然而,有一些在安卓设备中始终如一的组件是值得讨论的。以下组件构成了安卓设备的核心。

中央处理单元

中央处理单元(CPU)是大多数法医分析师相当熟悉的术语,在安卓设备上的作用也没有什么意外。CPU 负责执行操作系统(OS)和应用程序代码,并协调或控制其他核心组件,包括网络、存储、显示和输入设备。

从一开始,大多数(如果不是全部)的安卓设备都使用 ARM 处理器作为其 CPU,这些处理器对于移动平台来说足够强大,但设计上注重低功耗——这是最大化电池寿命的关键因素。

然而,企业和爱好者已经将安卓移植到其他平台上。在企业方面,英特尔已经将安卓移植到他们的 Atom 处理器上。同样,谷歌也在他们的 Google TV 产品中使用了安卓,该产品是基于安卓构建的。还有一些项目,如 Android-x86(Android-x86, n.d.),已经发布了运行在英特尔 x86 架构上的安卓移植版本。一些受支持的平台包括许多 Eee PC 型号和联想 ThinkPad x61 平板电脑。

基带调制解调器/无线电

基带调制解调器和无线电是提供安卓设备连接到蜂窝网络的硬件和软件系统。这使得设备可以进行语音和数据通信。

为了不让主 CPU 处理这些活动,设备设计师通常会利用一个专用的组件来管理蜂窝通信的复杂性。因此,尽管 CPU 可能指导设备的主要活动,但基带调制解调器负责管理蜂窝通信。

在整本书中,我们将交替使用基带基带调制解调器无线电这些术语。尽管这些系统很复杂,这个定义可能忽略了一些细微差别,但对于法医分析师来说,这些区别并不重要。

内存(随机存取存储器和 NAND 闪存)

由于 Android 设备在某种程度上只是计算机,因此需要各种类型的内存来运行。所需的两主要类型的内存是易失性(随机存取存储器[RAM])和非易失性(NAND 闪存)内存。

系统使用 RAM 来加载、执行和操作操作系统、应用程序或数据的关键部分。RAM 是易失性的,这意味着在没有电源的情况下它不会保持状态。

然而,NAND 闪存(我们简称这种内存为 NAND 闪存)是非易失性的,因此,在设备断电后数据仍然得以保存。NAND 闪存用于存储引导加载器、操作系统和用户数据。因此,它是任何法医调查的关键组成部分,类似于在笔记本电脑、台式机或服务器的法医调查中的硬盘。NAND 闪存还具有使其成为移动设备理想的独特属性,同时为程序员带来了一系列挑战(这通常为法医分析师提供了独特的机会)。这些特性将在第四章中详细探讨。

从硬件角度来看,移动设备显然在空间上有很大的限制。通常,RAM 和 NAND 闪存被制造成一个被称为多芯片组件(MCP)的简单部件。在检查 Android 设备组件时,通常 NAND 闪存和 RAM 会被封装成一个 MCP。

尽管图 2.1 是特定于内存制造商 Hynix(用于 Dell Streak 和其他 Android 设备),但这种整体架构是包括 NAND 闪存和 RAM 在内的 MCP 组件的一个很好的描述,还包括适合各种设备的封装选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.1 MCP 架构(Mobile Memory, n.d.)。

全球定位系统

毫无疑问,自包含蜂窝通信以来,移动设备最重要的创新之一是将全球定位系统(GPS)集成到核心产品中。这个功能不仅使用 GPS 卫星网络确定设备的位置,还允许诸如点对点导航、位置感知应用程序等应用,毫无疑问,将来还会有更多有趣的使用方式。

无线(Wi-Fi.com和蓝牙)

除了蜂窝网络,大多数设备还支持额外的无线技术,如Wi-Fi.com提供的高速数据连接和用于连接外部设备(如耳机、键盘、打印机等)的蓝牙。实际上,一些设备可能会省略蜂窝网络连接,这不仅降低了设备的成本和复杂性,也消除了消费者每月的重复收费。这些设备可能仅设计用于家庭使用(例如,家用电话或多媒体设备),或在没有Wi-Fi.com连接时用于离线模式(即平板电脑或电子阅读器)。

安全数字卡

大多数 Android 设备都配备了可拆卸的存储卡,称为安全数字(SD)卡。与设备上的 NAND 闪存一样,SD 卡也是非易失性的,并使用 NAND 闪存技术。然而,由于 SD 卡被设计为便携,它们必须遵守各种物理和通信规范,以便与大多数设备互操作。

SD 卡是大多数 Android 设备与流行的苹果 iPhone 之间的一个明显设计差异。iPhone 设计有 4GB 至 32GB 的板载 NAND 闪存,并不支持 SD 卡。尽管成本更高,但这让设备制造商(在这个情况下是苹果)对设备拥有更多的控制权。在 Android 的情况下,较大的用户文件预期会存储在 SD 卡上。这不仅为消费者提供了一个成本更低且易于升级的存储选项,而且还可以便携,这样如果消费者购买了新手机,他们可以轻松使用现有的 SD 卡转移数据。

近期 HTC 手机(尤其是 HTC Incredible)提供了标准的 SD 卡接口,但并未随机附赠 SD 卡。相反,它们通过切割一部分板载 NAND 内存并模拟成 SD 卡来创建一个虚拟的 SD 卡。这为法医分析师增加了额外的复杂性。分析师首先需要确定是否存在 SD 卡、虚拟 SD 卡,或是其他用户数据存储方式(除了板载 NAND 闪存)。

屏幕

Android 设备上的屏幕显然是一个关键组件。它是用户交互的主要界面,不仅通过视觉显示,还通过响应用户的触摸。屏幕背后的技术是研发的重点。早期的迭代包括液晶显示屏和第二层屏幕,用于检测用户在屏幕上的输入。近期的改进包括更高的显示分辨率、更亮的屏幕、更敏感和复杂的用户触摸交互,以及降低的功耗。实际上,一些近期使用三星 Super AMOLED 技术的 Android 智能手机,因其屏幕性能而受到消费者的好评。

相机

最初,智能手机上的摄像头主要用于拍照。尽管这在当时是一个激动人心的发展,但在这个领域也出现了重大的创新。现在大多数设备还支持视频录制(有些支持高清)。当然,摄像头的质量也在提高,现在通常还包括一个集成的闪光灯。

近期,一些设备配备了两个摄像头。设备背面的第一个摄像头用于拍摄外部图片和视频。而面向前方的第二个摄像头使得像视频会议这样的新应用成为可能。

大多数安卓设备还将摄像头功能与 GPS 结合;因此,你可以记录照片的日期和时间,以及 GPS 坐标。然后你可以轻松地通过网络上传或分享照片,或者通过移动运营商的多媒体信息服务(MMS)发送。

这个领域一个有趣的发展是使用摄像头读取条形码。专业应用程序利用摄像头拍摄条形码的照片,然后分析数据。它可能查找产品评论,确定最佳价格,或者自动将你签到餐厅应用程序,以便你可以评价体验。也许在未来,这些应用程序甚至可能允许你支付你想购买的物品。

这个技术的一个早期实现是谷歌的一款名为 Goggles 的应用。用户可以拍摄任何物体,应用尝试识别该物体。谷歌提供的一个有趣的例子是,游客使用该应用识别他们正在参观的地标。

键盘

你可能会认为键盘的创新空间很小;然而,这绝非事实。大多数安卓设备都配备了触屏技术的屏幕键盘。一些设备还拥有基于硬件的键盘。

强大的软件键盘能适应屏幕方向(即,如果你将屏幕旋转 90 度,键盘也会跟着旋转),并且支持多种语言。

也有一些公司在开发更高效的文本输入方式。例如 Swype Inc. 就开发了一款键盘,用户不需要为每个字母单独选择按键。相反,对于每个词,他们只需从第一个字母开始,然后在不抬起手指的情况下在键盘上滑动到后续的每个字母,直到完成。Swype 键盘然后确定可能的词并完成它(或提供建议)。这种方法已被证明相当成功,我们预计将看到更多 Swype 技术(或类似创新)被整合到安卓键盘中。

电池

电池寿命一直是智能手机用户关注的主要问题。你可能爱你的手机,但不喜欢它的电池寿命。使用设备及其强大组件的人越多,消耗的电量也越多。在尽量减少功耗方面已经做了大量工作。然而,大多数人发现他们必须每天给手机充电。

随着时间的推移,硬件、软件和电池技术的改进可能导致充电频率降低。在这一领域有一些有趣的研究举措,比如无线充电手机,利用人体运动进行持续充电,或者简单地制造更强大的电池。无论改进如何,它们都将受到消费者的欢迎。

对于法医分析师来说,需要记住的一件事是,SD 卡通常位于电池后面。因此,要访问 SD 卡(以及确定确切的设备类型和标识),通常需要移除电池(从而关闭设备电源)。这里有许多需要考虑的因素,我们将在第六章中进行介绍。

通用串行总线

大多数安卓设备支持多个通用串行总线(USB)接口,可以从电脑进行访问。不同设备之间的电缆可能有所不同,但一般来说,USB 接口允许大多数现代操作系统与设备连接。以下是安卓设备公开的一些常见接口:

  1. 仅充电:设备可以通过 USB 电缆充电。

  2. 磁盘接口:设备的部分区域,包括 SD 卡、模拟 SD 卡和其他磁盘接口,作为大容量存储设备向操作系统呈现并可供访问。

  3. 厂商特定接口:这些包括自定义同步协议、用于软件安装的模拟 CD 只读存储器(ROM)驱动器,以及用于共享手机互联网连接的专业连接。

  4. 安卓调试桥(ADB):一个接口,它为用户提供访问设备上的 shell 提示符以及其他高级功能。

在第三章中,我们将探讨磁盘接口和 ADB 接口,这两个接口在安卓设备的法医调查中都是关键组成部分。

加速度计/陀螺仪

安卓可以检测并根据设备的持握或旋转方式来改变用户界面。这通常是通过检测设备加速(或定位)的大小和方向的加速度计来实现的。通常,这被用来在横屏和竖屏之间改变显示。

最新版本的安卓系统(截至本文写作时的 2.3 版本)现在支持陀螺仪,它比加速度计更敏感、更复杂。陀螺仪是对设备移动更灵敏、更准确的测量方式,这对于高级游戏开发至关重要。

扬声器/麦克风

最后,如果没有听或产生声音的能力,智能手机或平板电脑就没什么意思了。与其他组件一样,扬声器和麦克风也在每一代产品中不断成熟。例如,一些 Android 设备包含两个或三个麦克风,结合 Android 软件,它们能够检测并消除背景噪音,提供更好的音质。在本世纪最惊人的技术发展中,扬声器电话已经发展到可以实际用于真实对话的程度!

不同设备类型概览

从这些核心组件出发,设计师们已经创造出了各种各样的设备类型。回到 2008 年 10 月,T-Mobile G1(HTC Dream 100)刚刚发布,当时追踪 Android 设备和类型还相当简单。那时只有 G1,唯一的设备类型就是智能手机。当然,关于新型设备类型的博客文章已经满天飞,但这些都还只是猜测。

然而,到了 2010 年底,Android 设备不仅数量激增,设备类型也变得多样化。有许多网站试图追踪 Android 设备,但大多数都不完整。在准备检查新 Android 设备时,PDAdb.net是一个不错的参考资料,它追踪有关当前和未来设备的重要信息。目前,他们正在追踪超过 300 款运行 Android 的设备,您可以通过他们的 PDAmaster 页面进行搜索(Main Page, n.d.)。

主要的设备类型仍然是智能手机和平板电脑,但超便携式电脑(我们将它们称为上网本)以及电子阅读器的数量也在增长。在创新方面,运行 Android 的 Google TV 设备开始进入市场,一些媒体播放器已经存在,还有多家汽车公司宣布将使用 Android 作为其媒体和导航系统的一部分。最后,还有一整个类别属于“其他”,这些可能是独一无二的产品,或者也可能成为主流。例如家用电器、游戏设备、GPS 接收器、家用电话和音频设备、相框和打印机等。以下部分将详细介绍这些设备类型。

智能手机

智能手机是 Android 设备中最受欢迎的类型。它们几乎包含了上述所有组件,通常也是最为人熟知的。截至 2010 年 10 月,Android 设备在美国智能手机市场占有 22%的份额(Nielsen Wire, n.d.),并且增长迅速。人们普遍认为 Android 将超越 iPhone,或许最终会成为最受欢迎的智能手机平台。

平板电脑

尽管平板电脑已经存在了几十年,但看起来硬件、软件、移动网络和应用程序的融合最终可能产生一个可行的市场。市面上有许多 Android 平板电脑。然而,最新且被广泛宣传的设备是三星 Galaxy Tab™。这款 7 英寸的设备基本上拥有 Android 智能手机的所有组件,但体积更大。尽管平板电脑可能支持蜂窝数据连接(如 Galaxy Tab 所做的),但它们通常仅限于数据和短信/MMS 服务,并不支持蜂窝语音通话。然而,随着语音和数据融合,我们预计平板设备很快将支持 VoIP 电话和视频通话。

上网本

凭借低功耗和高度便携性,上网本成为了安装 Android 系统的良好选择。需要注意的是,Android 与谷歌的另一个项目 Chromium OS 不同,后者是一个开源项目,旨在构建一个操作系统,为那些大部分时间都在网上的人提供快速、简单且更安全的计算体验(Chromium OS, n.d.)。Android 先于 Chromium OS 开发,并且比它成熟得多。

现在市面上的许多 Android 上网本与平板电脑具有共同特征,不同之处在于上网本拥有完整的硬件键盘和通常更大的铰链式屏幕。上网本的主要数据存储介质通常是 NAND 闪存。然而,没有技术上的理由不能使用更传统的硬盘驱动器。

谷歌电视

谷歌像许多过去的公司一样,试图弥合观看广播电视和互联网内容之间的差距。这些设备从内置 Android 的完整电视套装到连接到现有电视的机顶盒不等。但关键在于利用 Android 作为基础操作系统,整合互联网和电视节目,并为开发者提供一个框架,以创造适合这一新媒体的新应用程序。

车载设备(内置)

一个充满激动人心可能性的领域是将 Android 设备集成到汽车中,通常作为导航/抬头显示或娱乐系统的一部分。迄今为止,这些系统通常是每个车辆制造商特定的,导致这些系统在功能、稳定性和有效性上有很大差异。如果制造商集成了不断发展的 Android 操作系统的全部功能,他们将能够专注于用户体验,而不是基础构建块。用户会发现在不同车辆之间以及 Android 设备上有一致性。而且开发者可以针对车辆的具体需求开发应用程序,并获得更广泛的市场分布。最后,可能会有许多其他感兴趣的参与者,如保险公司、律师、研究机构、法医分析师等,他们可以通过多种方式分析这些系统中的信息。

第一款投入生产的运行安卓的汽车是中国上海汽车工业公司开发和推广的荣威 350。此外,许多美国汽车制造商已经宣布支持安卓,从与智能手机的连接到将安卓操作系统完全集成到他们的车辆中。

全球定位系统

如前所述,大多数安卓设备在硬件中内置了 GPS。当 GPS 首次对消费者可用时,制造商创建了自定义操作系统来管理他们的设备。尽管大多数仍然利用他们的自定义系统,但有几个已经转向了安卓操作系统。因此,法医分析师可能会遇到运行安卓的专用 GPS 设备。

其他设备

随着越来越多的新型安卓设备上市,它们很快就会变得过时。安卓对制造商来说是一个太好的交易,不容错过。操作系统是免费的、成熟的,并允许专有开发。它还提供了应用程序开发的机制,无论是内部的还是通过第三方。因此,许多制造商放弃了昂贵的操作系统开发、维护和支持,而是在安卓的基础上进行构建。以下是一些额外的安卓设备类型的例子:

• 家用电器,如洗衣机和微波炉

• 如 Barnes and Noble 的 Nook 电子阅读器

• 媒体播放器

• 办公设备,如复印机

• 家用电话、音频和视频(例如相框)设备

• 专用游戏设备

• 打印机

如你所见,制造商将利用安卓的多种方式无疑会让法医分析师的工作变得有趣(好像它还不够有趣)。

ROM 和引导加载器

安卓设备与其他计算机一样,有一个相当标准的启动过程,允许设备将所需的固件、操作系统和用户数据加载到内存中,以支持全面运行。尽管启动过程本身定义明确,但固件和 ROM 因制造商和设备而异。本节的目的是提供一个关于安卓启动过程的高级概述,因为本书后面将介绍的技术将与设备在各个层面进行交互。本概述旨在高级别,因为对安卓或 Linux 启动过程的深入描述可能很容易就需要一整本书。

本节的大部分信息基于 Enea 公司安卓竞争力中心的 Mattias Björnheden 发表的一篇名为“从开机开始的安卓启动过程”的文章(Björnheden, n.d.)。在文章中,Mattias 确定了安卓启动过程的七个关键步骤:

  1. 开机和芯片上 Boot ROM 代码执行

  2. 引导加载器

  3. Linux 内核

  4. 初始化进程

  5. Zygote 和 Dalvik

  6. 系统服务器

  7. 启动完成

我们将详细研究这些步骤。

开机和芯片上 Boot ROM 代码执行

当 Android 设备首次开机时,与 CPU 配对的特殊启动 ROM 代码被执行以(1)初始化设备硬件和(2)定位启动媒体。ROM 代码特定于设备使用的 CPU。这个启动过程中的步骤类似于用于启动计算机的基本输入输出系统。

例如,硬件黑客社区中非常流行的一款 CPU 是德州仪器的 OMAP3530 ARM 兼容 CPU,它有一本 3444 页的技术参考手册公开可用(OMAP35xx 的公开版本,2010)。尽管阅读技术手册不是每个人都适合的,但它提供了巨大的细节和洞察力,了解 CPU 是如何初始化并加载操作系统的。在第 3373 页,手册提供了一个流程图,详细介绍了整个启动顺序。启动整个过程的 ROM 代码是硬编码在地址 0x00014000 的,这样当设备上电时,CPU 就知道确切的位置来查找启动 ROM,开始启动序列。

一旦设备硬件初始化,ROM 代码就会扫描,直到找到启动媒体(Android 设备将其存储在 NAND 闪存中),并将初始启动加载器复制到内部 RAM 中。然后执行从启动 ROM 跳转到 RAM 中刚加载的代码,如图 2.2 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.2 开启电源和芯片上的启动 ROM 代码。

启动加载器(初始程序加载/第二程序加载器)

启动加载器现在从启动媒体复制到内部 RAM 中执行。这一步骤类似于在启动 Windows、Mac 和 Linux 等计算机时找到的启动加载器。例如,Linux 的 GRUB 这样的典型计算机启动加载器允许用户选择他们想要启动的操作系统,并相应地加载它。

对于 Android 设备,启动加载器有两个不同的阶段:初始程序加载(IPL)和第二程序加载器(SPL)。IPL 负责检测和设置外部 RAM,这是启动和操作设备所必需的重要组件。一旦外部 RAM 准备就绪,IPL 将 SPL 复制到 RAM 中,然后将执行权转移到 SPL。

SPL 不仅负责加载 Android 操作系统,还提供了访问其他启动模式,如 fastboot、恢复模式或其他旨在更新、调试或服务设备的设计模式。SPL 通常由制造商提供。然而,Android 社区积极创建自己的 SPL(和其他自定义镜像),这些镜像启用了额外的功能和功能。在典型的启动场景中,SPL 将初始化硬件组件,如时钟、控制台、显示、键盘和基带调制解调器以及文件系统、虚拟内存和操作设备所需的其他功能。

然后,SPL 在启动媒体上定位 Linux 内核,将其复制到 RAM 中,加载启动参数,并最终将执行权转移到内核。图 2.3 展示了这个过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.3 引导加载器。

Linux 内核

关于 Linux 内核已经有大量的文献,其中很多内容都可以在线找到。在这本书中,我们只需确认 Linux 内核现在正在控制设备。在设备上设置额外的特性后,将从 NAND 闪存中读取根文件系统,这将提供对系统和用户数据的访问,如图 2.4 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.4 Linux 内核。

初始化过程。

一旦内核可以访问系统分区,它就可以处理启动关键系统和用户进程的 init 脚本。这类似于在传统 Linux 设备上找到的 /etc/init.d 脚本。对于 Android,init.rc 通常位于根文件系统上,并提供内核启动核心服务的详细信息。

在运行 Android 2.2 的 HTC Incredible 上,init.rc 和 init.inc.rc 文件包含超过 650 行,为设备设置提供了大量的洞察。以下是 /init.rc 文件选定部分的内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从法医的角度来看,HTC Incredible 改变了启动过程完成后浏览器存储缓存的方式。/bootcomplete.inc.rc 文件的内容非常说明问题:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如您所见,一旦设备完成启动过程,浏览器缓存就会从存储在 NAND 闪存上的用户数据分区移动到位于 /app-cache 的临时 RAM 磁盘(tmpfs)。这意味着当设备关闭电源时,写入 /app-cache 的任何数据都会丢失,如图 2.5 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.5 初始化过程。

总结来说,init.rc 是设置 Android 设备的基本步骤,可以仔细研究它以了解特定 Android 设备的配置和操作方式。

Zygote 和 Dalvik

在第三章中,我们将详细介绍每个用户应用程序作为运行时沙箱提供的独立虚拟机。Dalvik 虚拟机是谷歌选择用来创建这个应用程序沙箱的技术。在启动时,Zygote 序列基本上设置了 Java 运行环境,并在系统中注册了一个套接字;因此,需要初始化的新应用程序可以请求一个新的 Dalvik 虚拟机。没有 Zygote 服务,Android 内核可以运行。然而,包括电话、浏览器和其他核心功能在内的应用程序都无法操作,如图 2.6 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.6 Zygote 和 Dalvik。

系统服务器

前一节提到的设备的核心功能是由系统服务器启动的。一旦 Java 运行时设置好,Zygote 进程开始监听,系统服务器就会被启动。它运行着设备和其他应用程序依赖的核心功能,如电话、网络和其他基本组件。图 2.7 展示了系统服务器是如何运行的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.7 系统服务器。

系统最终会发送一个名为 ACTION_BOOT_COMPLETED 的标准广播动作,这会通知依赖进程引导过程已经完成。安卓系统现在已经完全运行起来,准备好与用户进行交互。

制造商

谷歌的安卓策略催生了一个多样化的安卓设备制造商群体。在安卓开发者网站上,维护了一份 USB 供应商 ID 列表,目前追踪了 15 家制造商(使用硬件设备,n.d.)。该列表包括以下内容:

• 宏碁

• 戴尔

• 富士康

• 佳明-华硕

• 宏达电

• 华为

• 京瓷

• LG

• 摩托罗拉

• 英伟达

• 帕泰克

• 三星

• 夏普

• 夏普

• 中兴

然而,一旦考虑到上述未列出的制造商和处于规划阶段的设备,安卓设备的制造商超过 50 家。

这当然为法医调查人员和公司安全管理人员带来了独特的挑战。大量的设备制造商、设备类型和设备导致了一系列复杂的策略、程序、技术和甚至是 USB 线缆。

安卓更新

安卓的更新模式是分散的、特定于设备的,并且由运营商或设备制造商负责,而不是谷歌。尽管主要由谷歌影响的开放手持设备联盟负责维护核心的安卓操作系统,但它们并不对特定设备行使控制权。这种分散的方法以多种方式影响设备的法医和安全程序。

首先,分析师永远无法确定一个设备将安装哪个版本的 Android。这在一定程度上是由企业追求尽可能高的利润率所驱动的。特别是在美国,如果消费者购买了一个带有两年合约的 Android 设备,运营商基本上已经锁定了消费者,因为提前终止合约的费用会不断上升。由于用户不太可能升级他们的服务或购买新手机,他们对于运营商来说是一笔固定的收入。升级现有 Android 设备的工程、开发、部署和支持成本相当高。因此,运营商可以选择投资新的 Android 设备,这会引发极大的兴趣并可能带来销售,或者维护现有设备,这几乎不会带来额外的收入。通常情况下,使用旧款 Android 手机的消费者将继续使用较旧、功能较少且安全性较低的 Android 版本。这是谷歌已经承认并声明正在努力解决的问题。

第二,获取 Android 设备的取证映像以及确保其安全性在不同 Android 版本和设备类型之间存在很大差异。例如,分析师针对运行 Android 1.5 和内核 2.6.30.4 或更早版本的 HTC Dream 100(T-Mobile G1)所采用的技术与同一设备运行 Android 1.6 或更高版本内核的技术截然不同。可以想象,超过 50 家制造商,300 多种 Android 设备,四个主要版本和数百个次要版本,可能的组合非常庞大。

第三,连接到不同 Android 设备时所使用的硬件、驱动程序和软件可能会有所不同。第三章讨论的 Android 软件开发工具包(SDK)确实提供了一定的一致性。然而,每个制造商可能都有自己特定的驱动程序和软件。例如,如果将三星 Galaxy S 连接到运行 Windows 的电脑,你需要先安装三星提供的特定软件。然而,许多其他设备通过谷歌的 SDK 提供了标准的 USB 驱动程序。

最后,每个制造商都有自己的启动过程,包括硬件、引导加载器和 ROM 固件。第六章中,我们将探讨一些针对不同制造商设备启动过程的利用技术。

定制用户界面

Android 的部分内容在 Apache 2.0 开源许可下授权,而不是完整的 GPLv2 开源许可。Apache 2.0 许可让制造商和开发者有能力定制 Android 系统的某些部分,同时免除他们向社区返回源代码的义务。Apache 2.0 许可主要涵盖特定设备的驱动程序,这些驱动程序可能包含制造商的知识产权,以及用户界面定制领域。

谷歌允许制造商定制面向目标受众的关键区域,从而使得 Android 设备能够与竞争对手区分开来。例如,一个 Android 设备可能针对青少年市场,专注于短信和社交应用,而另一个设备可能主要针对商务用户。从根本上说,这些设备运行方式非常相似。然而,用户界面定制(以及硬件设计实施)创造了独特的体验。表 2.1 描述了制造商定制的用户界面。

表 2.1 定制 Android 用户界面

制造商定制用户界面
摩托罗拉Motoblur
宏达电Sense
三星TouchWiz
索尼爱立信Rachael, UX, Nexus
宏碁Touch 3D
戴尔Stage
优派TapnTap

市场后 Android 设备

由于 Android 操作系统是开源的,已经创建了定制版本,可以在最初搭载其他操作系统的设备上运行。在一个著名的例子中,存在可以在 iPhone 上安装并运行的 Android 版本(Linux on the iPhone, n.d.)。当这样的壮举完成时,观看苹果粉丝的反应确实很有趣。更实际的是,Android 已经被移植到许多最初搭载 Windows Mobile 的宏达电手机上。还有更多涉及诺基亚等公司以及智能手机以外类别的设备例子。

尽管可能不会经常发生,但考虑到需要司法分析的 Windows 手机(或 iPhone)实际上可能运行的是 Android 系统,这一点很重要。

特定设备

本书将使用以下设备,并在此提供每个设备的简要概述以供参考。其中一些设备是首批商业可用的 Android 智能手机,人们对其非常了解。它们可以以相对合理的价格购买,并且是跟随本书示例进行实验和填充的绝佳设备。

T-Mobile G1

如图 2.8 所示的 T-Mobile G1 是由宏达电制造,并于 2008 年 10 月由 T-Mobile 在美国市场推出。像许多第一代设备一样,这款手机存在可用性问题。然而,在最初六个月内,它的销量超过了一百万台(Krazit, n.d.),作为参考手机非常出色。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.8 T-Mobile G1 (DREA100)。

设备信息:

• 制造商:宏达电

• 型号:G1(又名:HTC Dream 100)

• 运营商:T-Mobile

• 发布日期:2008 年 10 月

摩托罗拉 Droid

如图 2.9 所示的摩托罗拉 Droid 由摩托罗拉制造,并于 2009 年 11 月由威瑞森在美国市场发布。在最初的 74 天内,售出了 105 万部 Droid 智能手机,比 2007 年 6 月发布的原始 iPhone 更受欢迎(第 74 天销售情况,不详)。Droid 是一款出色的参考手机,如果你在考虑购买测试设备,你应强烈考虑这款设备。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.9 摩托罗拉 Droid (A855)。

设备信息:

• 制造商:摩托罗拉移动设备

• 型号:A855

• 运营商:威瑞森无线

• 发布日期:2009 年 11 月

HTC Incredible

如图 2.10 所示的 HTC Incredible 在威瑞森网络发布,在美国也非常受欢迎。本书广泛使用该设备作为参考手机。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.10 HTC Incredible。

设备信息:

• 制造商:HTC

• 型号:ADR6300

• 运营商:威瑞森无线

• 发布日期:2010 年 4 月

谷歌 Nexus One

如第一章所述,谷歌在 2010 年 1 月推出了自己的智能手机,Nexus One(N1),如图 2.11 所示。N1 由 HTC 开发,在各方面都是制造商应该如何开发手机的理想典范。其处理器速度极快(1 GHz),运行的是最新版本的 Android 系统,并具有诸如三个麦克风监测背景噪音并将你的声音融合以创造尽可能清晰的对话等创新功能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2.11 谷歌 Nexus One (N1)。

设备信息:

• 制造商:HTC

• 型号:HTC Passion

• 运营商:T-Mobile,威瑞森,沃达丰

• 发布日期:2010 年 1 月

概述

尽管设备组件各不相同,但大多数设备都有几个核心组件是共通的。在许多情况下,对这些组件的基本了解以及对各种设备类型的了解对法医分析师来说已经足够。然而,在调查中显然还有许多其他不同的因素需要考虑。启动过程的高级概述为更深入讨论这些过程奠定了基础,这些将在后续进行进一步探讨。最后,制造商和设备的概述使分析师能够洞察需要考虑的各种因素。Android 市场是分散和多样化的,法医分析师需要记住,在调查 Android 设备时,“一刀切”的策略是行不通的。

参考文献

1. Android-x86—将 Android 移植到 x86。(不详)。2011 年 3 月 9 日检索自www.android-x86.org/

2. Bjo¨rnheden, M.(未注明日期)。Enea Android Blog: 从开机分析 Android 启动过程。2010 年 12 月 17 日检索自Android 启动过程从开机分析

3. Chromium OS—Chromium 项目。(未注明日期)。2010 年 12 月 13 日检索自Chromium OS—Chromium 项目

4. 第 74 天销售:苹果 iPhone vs. 谷歌 Nexus One vs. 摩托罗拉 Droid。(未注明日期)。The Flurry Blog—移动应用分析 jiPhone 分析 jAndroid 分析。2010 年 12 月 18 日检索自第 74 天销售:苹果 iPhone vs. 谷歌 Nexus One vs. 摩托罗拉 Droid

5. Krazit, T.(未注明日期)。T-Mobile 已售出 100 万部 G1 Android 手机。《无线 dCNET 新闻》。技术新闻 dCNET 新闻。2010 年 12 月 18 日检索自T-Mobile 已售出 100 万部 G1 Android 手机

6. Linux 在 iPhone 上。(未注明日期)。2010 年 12 月 15 日检索自Linux 在 iPhone 上

7. 主页面 jPDAdb.net—智能手机、PDA、PDA 手机、PNA、上网本和移动设备规格的综合性数据库。(未注明日期)。2010 年 11 月 28 日检索自jPDAdb.net—智能手机、PDA、PDA 手机、PNA、上网本和移动设备规格的综合性数据库

8. 移动内存。(未注明日期)。Hynix。2011 年 3 月 9 日检索自Hynix 移动内存

9. Nielsen Wire。(未注明日期)。美国智能手机之战升温:哪个是“最想要的”操作系统?。2010 年 12 月 12 日检索自美国智能手机之战升温:哪个是“最想要的”操作系统?

10. OMAP35xx 的公共版本。(2010 年)。技术参考手册—版本 M (SPRUF98M)。德克萨斯州休斯顿:德州仪器公司。2010 年 12 月 17 日检索自OMAP3530 技术参考手册

11. 使用硬件设备。(未注明日期)。Android 开发者。2011 年 3 月 9 日检索自Android 开发者:使用硬件设备

第三章

Android 软件开发工具包和 Android 调试桥

本章信息

• Android 平台

• 软件开发工具包(SDK)

• Android 安全模型

• 取证与 SDK

引言

Android 软件开发工具包(SDK)不仅提供了在 Android 平台上运行的应用程序创建工具,还提供了文档和实用程序,这些在设备的法医或安全分析中可以提供很大帮助。尽管第二章中提到的 Android 硬件在设备能力中扮演了主要角色,但软件则利用这些功能最终创造了消费者寻求的体验和功能性。对 Android SDK 的彻底了解将为我们提供许多关于数据和设备以及我们将在调查中利用的重要实用程序的知识。

Android 平台

Android 在 2007 年 11 月正式发布,但从 2005 年起就一直在进行重大开发。结合大量多样的硬件,利用 Android,创造了一个多元化的生态系统,为法医分析师或安全工程师增加了显著的复杂性。

Android 的一个有趣特点是 Android 平台本身的版本。平台是决定设备可以支持哪些功能的重要因素。官方的 Android 平台每个都分配有一个应用程序编程接口(API)级别,所有较新的版本都会有一个代号。截至 2011 年 1 月,当前的发布版本是代号为 Gingerbread 的 Android 2.3。下一个主要版本有一个代号为 Honeycomb,似乎针对的是预期增长的平板设备。表 3.1 列出了包括 API 级别、代号和发布日期在内的所有 Android 平台(Android 时间线,未标明日期)。

表 3.1 Android 平台

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管存在许多 Android 版本,但每个版本在当前设备中的分布情况对法医分析师和安全工程师都有很大影响。图 3.1 展示了基于两周内访问 Android Market 的设备调查的 Google 关于 Android 版本分布的报告(平台版本,未标明日期)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.1 2011 年 1 月 Android 设备平台分布情况。

为了让大家有一个直观的了解,表 3.2 展示了截至 2011 年 11 月,美国流通的各 Android 版本设备总数。这些数据基于大约 1599 万美国 Android 设备人口统计数据(comScore 报告,未标明日期)。

表 3.2 美国按平台划分的 Android 设备数量(近似值)

Android 版本总设备数
Android 2.363,960 台
Android 2.28,282,820 台
Android 2.15,628,480 台
Android 1.61,263,210 台
Android 1.5751,530 台

谷歌还发布了一张图表,显示了 2010 年 8 月至 2011 年 2 月 2 日七个月间 Android 版本的历史分布情况。数据同样基于访问 Android 市场的设备,并清晰地展示了 Android 更新随时间推移的进展,如图图 3.2 所示(Platform Versions, n.d.)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.2 2001 年 8 月至 2011 年 2 月 2 日 Android 版本的历史分布情况。

尽管有些设备永远不会支持 Android 的最新版本,但许多设备最终会收到更新。未来的设备可能能够快速支持和升级到最新版本。然而,从法医和安全的角度来看,不能忽视这些较旧的异常值。

通过 2.3.3(姜饼)的 Android 平台亮点

Android 是一个复杂且高度发展的平台,任何尝试完全记录所有功能的努力都将占据本书的很大一部分。然而,简要概述每个主要版本可能对法医分析师有所帮助,使他们了解设备可能支持的功能。一般来说,功能是相互构建的,因此在 Android 1.5 中可用的功能在 Android 2.3.3 中可能得到改进并提供。

Android 1.5

Android 1.5 于 2009 年 4 月发布,其特点和更新内容在表 3.3 中列出(Android 1.5, n.d.)。

表 3.3 Android 1.5 功能和亮点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Android 1.6

Android 1.6 于 2009 年 9 月发布,其特点和更新内容在表 3.4 中列出(Android 1.6, n.d.)。

表 3.4 Android 1.6 功能和亮点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Androids 2.0 和 2.1

Android 2.0 和 2.1 分别于 2009 年 10 月和 2010 年 1 月发布,其特点和更新内容在表 3.5 中列出(Android 2.1, n.d.)。

表 3.5 Android 2.0/2.1 功能和亮点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Android 2.2

Android 2.2 于 2010 年 5 月发布,其特点和更新内容在表 3.6 中列出。

表 3.6 Android 2.2 功能和亮点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Android 2.3

Android 2.3 于 2010 年 12 月发布,其特点和更新内容在表 3.7 中列出。

表 3.7 Android 2.3 功能和亮点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Android 2.3.3

Android 2.3.3 于 2011 年 2 月发布,其特点和更新内容在表 3.8 中列出。

表 3.8 Android 2.3.3 功能和亮点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

软件开发工具包(SDK)

Android 软件开发工具包(SDK)是开发 Android 应用程序所需的开发资源。它包括软件库和 API、参考资料、模拟器和其他工具。SDK 支持许多环境,包括 Linux、Windows 和 OS X,并且可以从developer.android.com免费下载。

SDK 还是一个强大的取证工具,分析师在许多情况下使用它来帮助调查 Android 设备。

SDK 发布历史

尽管 Android 平台标志着官方支持的 Android 发布版本,但 SDK 更新更为频繁。表 3.9 提供了完整的 SDK 发布历史,可以在这些情况下提供帮助(SDK Archives, n.d.)。

表 3.9 归档的 Android 平台发布

平台API 级别发布日期
Android 1.6 r142009 年 9 月
Android 1.5 r332009 年 7 月
Android 1.1 r122009 年 2 月
Android 1.0 r212008 年 11 月

安装 SDK

由于 SDK 在调查 Android 设备时至关重要,检查员应该有一个正常工作的安装环境。以下部分提供了在支持平台上安装 SDK 的分步指南。

Linux SDK 安装

这些步骤基于在第一章中用于下载和编译 Android 开源项目 (AOSP) 的 Ubuntu VM,该 VM 已经包括大多数先决条件,包括 Java 开发工具包。从终端窗口安装所需的 32 位库:

注意

32 位库

由于在第一章中构建的 Ubuntu VM 使用了 Ubuntu 的 64 位版本,因此我们必须安装 32 位库来安装 SDK。但是,如果你使用的是 32 位 Linux 工作站,则无需完成此步骤。虽然 32 位工作站可以运行 SDK,但它无法构建版本 2.2 之后的 AOSP。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,启动 Firefox 并导航至developer.android.com/sdk,下载 Linux i386 平台版本(截至 2011 年 1 月为 android-sdk_r08-linux_86.tgz)。默认操作将在归档管理器中打开归档,如图 3.3 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.3 下载 Linux 版本的 Android SDK。

然后右键点击并将归档提取到你的主目录中,如图 3.4 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.4 为 Linux 提取 Android SDK。

接下来,在终端窗口中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这将运行 Android SDK 和 Android 虚拟设备 (AVD) 管理器,允许你下载和管理如图 3.5 所示的额外必要组件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.5 Linux 中的 Android SDK 和 AVD 管理器。

为了充分利用 Android SDK,需要安装额外的组件。至少,我们希望安装特定平台的 SDK 工具和至少一个 SDK 平台(在本例中为 Android 2.3),这样我们就可以运行模拟器。要完成安装,请从左侧导航窗格中选择可用包,然后选择如图 3.6 所示的两个附加包。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.6 选择附加的 Android SDK 包。

然后选择安装选定内容。你将被提示批准所有软件包的许可,如图 3.7 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.7 接受并安装 Android SDK 软件包。

选择接受所有(如果你同意)然后安装。Android SDK 和 AVD 管理器将下载并安装组件。

可选地,你可能想要将二进制目录添加到你的操作系统(OS)执行路径中,这样每次就无需指定程序的完整路径。在 Linux 中,执行以下操作:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

保存,退出,然后重新打开(Ctrl-O)一个新的 shell。

在 Ubuntu 中,你必须采取的最后一步是创建系统配置中每个 Android 设备制造商的 USB 配置文件,特别是 udev 规则。以 root 用户从终端会话中编辑/创建 udev 规则:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

复制以下内容(供应商 ID 可以在developer.android.com/guide/developing/device.html#VendorIds找到):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后保存文件。最后,使文件对所有用户可读:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以选择重启 udev 守护进程,或者直接重启。

Windows SDK 安装

Windows 的最新版 Android SDK,如图 3.8 所示,现在被打包成一个可执行的安装程序,该程序将检测你是否已经正确安装了必要的 Java 依赖项,如果没有,它将为你下载并安装它们。然而,安装程序只检测 32 位 JDK 的安装,并不会在 Windows 7 64 位安装上自动安装 JDK。如果你运行的是 32 位版本的 Windows(例如 Windows XP),那么安装程序可能是一个好的选择,你可以直接从developer.android.com/sdk/index.html下载安装包并运行安装程序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.8 Windows 的 Android SDK 安装程序。

然而,许多分析师和工程师已经转向 64 位操作系统。要在 Windows 上安装 Android SDK,首先通过下载java.sun.com/javase/downloads/来安装 Java SE SDK。确保你安装了完整的 SDK。

安装完 SDK 后,在developer.android.com/sdk/index.html下载 Windows 版 Android SDK 的压缩版本,并将其解压到你的硬盘上。在我们的示例中,我们将直接解压到 C:\,这将创建文件夹 C:\android-sdk-windows。

打开该目录,双击 SDK Manager.exe 开始更新过程。确保你至少选择 Android SDK Platform-tools,如图 3.9 所示,以及一个发布平台(在此示例中为 2.3)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.9 Windows 系统的 Android SDK 管理器。

在 Windows 中使用安卓设备时,你需要指定 USB 驱动程序。Android SDK 最近更新了 USB 驱动程序的安装方式。首先,确保你正在运行 SDK 管理器并选择可用包。展开第三方插件 → Google Inc.插件,最后选择如图 3.10 所示的 Google USB 驱动程序包。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.10 Windows 系统的 Google USB 驱动程序包。

然后,接受许可协议并按照图 3.11 所示进行安装。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.11 接受并安装许可协议。

安装完 USB 驱动后,你应该拥有所有必要的组件。然而,为了简化从 Android SDK 运行工具,你应该更新你的工作站的环境变量,特别是可执行文件的 PATH。为此,请进入你的控制面板并打开系统应用程序。然后选择可以更新环境变量的标签,其位置会根据你的 Windows 版本有所不同,如图 3.12 所示。最后,找到 Path 系统变量,选择编辑,并添加到你的 Android SDK platform-tools 目录的完整路径,在我们的示例中是;C:\android-sdk-windows\platform-tools

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.12 更新 PATH 环境变量(Windows 7 64 位)。

“;”很重要,因为它是路径位置的分隔符。完成此更新后,确保退出并等待命令提示符指示新设置已生效。

OS X SDK

在 OS X 上安装 Android SDK,首先从developer.android.com/sdk/index.html下载存档文件,OS X 会自动提取。

导航至图 3.13 所示的工具子目录,然后双击 Android 运行 Android SDK 和 AVD 管理器,如图 3.14 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.13 OS X 的提取 Android SDK。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.14 在 OS X 上打开 Android。

当管理器运行时,选择可用包,展开安卓仓库,然后选择 Android SDK platform-tools 以及至少一个安卓平台,如图 3.15 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.15 在 OS X 上安装 Android SDK 组件。

接受许可协议并完成安装。最后,为了简化从 Android SDK 运行工具,你应该更新你的可执行文件 PATH。在 OS X 10.6 上,运行终端(应用程序 → 实用工具)并执行以下操作:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

确保完全退出终端应用程序然后重新启动。在终端中,输入:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这应该会返回你的可执行路径,并附加了 platform-tools。

安卓虚拟设备(模拟器)

一旦你的工作站上安装了 Android SDK 并且至少下载了一个发布平台,你就可以创建一个 AVD,即虚拟移动设备或模拟器,它在你的电脑上运行。模拟器特别有助于开发者为创建定制应用程序。然而,对于取证分析师和安全工程师来说也具有很高的价值,因为你可以在设备上分析应用程序的执行情况。这在对调查结果进行验证或测试取证工具对 Android 设备的影响时可能很重要。

模拟器需要相当多的资源,因此理想的工作站应该配备较新的 CPU 和足够的 RAM。检查员可能还需要一些耐心。要创建 AVD,首先运行 Android SDK 和 AVD 管理应用程序,如图图 3.16 所示。如果你更新了操作系统的路径,使其包含 SDK 中的工具目录,你应该可以从 shell、终端或命令提示符运行 Android。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.16 启动 Android SDK 和 AVD 管理器。

在左侧窗格中,选择虚拟设备,然后选择新建,如图图 3.17 所示。

确保填写以下字段

• 名称:为虚拟设备提供一个名称,例如,af23(Android Forensics 2.3)。

• 目标:选择目标平台,在本例中为 Android 2.3—API 级别 9。

• [可选] SD 卡:可选地为虚拟设备创建一个 SD 卡。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.17 创建新的 AVD。

你可以设置其他属性。然而,现在我们将创建最基本的 AVD。另外,如果你遇到运行在较旧平台上的 Android 设备,你可以通过简单地使用 Android SDK 和 AVD 管理器下载 Android 平台来创建运行较旧版本的虚拟设备。当你点击创建 AVD 时,设备将被创建,你会看到一个类似于图 3.18 所示的确认屏幕。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.18 AVD 创建确认。

确保新的 AVD 被选中,然后点击开始,此时你会看到如图图 3.19 所示的启动选项提示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.19 AVD 启动选项。

选择你希望启动的任何选项并点击启动。此时,AVD 将开始启动过程,可能需要几分钟或更长时间。在这段时间里,你会看到 Android 正在启动。这如图图 3.20 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.20 AVD 启动中。

最后,你会看到一个完全功能的 AVD,如图图 3.21 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.21 运行的 AVD。

AVD 非常强大且功能齐全。例如,你可以轻松地上网,如图 3.22 所示,浏览网站。你可以配置电子邮件账户,向其他 AVD 发送测试短信,如果你是开发者,当然还可以部署和测试你的应用程序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.22 运行浏览器的 AVD。

创建并启动 AVD 后,生成数据对于取证和安全研究非常有价值。这些文件在你的主目录中创建,根据平台不同而有所变化,在一个名为.android(注意文件名前的点前缀)的文件夹中。表 3.10 提供了特定的操作系统路径。

表 3.10 AVD 存储目录

工作站操作系统AVD 存储目录示例
Ubuntu Linux/home//.android/home/ahoog/.android
Mac OS X/Users//.android/Users/ahoog/.android
Windows 7C:\Users<username>.androidC:\Users\ahoog.android

在 AVD 的.android 目录中,你可以找到运行 AVD 所需的配置和数据文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特别值得注意的是以下具有取证和安全意义的文件

• cache.img:/cache 分区的磁盘映像

• sdcard.img:SD 卡的磁盘映像(如果在 AVD 设置过程中创建)

• userdata-qemu.img:/data 分区的磁盘映像

cache.img 和 userdata-qemu.img 是 YAFFS2 文件系统,目前取证软件不支持,我们将在第四章中介绍。但是,标准的取证工具在 sdcard.img 上工作得很好,因为它是 FAT32 文件系统。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

取证分析师和安全工程师可以通过利用模拟器并检查网络、文件系统和数据痕迹来深入了解 Android 及其运行方式。

安卓操作系统架构

了解 Android 的高级架构非常重要,特别是对于安全程序和超越逻辑取证分析。

Android 基于 Linux 2.6 内核,提供了启动和管理硬件及 Android 应用程序所需的基本软件。虽然内核提供的功能非常广泛,但我们将关注图 3.23 中强调的核心区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.23 安卓架构。

如图 3.23 所示,低级功能包括电源管理、Wi-Fi.com、显示、音频驱动等。从取证的角度来看,最重要的可能是闪存驱动,我们将在第四章中详细探讨。

在内核之后,一套库可供使用,这些库为开发者和设备所有者提供了所需的核心功能。这些包括用于在捆绑的浏览器和第三方应用中渲染 HTML 的 WebKit 库。其他库处理字体、显示、各种媒体,以及使用安全套接字层(SSLs)的安全通信。最后,SQLite 库为 Android 上的结构化数据存储提供了一种方法,这也是法医分析师和安全工程师关注的重点。

核心库随后与自定义的 Java 虚拟机(VM)捆绑在一起,以提供 Android 运行时环境,应用程序就在这里运行。

最后,SDK 通过 API 和一个应用程序框架提供对这些资源的访问。该框架是第三方开发者交互的主要层,它为他们提供了对应用程序所需关键资源的抽象访问。在我们探索逻辑取证技术时,应用程序框架的一个重要方面——内容提供者——将详细解释,因为它们是我们从 Android 设备提取数据的主要机制。

Dalvik VM

Dalvik 虚拟机(Dalvik VM)是由谷歌开发的,旨在创建一个高效且安全的移动应用环境。

为了实现所需的安全性,每个应用程序都在其自己的 Dalvik VM 上运行。因此,Dalvik VM 被编写成可以在 Android 设备上同时运行多个 VM。Dalvik VM 在很大程度上依赖于 Linux 操作系统,提供诸如访问核心库和硬件、威胁和安全管理、内存管理等低级功能。

为了提高效率,在 Dalvik VM 中运行的应用程序有一种特殊的格式,称为 Dalvik 可执行文件(.dex)。开发者使用 Sun 的 Java 开发工具包编写和编译他们的程序,然后生成的字节码被转换成.dex 文件,该文件提供了高效的存储,并针对在 Dalvik VM 中的执行进行了优化。由知名 Android 黑客 JesusFreke 开发的一个有趣的项目叫做 smali/baksmali。这个项目允许用户反编译.dex 文件,以确定应用程序的功能(smali, n.d.)。

Dalvik 是 Android 的一个独特方面,也是设备法医和安全分析的一个关键组件。

本地代码开发

尽管大多数 Android 应用程序是使用 SDK 用 Java 编写的,但谷歌提供了一个更底层的开发平台,即他们的本地开发工具包(NDK)。NDK 首次发布于 2009 年 6 月,并经历了五次修订,最新版本在 2010 年 11 月发布。

NDK 允许开发者在 C/C++中编写代码,并直接为 CPU 编译。虽然这增加了开发过程的复杂性,但一些开发者可以通过重用现有的 C/C++代码库或实现可以在 Dalvik VM 之外优化的某些功能来从中受益。NDK 不允许开发者创建完全在 Dalvik VM 之外运行的应用程序;相反,C/C++组件被打包在应用程序的.apk 文件中,并在 VM 内由应用程序调用。

目前,NDK 支持 ARMv5TE 和 ARMv7-A CPU,将来还会支持英特尔的 x86 CPU 架构。当开发者在一种平台(例如,Mac OS X)上编写代码,但为另一种 CPU 编译时,这种技术被称为交叉编译应用程序。NDK 极大地简化了这一过程,并提供了一套开发者可以使用的库。

从取证和安全的角度来看,交叉编译是研究和开发新技术和漏洞利用的重要部分。尽管大多数取证分析师和安全工程师不需要编译代码,但了解这个过程如何工作以及它在其中扮演的角色是很重要的。例如,最初的 Android 1.5 获取根权限的漏洞利用了 Linux 内核的一个错误(CVE-2009-2692)来获取权限。最初分发的代码是源代码,需要交叉编译。这种方法的一个显著优势是,检查员可以详细描述设备是如何被利用的,并在必要时提供源代码。

随着 Android 的成熟,预计会在 NDK 和本地编译代码方面看到更多的发展。

Android 安全模型

Android 平台通过一系列旨在保护用户的控制措施来实现安全性。

当一个应用程序首次安装时,Android 会检查.apk 文件,以确保它有一个有效的数字签名来识别开发者。与 SSL 不同,数字证书不需要由证书授权中心签署。然而,开发者必须妥善保管密钥;否则,有人可能会签署一个恶意应用程序并以该开发者的身份分发。例如,如果一个金融机构的数字签名被泄露,一个恶意的开发者可以发布一个银行应用程序的更新,窃取关键数据。

在验证了.apk 文件之后,Android 会检查开发者创建的特殊文件,该文件指定了应用程序需要系统权限的各个方面,例如,应用程序可能请求访问用户的联系人、短信和网络/互联网。如果这个应用程序为短信系统增加了功能,这些权限似乎是合理的。然而,如果应用程序只是更改你的背景图片,那么用户应该质疑这个权限,并可以选择不安装该应用程序。实际上,用户通常会快速同意所有权限和应用程序的请求,从而可能允许恶意应用程序安装。

在应用程序经过验证并且用户授予了请求的权限之后,应用程序现在可以在系统上安装。Android 安全模型的一个关键部分是,每个应用程序都会分配一个唯一的 Linux 用户和组 ID,并在自己的进程和 Dalvik VM 中运行。在安装过程中,系统会在设备上创建一个特定的目录来存储应用程序数据,并且只允许该应用程序通过 Linux 用户 ID 和组 ID 权限访问这些数据。此外,应用程序的 Dalvik VM 也会以特定的用户 ID 在其自己的进程中运行。这些关键机制在操作系统级别强制执行数据安全,因为应用程序不共享内存、权限或磁盘存储。应用程序只能访问其 Dalvik VM 内的内存和数据。

当然,这个过程有几个例外。首先,开发者可以使用相同的数字证书为多个应用程序签名,并指定它可以与他们的其他应用程序共享相同的用户 ID、进程、内存和数据存储。这种情况是例外的,通常用于开发者同时拥有免费和付费版本的情况。如果用户升级到付费版本,他们可以利用使用免费版本时积累的数据,因此不会丢失任何数据。

同时,大多数 Android 用户可以选择允许应用程序从非市场位置安装,并跳过数字签名检查。这个选项可以从设备设置中的应用程序菜单中访问,当选择时,会向用户显示一个警告,如图图 3.24 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(图片无需翻译,保留英文描述即可)

图 3.24 Android 设置允许从未知来源安装应用程序。

最常见的情况是用户现在可以直接从网站下载.apk 文件来安装应用程序,安装过程也会跳过数字签名检查。近期一款 AT&T 手机(摩托罗拉 Backflip)从 Android 中移除了这一选项,令许多用户感到不满(Android On Lockdown, n.d.)。然而,使用 Android SDK 的一个变通方法确实存在,我们将在第六章中进行讨论。

由于 Android 内置的安全架构,取证检查员无法简单从设备中提取核心用户数据。除了漏洞利用之外,安全架构在隔离和保护应用程序之间的数据方面是有效的。

取证与软件开发工具包(SDK)

那么 SDK 在取证中有多重要呢?SDK 不仅提供了一套工具和驱动程序,以便分析 Android 设备,而且对于应用程序剖析和其他取证研究也很有用。

将 Android 设备连接到工作站

重要的是要注意 Android 设备实际是如何连接到虚拟机的。截至目前,Android 设备有一个物理 USB 接口,允许它们连接、共享数据和资源,并且通常可以从计算机或工作站充电。如果你只运行一个操作系统,USB 设备应该能被检测到并可以访问。然而,如果运行虚拟机,你可能需要额外的配置或驱动程序。例如,如果你的宿主操作系统是 OS X 并且你正在运行 VMWare fusion,你可以选择菜单“虚拟机 → USB”,然后连接设备(在本例中是高 Android 手机),如图 3.25 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.25 在 VMWare Fusion 中连接 USB 设备到 Ubuntu VM。

同样,如果你的宿主操作系统是 Linux,并且你正在使用 Oracle 的 VirtualBox 运行虚拟机,首先需要确保你是 usbusers 组的成员。因此,从终端会话中执行以下命令:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,进入虚拟机的设置,为设备添加 USB 过滤器,如图 3.26 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.26 在运行 Oracle VirtualBox 的 Linux 主机上添加 USB 过滤器。

最后,你可以像图 3.27 所示那样连接 USB 设备。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.27 在运行 Oracle VirtualBox 的 Linux 主机上连接 USB 设备。

最后,如果你以无头模式运行虚拟机(如第一章所述的 VirtualBox 3.2.10),以下是你要执行的步骤。首先,需要安装 VBox 附加组件,这将启用共享文件夹、更好的视频、USB 支持(如果你下载/购买了 PUEL 版本)和其他功能。从宿主工作站开始:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在 Ubuntu 虚拟机应该可以访问 DVD 了。再次远程桌面进入虚拟机(有关必要步骤请参阅第一章),然后双击桌面上的 VBOXADDITIONS_3.2.0_61806 DVD 以打开 DVD。接着双击 autorun.sh 并选择运行选项。输入密码后,安装将继续进行。图 3.28 展示了这一步骤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.28 通过 Ubuntu VM 远程桌面协议安装 VBox 附加组件。

既然你已经安装了 VBox Additions,那么你可以将 USB 设备连接到你的客户操作系统。但首先,你必须关闭虚拟机。然后,按照以下步骤操作:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用此示例,USB 设备现在应该已经传递到虚拟机。

USB 接口

当你通过单个 USB 端口将 Android 设备连接到工作站或虚拟机时,硬件和 Android 本身通常会公开多个虚拟 USB 接口。例如,当你通过 USB 连接 HTC Incredible 时,你会看到一个包含四个选项的菜单:

  1. 仅充电—通过 USB 为手机充电

  2. HTC 同步—同步联系人和日历

  3. 磁盘驱动器—作为磁盘驱动器挂载

  4. 移动宽带连接—将智能手机的移动网络与 PC 连接

默认选择,如图 3.29 所示,是仅充电选项。HTC 同步和移动宽带连接选项是 HTC 以及有时无线运营商为设备提供的自定义选项和程序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.29 HTC Incredible 连接到 PC 的选项。

CD-ROM 接口

磁盘驱动器选项更通用。此选项将 Android 设备作为磁盘驱动器连接到工作站。这是设备向工作站公开多个 USB 设备的关键区域。当你首次将 HTC Incredible 插入计算机时,实际上注册了三种不同类型的驱动器:一个 CD-ROM 和两个 USB 大容量存储设备。以下列表是从 Linux 工作站的内核消息中获取的,使用了 dmesg 命令:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,在 4:0:0:0 和 4:0:0:1 处找到了两个直接访问驱动器,以及在 4:0:0:2 处找到了一个 CD-ROM。CD-ROM 包含 HTC 与设备捆绑在一起的自定义程序和驱动,以实现同步和宽带连接功能。显然,没有物理 CD-ROM。然而,设备的存储空间有一部分专用于 CD-ROM,并格式化为 ISO9660。宿主操作系统可以将其作为 CD-ROM 挂载,并且在 Windows 中,甚至可能支持自动运行功能。利用 TSK 的 fsstat 程序,我们可以看到有关分区的更多详细信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从卷名称可以看出,CD-ROM 包含由 Verizon 提供的软件,用于使用设备的附加功能。

SD 卡(可移动和虚拟)

从法医的角度来看,更重要的是通过设备可访问的 SD 卡。在 Android 中,将用户文件,尤其是如多媒体这样的大文件放置在 SD 卡上是关键策略。大多数 Android 设备有一个可拆卸的媒体插槽,可接受 micro-SD 卡。核心应用程序数据保留在设备上(位于 /data/data 下),但在调查中可能重要的文件也可能存在于 SD 卡上。

在上一节中,当通过 USB 连接 Android 设备时,Linux 工作站的内核信息显示了可用的各种 USB 设备。列出的两个 SCSI 可移动磁盘 sdb 和 sdc,代表 HTC Incredible 上的 SD 卡。如果您在“连接到电脑”下选择“作为磁盘驱动器挂载”选项,内核信息将显示以下附加消息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在您将看到有关 SD 卡的更多信息。驱动器 sdc 有一个分区 sdc1,其大小为 2 GB。我们可以通过运行 TSK 的 mmls 来查看附加的分区信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您会看到,SD 卡被格式化为 FAT16 文件系统,但通常您会遇到 FAT32,或者可能会遇到像 FAT32 和本地 Linux 文件系统 ext3 和 ext4 这样的多种文件系统。

近年来,设备还拥有一个模拟或虚拟的 SD 卡功能,该功能使用设备的 NAND 闪存创建一个不可拆卸的 SD 卡。这更接近于 iPhone 的模型,用户数据分区直接位于 NAND 闪存上,且无法移除。在上述示例中,sdb 设备提供了对模拟 SD 卡的访问。与物理 SD 卡不同,sdc 没有分区表,文件系统直接从开头开始。要查看重要信息,请运行 TSK 的 fsstat:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个特定情况下,文件系统实际上是 FAT32,您会注意到尽管卷没有标签,但 OEM 名称设置为 BSD 4.4。

警告

自动挂载 USB 设备

在第一章的 Ubuntu 虚拟机配置部分,禁用了自动挂载功能,以防止操作系统自动检测并挂载 USB 存储设备。取证分析师应采取极端谨慎的措施,防止在调查中的设备发生这种情况。除了禁用自动挂载外,通常应通过 USB 写保护器连接设备。

在 Ubuntu 中,如果您没有禁用 USB 设备的自动挂载(在几乎所有情况下都应该禁用),则 SD 卡会自动为您挂载。如果设备连接到硬件写保护器,以只读方式挂载,或者在不需要写保护的情况下(例如,研发情况),您可以在 Linux 中运行 df 命令来查看它们被挂载的位置:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

物理 SD 卡被挂载在/media/E0FD-1813 上,而模拟 SD 卡被挂载在/media/C7F8-0810 上。

在 Android 设备本身上,两个 SD 卡以下列方式挂载:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

USB 调试

最后一个重要的 USB 接口是 Android 调试桥(ADB),它允许开发人员、取证分析师或安全工程师通过 USB 与 Android 设备进行通信和控制。默认情况下,AVD(在模拟器中运行)将启用 USB 调试。然而,非模拟器设备必须明确启用 USB 调试。要启用,请从设备的设置中选择应用程序→开发,如图 3.30 所示。最后,勾选 USB 调试。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.30 启用 USB 调试。

设置后,设备将在后台运行 adb 守护进程(adbd)并等待 USB 连接。守护进程将在非特权 shell 用户账户下运行,以限制其对数据的访问。启用了 root 访问权限的 AVD 和物理设备将作为 root 运行 adbd,从而提供对系统的完全访问。关于此主题的更多详细信息将在第六章中介绍。

在 Android 的新版本中,任何时候启用 USB 调试的设备通过 USB 连接,它都会显示一个安全警告,如图 3.31 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3.31 USB 调试警告。

对于当前所有的逻辑 Android 取证工具,必须启用 USB 调试。如果设备未锁定,实现这一点是微不足道的,但如果设备有密码,则要困难得多。有一些技术可以绕过密码,这在第六章中有所讨论。然而,它们并不在所有平台上都有效。

Android 调试桥简介

在本书的其余部分,我们将广泛使用 adb,因此现在掌握基础知识很重要。在使用 adb 时,涉及到三个主要组件:

1. 运行在 Android 设备上的 adbd

2. 运行在工作站上的 adbd

3. 运行在工作站上的 adb 客户端程序

如前所述,当你在 Android 设备上启用 USB 调试时,守护进程将会运行并监听连接。设备上的 adbd 与工作站上的 adbd 之间的通信是通过 USB 连接之上的虚拟网络进行的。守护进程通过本地主机的端口 5555 至 5585 进行通信。当工作站的 adbd 检测到新的模拟器或设备时,它会创建两个连续的端口连接。偶数端口与设备的控制台通信,而奇数端口用于 adb 连接。本地 adb 客户端程序使用端口 5037 与本地 adbd 通信。

你可以发出的最基本的 adb 命令是 adb devices 命令,它提供了已连接设备的列表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另一个重要的命令提供了杀死本地 adb 服务的能力。为此,请输入以下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,如果工作站上的 adbd 没有运行,它将被自动启动。在 Ubuntu 上,如果你收到以下响应:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

连接的 Android 设备很可能有一个新的供应商 ID,必须通过(sudo lsusb -v)识别并将其添加到“SDK 安装”部分讨论的 udev 规则中。在 Microsoft Windows 中,如果 Android 设备未被识别,你会收到警告,并且必须从 Google 或制造商处安装适当的 USB 驱动程序。

所有分析师和工程师都应该知道的一个强大的 adb 命令是“adb shell”,它允许你打开 Android 设备上的 shell 并与系统交互。这对于任何探索 Android 的人来说都是一个重要的功能。例如,启动一个 AVD 并按照以下步骤查看设备上的应用程序数据目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随着每个新 SDK 的发布,adb 的功能不断增强,是一个非常强大的工具。在第六章中,将详细探讨一些功能,包括:

  1. 在设备上运行 shell 命令

  2. 使用命令行安装应用程序

  3. 在你的工作站和设备之间转发端口

  4. 递归地将文件和文件夹复制到设备或从设备中复制出来

  5. 查看设备日志文件

关于 adb 命令的完整文档可以在 Android 开发者网站上找到:developer.android.com/guide/developing/tools/adb.html#commandsummary

在 Android 模拟器上测试各种命令是理解这个工具并在调查中利用它的一个很好的方法。

概述

Android SDK 不仅提供了对 Android 平台的深入洞察,而且还提供了强大的工具来从取证和安全的角度调查设备。一旦 SDK 安装在取证工作站上,检查员就可以通过 USB 连接与 Android 设备交互,前提是启用了 USB 调试功能。不仅可以从设备查询信息,还可以安装、运行应用程序,并最终从设备提取数据。Android SDK 是用于取证和安全分析的重要工具。

参考文献

  1. Android 时间线(n.d.)。Android 教程、新闻、观点和论坛,Android 学院。2011 年 3 月 12 日检索自:www.androidacademy.com/1-android-timeline

  2. 平台版本(n.d.)。Android 开发者。2011 年 3 月 12 日检索自:developer.android.com/resources/dashboard/platform-versions.html

3. comScore 报告 2010 年 11 月美国移动用户市场份额——comScore, Inc(未注明日期)。comScore, Inc.——衡量数字世界。2011 年 3 月 12 日检索自 www.comscore.com/Press_Events/Press_Releases/2011/1/comScore_Reports_November_2010_

4. 安卓 1.5 平台(未注明日期)。安卓开发者。2011 年 3 月 12 日检索自 developer.android.com/sdk/android-1.5.html

5. 安卓 1.6 平台(未注明日期)。安卓开发者。2011 年 3 月 12 日检索自 developer.android.com/sdk/android-1.6.html

6. 安卓 2.1 平台(未注明日期)。安卓开发者。2011 年 3 月 12 日检索自 developer.android.com/sdk/android-2.1.html

7. SDK 存档(未注明日期)。安卓开发者。2011 年 3 月 13 日检索自 developer.android.com/sdk/older_releases.html

8. smali-在 Google Code 上的项目托管(未注明日期)。Google code。2011 年 3 月 13 日检索自 code.google.com/p/smali/

9. 安卓系统受限:AT&T 从 Backflip 中移除了安卓的最佳功能(未注明日期)。AndroidGuys。一个值得信赖的安卓新闻和观点来源,成立于 2007 年。2011 年 3 月 13 日检索自 www.androidguys.com/2010/03/08/android-lockdown-att-removes-parts-android-backflip/

第四章

Android 文件系统和数据结构

本章信息

• 壳层中的数据

• 内存类型

• 文件系统

• 挂载的文件系统和目录结构

引言

虽然支持 Android 设备的底层硬件和软件非常吸引人,但法医分析师和安全工程师的主要关注点是获取、分析和理解设备上存储的数据。与讨论的其他主题一样,为了有效分析,了解存储的数据类型、存储位置、存储方式以及存储介质的物理特性等许多细微差别非常重要。所有这些因素在决定哪些数据可以恢复以及如何分析这些数据方面起着主要作用。

壳层中的数据

法医分析师主要关注可以从他们调查的设备中恢复的数据遗迹。Android 结合了在 Linux 中发现的众所周知的遗迹以及完全新的遗迹,例如 Dalvik VM 和 YAFFS2 文件系统。不同制造商采用的多种架构增加了复杂性。

尽管没有一本书或检查员能够彻底涵盖这个话题,但 Android 设备有一些共同的基本概念。文件系统、文件和其他遗迹是法医分析师为了使调查效果最大化必须了解的 Android 核心内容。

存储的数据类型

Android 设备存储大量数据,通常结合了个人和工作数据。应用程序是这些数据的主要来源,应用程序的来源包括:

• 随 Android 提供的应用程序

• 制造商安装的应用程序

• 由无线运营商安装的应用程序

• 额外的 Google/Android 应用

• 用户安装的应用程序,通常来自 Android 市场

第七章,Android 应用程序和法医分析,将详细研究这些应用程序中的许多,尽管本书的范围当然不可能涵盖所有可能性。在 Android 设备上找到的数据样本包括以下内容:

• 短信(SMS/MMS)

• 联系人

• 通话记录

• 电子邮件信息(Gmail、Yahoo、Exchange)

• 即时通讯/聊天

• GPS 坐标

• 照片/视频

• 网络历史

• 搜索历史

• 驾驶方向

• Facebook、Twitter 和其他社交媒体客户端

• 设备上存储的文件

• 音乐收藏

• 日程安排

• 财务信息

• 购物历史

• 文件共享

应用数据存储目录结构

Android 应用程序主要在两个位置存储数据:内部存储和外部存储,这两部分将在本章后面详细介绍。然而,对数据存储目录结构有一个高层次的了解是有帮助的。

在外部数据存储区域(SD 卡和模拟 SD 卡),应用程序可以按意愿在任何位置存储数据。然而,内部数据存储由 Android API 控制。当应用程序安装后(通过市场或直接提供给消费者的构建版本),内部数据存储在以包名命名的/data/data/子目录中。例如,默认的 Android 浏览器具有包名 com.android.browser,因此数据文件存储在/data/data/com.android.browser 中。尽管应用程序不要求存储数据文件,但大多数都会存储。

在应用程序的/data/data 子目录内部,有许多在许多应用程序中都能找到的标准目录以及开发者控制的目录。表 4.1 列出了最常见的标准子目录。

表 4.1 常见/data/data/子目录

shared_prefs以 XML 格式存储共享偏好设置的目录
lib应用程序所需的自定义库文件
files开发者保存到内部存储的文件
cache应用程序缓存的文件,通常是网页浏览器或其他使用 WebKit 引擎的应用程序的缓存文件
databasesSQLite 数据库和日志文件

表 4.1 仅展示了应用程序的/data/data 文件中最常见的子目录。在本书的后续内容中,我们将详细列出许多额外的文件夹和数据文件。

数据存储方式

Android 为开发者提供了五种在设备上存储数据的方法。法医检查员至少可以在五种格式中的四种中找到数据。因此,详细理解每一种格式非常重要。

持久数据存储在 NAND 闪存、SD 卡或网络上。具体来说,五种方法包括:

  1. 共享偏好设置

  2. 内部存储

  3. 外部存储

  4. SQLite

  5. 网络

除了应用开发者存储的数据外,Linux 内核和 Android 堆栈还通过日志、调试和其他标准信息服务提供信息。

共享偏好设置

共享偏好设置允许开发者以轻量级的 XML 格式存储基本数据类型的键值对。可以在偏好设置文件中存储的基本数据类型包括以下几种:

  1. boolean: 真或假

  2. float: 单精度 32 位 IEEE 754 浮点数

  3. int: 32 位有符号二进制补码整数

  4. long: 64 位有符号二进制补码整数

  5. strings: 字符串值,通常为 UTF-8 编码

利用这些基本类型,开发者可以创建并保存为他们的应用程序提供动力的简单值。

共享偏好设置文件通常存储在应用程序数据目录的 shared_pref 文件夹中,并以.xml 结尾。在我们参考的 HTC Incredible Android 手机上,共享偏好设置目录包含五个 XML 文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

com.android.phone_preferences.xml 首选项文件包含了 int、boolean 和 string 首选项的示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,XML 文件在文件开始处描述了字符串编码类型,在这种情况下是 UTF-8。有三个首选项保存了各种设置和特性。从法医的角度来看,最有趣的可能就是 updateAreaCode.xml 了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该文件查询了移动目录号码(MDN)并将设备的区号存储在此文件中,推测是为了在支持该功能的地区提供七位数字拨号选项。

由于许多应用程序利用轻量级的 Shared Preferences 方法来存储键值对,因此它可以成为丰富的法医数据来源。特别是当检查员可以恢复 XML 首选项文件的旧版本或已删除版本时,这一点尤其正确。

内部存储的文件

文件允许开发者存储更复杂的数据结构,并保存在文件内部存储的几个位置。这些文件存储在应用程序的/data/data 子目录中,开发者可以控制文件类型、名称和位置。默认情况下,只有应用程序可以读取这些文件,即使设备所有者没有 root 权限也无法查看这些文件。开发者可以覆盖安全设置,允许其他进程读取甚至更新文件。

提示

识别自定义文件

确定应用程序子目录中哪些文件属于这一类别的最佳方式是通过排除法。基本上,应用程序中/data/data/子目录下不属于 shared_prefs、lib、cache 或 databases 子目录的任何文件都是开发者创建和控制的文件。

让我们研究一下 com.google.android.apps.maps,它提供了保存于内部存储的文件的好例子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

应用程序使用了大多数可用的存储机制,在内部存储的 app_ 和 files 目录中存储文件。app_ 目录有多个子目录和一个未知的 cache_r.m 文件格式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

files 目录存储了应用程序显示和更新 Google Maps 所需的大量数据文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些文件清楚地表明了可能对法医分析师或安全工程师感兴趣的数据。在第七章,Android 应用程序和法医分析中,将更详细地介绍应用程序及其存储数据的数据分析。

外部存储的文件

虽然存储在内部设备存储上的文件具有严格的安全性和位置参数,但各种外部存储设备上的文件限制要少得多。

首先,使用可移动 SD 卡的一个重要动机(除了成本之外)是数据可以在其他设备上使用,可能是升级后的 Android 设备。如果消费者购买了一部新的 Android 设备,插入之前包含他们所有家庭成员照片和视频的 SD 卡,却发现自己无法访问这些内容,他们将会非常沮丧。

为了便于在桌面计算机上挂载 SD 卡以共享文件,SD 卡通常使用微软的 FAT32 文件系统格式化。虽然该文件系统得到了广泛支持,但它缺少如 ext3、ext4、yaffs2、hfsplus 等文件系统内置的细粒度安全机制。因此,默认情况下,文件无法强制执行权限。

例如,前面提到的 com.google.android.apps.maps 应用程序也会在 Android/data 子目录下的 SD 卡上存储数据。以下是来自参考的 HTC Incredible SD 卡(挂载在 /mnt/sdcard)的文件和目录列表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样,HTC Incredible 配备了一个存储在 NAND 闪存上的模拟 SD 卡。模拟 SD 卡挂载在 /mnt/emmc 上。以下是存储相册 JFIF 缩略图的子目录列表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,开发者对外部 SD 卡和模拟 SD 卡上的文件名称、格式和位置有着很大的控制权。

SQLite

另一个开发者可以利用的 NAND/SD 卡存储方式是一种特定类型的文件——SQLite 数据库。数据库用于结构化数据存储,而 SQLite 是一个在许多移动系统以及传统操作系统上广泛出现的流行数据库格式。

SQLite 因多种原因而受到欢迎。值得注意的是整个代码库质量高,开源,并且发布到公共领域。文件格式和程序本身非常紧凑,在不到几百千字节的空间内实现了显著的功能。与 Oracle、MySQL 和 Microsoft 的 SQL Server 等更传统的关系数据库管理系统(RDBMS)不同,SQLite 整个数据库包含在一个跨平台的单一文件中。

Android SDK 提供了专门的 API,允许开发者在他们的应用程序中使用 SQLite 数据库。SQLite 文件通常存储在内部存储的 /data/data//databases 目录下。然而,创建数据库在其他位置并没有限制。

SQLite 数据库是丰富的法医数据来源。基于 WebKit 开源项目(webkit.org/)的内置 Android 浏览器提供了一个很好的例子。在我们参考的 HTC Incredible 中,有 28 个 SQLite 数据库位于 /data/data/com.android.webkit 的子目录下。在这个例子中,五个子目录如下:

• app_icons:一个网页图标数据库

• app_cache:一个包含网页应用数据缓存的数据库

• app_geolocation: 与 GPS 位置和权限相关的 2 个数据库

• app_databases: 21 个数据库,为支持网站提供本地数据库存储

• databases: 浏览器和浏览器缓存的 3 个数据库

从这些文件中恢复具有取证价值的数据的可能性非常高。

网络

开发者可用的最后一种数据存储机制是网络,这是设计为网络感知设备的一个关键优势。最初,很少有应用程序利用网络作为存储选项。然而,随着 SDK、应用程序和设备的成熟,网络存储选项正在被更多地利用。

安卓开发者网站为那些对网络存储感兴趣的人提供了非常少的详细信息。他们的整个文档只有短短两句话长(Data storage, n.d.)。

当网络可用时,您可以使用网络来存储和检索您自己的基于网络服务的数据。要进行网络操作,请使用以下软件包中的类:

• java.net.^∗

• android.net.^∗

文档中提到的软件包基本上为开发者提供了与网络、网络服务器等交互所需的基础 API。利用网络的程序需要更多的自定义编码,而且并非所有具有取证价值的数据都存储在设备上,但通常可以恢复重要的配置和数据库文件。

例如(作为对第七章,Android 应用程序和取证分析的预览),Dropbox 是一个受欢迎的文件共享网站,它有适用于 Android、黑莓和 iOS 设备的移动应用。他们当前的 Android 应用程序(版本 1.0.3.0)在 Android Market 上的下载量已超过 25 万次,拥有超过 35,000 个用户评分,大多数评分都很高。安装应用后,您可以在/data/data/com.dropbox.android 找到应用程序文件夹,其中包括四个标准目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

log.txt 是活动详细日志,以下提供几行以供参考:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上述列表中强调了一些可能感兴趣的项,具体包括:

  1. 所有操作都有时间戳

  2. 成功认证用户,提供了用户名

  3. 从图库导入图片

  4. SD 卡上的特定文件已上传

  5. Dropbox 服务被电话中断

该应用还有一个共享偏好文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 sqlite3 命令行程序快速检查 db.db,可以得到以下数据(您也可以使用图形化 SQLite 浏览器查看数据库):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据库提供了关于 Dropbox 应用程序、设备以及最终用户和可能交互的人的重要法医和安全数据。"Android intro.pdf"文件在安装并登录 Android 应用时,由 Dropbox 自动同步到 Dropbox 账户。当查看共享的 PDF 文件时,它被缓存在 SD 卡上。关于文件及其使用的额外元数据包含在数据库中。尽管 Dropbox 在其应用程序中广泛使用网络数据存储,我们仍然可以恢复有用的信息。

内核、系统和应用程序日志

在标准的 Linux 文件系统中,法医分析师和安全工程师还可以找到与调查或审计相关的文件和信息。不幸的是,这个范围相当广泛且令人望而却步,但我们可以至少提供一个查找相关信息起点的地方。

日志文件和调试是开发人员和系统管理员维护系统和应用程序的两种常见且有效的方法。它提供了对应用程序以及运行它们的系统的洞察。虽然并非在每种情况下都适用,但只需检查 Android 设备上的各种日志和调试文件,就可能获得重要信息。

Linux 内核日志

Linux 内核是 Linux 操作系统的底层抽象接口,它提供了访问设备硬件的能力。由于内核在设备上的所有功能中都起着核心作用,因此记录关键事件和活动的能力非常有价值。在 Linux(以及 Android)设备上,可以通过命令 dmesg 访问内核日志。这将把所有可用的内核信息打印到控制台,部分信息如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您可能会注意到,数据非常详细且属于低级别。然而,它可以提供重要时间戳和活动信息,以及关于设备启动的大量信息。但是,如果设备最近没有重启,那么启动时的初始日志将不再可用。

这个命令在设备上不需要任何特殊权限,只需启用 USB 调试即可。如果您在设备或模拟器上运行此命令,您会注意到屏幕上显示了过多的数据。您可以通过将 dmesg 的内容传递(或发送)到名为 wc(代表单词计数)的程序,并指示它计算日志中的行数来确定日志中的总行数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,在参考的 HTC Incredible 上,我们有 1859 行内核日志。如果您需要更仔细地检查信息,或者将其包含在报告中,您可以使用以下命令将 dmesg 的输出重定向到文件中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你现在可以通过在文本编辑器或显示程序中打开 dmesg.log 来检查可用内核日志的内容。

logcat

安卓有几个额外的调试技术可用。一个程序,logcat,显示一个持续更新的系统和应用程序调试信息列表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

快速浏览上述的小日志片段可以揭示

• 经度和纬度数据

• 日期/时间信息

• 应用程序详情

日志记录非常详细,这里提供的样本只是可用内容的一小部分。每个日志消息都以消息类型指示符开始,在表 4.2 中有描述。

表 4.2 日志方法类型

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

logcat 程序还提供了完整的蜂窝无线调试日志,可以通过以下命令查看(仅包含部分无线日志):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管日志记录详细且通常难以理解,但扫描上述日志可以提供如下信息:

• 事件时间(以 Unix 纪元时间表示,例如,t=1296218163)

• 用于与蜂窝调制解调器通信的 AT 命令

• 接收者、大小、时间和编码的短信信息

• 设备的蜂窝 IP 地址、网络和位置信息

• 无线运营商信息

这些信息属于非常底层的。然而,如果恢复这些日志,它们可以揭示关于设备的重要信息。

注意事项

Unix 纪元时间

Unix 纪元时间是基于 Unix/Linux 系统的的时间戳常见格式。时间戳是一个整数值,表示自 1970 年 1 月 1 日以来的秒数(或毫秒数)。使用秒的时间戳通常有 10 位数字,而使用毫秒的时间戳将有 13 位数字。时间戳在第七章中有更详细的介绍。

logcat 最后一个特性是事件日志显示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样,这个日志非常详细。然而,随着系统内发生不同的事件,它们在这里记录了大量的信息。在之前的日志片段中,我们可以看到对 mmssms.db 的 INSERT 和 SELECT 语句,该数据库用于存储短信。

dumpsys

下一个日志机制是通过一个名为 dumpsys 的命令访问的。

Dumpsys 提供了有关服务、内存和其他系统详细信息的信息,这些信息可能很有帮助。提供的一些信息类型包括

• 当前正在运行的服务

• 每个服务的转储

• 当前活动管理器状态下的服务、广播、待定意图、活动和进程

• 包括内存、进程 ID(PIDs)、数据库等在内的进程信息

接下来列出了来自参考 HTC Incredible dumpsys 的样本部分,并简要解释了这些数据对法医分析师或安全工程师可能具有的价值。

首先,你按照如下方式运行 dumpsys 命令:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

涉及“account”服务详细信息的部分,包含了关于设备上使用的各种账户的宝贵信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你不仅可以看到使用的程序,还可以看到特定于用户的账户名称。例如,上述信息透露了:

• 具有用户名 book@viaforensics.com 的 Google 账户

• 与用户名 book@viaforensics.com 的 Exchange ActiveSync (EAS) 账户(与上述 Google 账户分开)

• 安德鲁·胡格的 Facebook 账户

• viaforensics 的 Twitter 账户

• 为 personal@emailaddress.com 的 Google 账户(设备上的第二个)

在日志进一步内容中,同样提供了最后 10 次同步的实际时间戳:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另一个服务被幽默地命名为“iphonesubinfo”,尽管名字相似,但显然与苹果的 iPhone 无关。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这一部分可以获取手机类型和设备 ID(已更改)。设备 ID 不是设备的序列号,而是移动设备标识符(MEID),在 CDMA 网络上唯一标识设备。

另一个重要的信息来源是位置服务,它显示最后已知的位置信息及时刻。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安卓系统中的大多数时间戳是从 1970 年 1 月 1 日以来的毫秒数,这是 Unix 纪元时间——以毫秒为单位,而不是秒。由于大多数工具基于秒转换 Unix 纪元,你可以将数字除以 1000,然后使用标准公式。如果你构建了 Ubuntu 工作站,你可以使用以下命令行进行转换:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这将在工作站时区输出。你可以使用命令行上的各种开关控制时区、格式和其他许多参数。要查看所有可能性,请运行“date --help”或“man date”。

检查上述三个缓存位置,我们可以看到系统从 GPS 卫星和蜂窝塔在以下时间缓存了位置信息:

  1. GPS:2011 年 1 月 27 日 13:51:13 CST

  2. 蜂窝:2011 年 1 月 28 日 09:56:48 CST

记录的位置信息是准确的,因此提供了设备位置的极佳历史信息。

网络状态部分提供了额外的信息,包括关于手机塔的更详细信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

需要指出的是,尽管技术细节繁多,但内存信息部分对于每个进程 ID(PID)都会输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这不仅有助于确定哪些进程正在运行,还有助于确定它们访问的数据库。例如,在某些情况下,调查人员可能需要更好地了解收到电子邮件时更新了哪些信息。在上面的列表中,你可以看到电子邮件应用程序(com.htc.android.mail)不仅更新了 mail.db,还更新了与 people_db 相关联的两个与网络相关的数据库。在解释 Android 设备上的数据如何相互关联时,这些信息可能非常有用。

dumpstate

另一个调试命令是 dumpstate,它将之前的调试部分与系统信息结合在一起。与其他命令一样,你使用以下命令运行:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在运行 adbd 并以 root 权限的模拟器或设备上显示的第一个部分是应用程序的堆栈跟踪。然而,在参考的 HTC 设备上,dumpstate 命令返回权限被拒绝。紧接着是关于设备、构建版本、无线电、网络和内核详情的基本信息。剩余的日志包含了表 4.3 中概述的部分。

| 表 4.3 Dumpstate 部分 |

部分文件或命令
堆栈跟踪N/A
设备信息N/A
系统N/A
内存信息/proc/meminfo
CPU 信息top -n 1 -d 1 -m 30 -t
Procrank(procrank)
虚拟内存统计/proc/vmstat
Vmalloc 信息/proc/vmallocinfo
Slab 信息/proc/slabinfo
Zoneinfo/proc/zoneinfo
系统日志logcat -v time -d ^∗:v
事件日志logcat -b events -v time -d ^∗:v
无线电日志logcat -b radio -v time -d ^∗:v
网络接口netcfg
网络路由/proc/net/route
Arp 缓存/proc/net/arp
转储 Wi-Fi 固件日志su root dhdutil -i eth0 upload /data/local/tmp/wlan_crash.dump
系统属性N/A
内核日志dmesg
内核唤醒锁/proc/wakelocks
内核 cpufreq/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state
Vold 转储vdc dump
安全容器vdc asec list
进程ps -p
进程和线程ps -t -p -p
Libranklibrank
Binder 失败事务日志/proc/binder/failed_transaction_log
Binder 事务日志/proc/binder/transaction_log
Binder 事务/proc/binder/transactions
Binder 统计/proc/binder/stats
Binder 进程状态sh -c cat /proc/binder/proc/^∗ -p
文件系统和空闲空间df
包设置/data/system/packages.xml: 2011-01-26 09:18:02
包 UID 错误/data/system/uiderrors.txt: 2010-11-14 22:52:26
最后的 kmsg/proc/last_kmsg
最后的无线电日志parse_radio_log /proc/last_radio_log
最后的恐慌控制台/data/dontpanic/apanic_console
最后的恐慌线程/data/dontpanic/apanic_threads
被阻塞进程的等待通道不适用
背光不适用
dumpsysdumpsys
bugreport

最后一个调试命令在之前命令的基础上构建,并将logcatdumpsysdumpstate的调试输出组合在一个命令中,并在屏幕上显示,以便提交错误报告。该命令如下运行:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它首先运行dumpstate。在针对参考的 HTC Incredible 运行时,输出被保存到文件中,然后执行了行数统计:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如您所见,报告生成了超过 42,000 行的调试信息,其中包含时间戳、应用数据以及系统信息。解析这些数据将得到有用的信息。然而,如果手动处理这些数据,任务将非常艰巨。

内存类型

如第二章所述,Android 设备有两种主要类型的内存,易失性(RAM)和非易失性(NAND 闪存)内存。每种内存都能从不同角度了解设备数据。

RAM

系统使用 RAM 加载、执行和操作操作系统、应用程序或数据的关键部分,并在重启时不会保存。与传统计算机一样,RAM 可能包含非常重要的信息,应用程序使用这些信息来处理数据。以下是一些例子:

• 密码

• 加密密钥

• 用户名

• 应用数据

• 系统进程和服务的数据

最近,出现了用于检查 Android 内存的解决方案。其中一种技术由安全研究员 Thomas Cannon 在他的博客上记录,我们将详细逐步介绍(Android reverse engineering, n.d.)。

Android 提供了一个机制,通过向应用发送特殊信号(SIGUSR1)将应用的内存转储到文件中。要发送信号,你需要知道应用的 PID,你可以使用ps命令找到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ps命令列出了所有系统和应用进程以及父进程 ID、内存信息以及名称。由于典型设备上有许多运行中的进程,上述列表仅显示输出的一部分。

接下来,我们需要在设备上以 root 权限运行交互式 shell,并设置/data/misc具有足够的权限来写入,然后读取内存转储:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

警告

更改文件夹权限

chmod命令用于更改/data/misc文件夹的权限,授予系统上所有用户账户读、写和执行访问权限。进行此更改是为了成功进行内存转储。然而,这是法医分析师明显进行的系统更改。如果此类分析是合理的,应在报告中记录此更改,理想情况下,在内存转储后应将文件夹权限恢复到默认设置。

从这里,我们可以发送进行内存转储所需的信号,并显示目录内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

文件 heap-dump-tm1296350817-pid1294.hprof 包含了内存转储,我们可以退出交互式 adb shell 并将文件拉取到本地工作站进行分析:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从那里,使用你手头上的任何内存分析技术。例如,你可以使用 strings 命令提取 ASCII 字符串:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后查看文件内容。快速扫描 Gmail 的内存提供了有关应用程序引用的各种加密库以及 HTTP 流量的信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用名为 JSON 的文件格式的 Facebook 应用程序,产生了以下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在将以下示例包含在本书中之前,已经对其进行了清理。但是,你可以看到时间戳、资料更新、朋友信息、签到等信息。

对 Android 设备的内存分析可以深入了解设备的内部结构以及有关设备主人的关键信息。随着时间的推移,预计市场上会有更多解决方案来解决 Android 内存分析的问题。

NAND 闪存

与 RAM 不同,NAND 闪存是非易失性的,因此即使设备没有电源或重新启动,数据也能得到保留。NAND 闪存不仅用于存储系统文件,还用于存储用户数据的很大一部分。

NAND 闪存具有与现代硬盘中的磁性介质截然不同的特性。这些特性使 NAND 闪存成为移动设备的理想存储选择,同时也为程序员带来了许多挑战,为法医分析师提供了机会。

首先,NAND 闪存没有像传统磁性硬盘中的旋转盘片和机械臂那样的机械移动部件。这提高了耐用性,并减少了设备的大小和功耗。内存以一个或多个芯片的形式分布,这些芯片通常将 NAND 闪存和 RAM(MCP,请参阅第二章)集成在一起,并直接集成在设备的电路板上。

NAND 闪存还具有非常高的密度,并且制造起来成本效益高。这当然使其深受制造商的喜爱。一般而言,制造过程和技术的一个副作用是,NAND 闪存在出厂时实际上就带有坏块。制造商通常会在制造过程中测试内存,并在 NAND 闪存上的特定结构中标记坏块,这在他们的文档中有描述。直接与 NAND 闪存交互的软件可以读取制造商的坏块标记,并常常实现一个坏块表,该表可以在系统上逻辑跟踪坏块,并将其从运行中移除。这大大加快了坏块检测和管理的速度。因此,尽管 NAND 闪存在物理上比旋转盘片更耐用,但其错误率要高得多,在开发和使用过程中必须考虑这一点。

NAND 闪存的另一个重要限制是,在块(block)无法再存储数据之前,其写入/擦除的生命周期非常有限。这个生命周期因设备而异,在很大程度上受到每个 NAND 闪存单元存储的数据量影响,这是存储 1 或 0 位(bit)的核心构建块。如果单元仅存储单个位(单层单元或 SLC),则 NAND 闪存的评率为大约 10 万次写入/擦除周期,数据保持一年。然而,由于制造商(及消费者)要求在相似大小或更小的设备中存储更多的数据,NAND 闪存很少使用 SLC。该技术已经发展到多层单元(MLC),在这种单元中,每个单元可以存储两个、三个甚至更多的位。然而,这不仅使制造过程复杂化,减缓了写入/擦除周期,还显著降低了设备的耐用性。一个典型的存储每个单元两个位的 MLC NAND 闪存在耐久性(以一年数据保持期限衡量)上降低了 10 倍,大约为 1 万次写入/擦除周期。随着每个单元的位密度增加,耐久性继续下降,这显然必须由控制设备来解决。

与 RAM 和 NOR 闪存这类通常用于计算机基本输入输出系统或 BIOS 的闪存不同,NAND 闪存不能实现随机访问。相反,数据访问是通过一个分配单元来实现的,这个单元被称为页(page)或块(chunk),通常大小在 512 到 2048 字节之间,但随着 NAND 闪存整体大小的增加,这个数值通常会增大。尽管 NAND 闪存不能像 RAM 那样提供快速随机访问,但其访问时间仍然相当快,因为它不需要像传统旋转硬盘那样使用机械盘片和磁臂移动。

注意

页(page)与块(chunk)的区别

在整本书中,我们将把“页”和“块”同义地使用,以指代 NAND 闪存中提到的低级数据分配单元。虽然分配单元通常被称为页,但作为 Android 关键组件的 YAFFS2 文件系统通常将分配单元称为块。

然后,这些数据块被组织成一个更大的逻辑单元,称为块,它通常比传统的 512B 硬盘扇区大得多。在大多数 Android 设备中,NAND 闪存块包含 64 个数据块,每个块 2048 字节。64 × 2 KB 的块大小为 128 KB。当然,随着时间的推移,这可能会发生变化,由 NAND 闪存制造商控制。当一个块被分配用于写入时,块内的数据块会按顺序写入。

NAND 闪存的另一个非常重要的特性是可用于读取和写入的操作:

• 读取(页)

• 写入(页)

• 擦除(块)

虽然可以读取或写入单个数据块,但擦除操作只能在块级别进行。当一个块被擦除时,整个块会用 1 或 0xFF(十六进制)覆盖。

注意

NAND 闪存的擦除操作

*擦除操作是 NAND 闪存中将 0 更改为 1 的唯一机制。*这一点值得强调。在传统硬盘中,如果一个值从 0 更改为 1(或反之),程序只需在硬盘上找到该值并施加适当的电压以更改并存储新值。然而,NAND 闪存的基本架构只提供了一个机制来将 0 更改为 1,即通过在块级别应用的擦除功能,而不是单个页级别。因此,一个页只能写入一次,如果需要更改页的值,则必须擦除整个块,然后才能写入页。

这里举一个使用单个字节以简化说明的例子:假设这个特定的字节存储了十进制值 179,我们想要加上 39 得到总值为 218。对于那些不熟悉在十进制(base10)、十六进制(base16)和二进制(base2)之间转换数字的人来说,Windows、Mac OS X 和 Ubuntu Linux 的内置计算器程序提供了程序员模式,可以执行这些转换。对于上面的数字,我们在不同数制之间的转换如表 4.4 所示。

表 4.4 整数的十进制、十六进制和二进制表示

十进制(base10)十六进制(base16)二进制(base2)
1790xB31011 0011
2180xDA1101 1010

因此,值 179 包含三个 0,其中两个需要改变为 1 以表示我们新的值 218。然而,NAND 闪存在没有擦除整个块的情况下无法进行这种改变。所以,如果这个单个字节在没有擦除的情况下尝试,结果将是 146,而不是 218。以下是这种情况发生的原因:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于字节并不全是 1(0xFF),写入周期中唯一成功的是 1 保持为 1 或变为 0 的部分。每当写入功能遇到 0 并请求变为 1 时,它就会失败并保持 0 值。结果字节为 0x92 或 10 进制的 146——明显不是预期的值。另一种描述写入功能的方式是,它只将带电的 1 值按需改为 0,这相当于两个值的“逻辑与”。

总结来说,一个数据块只能写入一次,如果需要重写,必须先擦除整个块。

如你所见,NAND 闪存有其各种限制,因此开发人员和文件系统必须了解闪存特性,才能在限制内有效工作。与带有固件来管理设备(包括坏块)的传统硬盘不同,Android 设备中使用的 NAND 闪存没有配备控制器。所有内存的管理都必须在软件层面实现,并与 NAND 闪存进行接口。部署的两个重要技术是错误校正码(ECC)和磨损均衡。这两者对法医分析和数据恢复都有重大影响。

首先,ECC 是一种在读写操作中检测数据错误并即时纠正某些错误的算法。由于 NAND 闪存在使用过程中会逐渐退化,系统必须能够检测到页面或块何时出现问题并恢复存储在那里的数据。当错误次数或失败操作超过一定数量(通常是三次失败操作)时,页面或块将被标记为坏块,并添加到坏块表中。

在 Android 上有效管理 NAND 闪存的第二个重要算法是磨损均衡代码,它将数据的写入分散到整个 NAND 闪存中,以避免过度使用单一区域,从而更快地磨损这些块。

许多使用 NAND 闪存的硬件设备,如可移动的 USB 闪存驱动器和固态硬盘(SSD),都带有与设备捆绑的控制器逻辑,提供上述功能,包括坏块管理、磨损均衡和错误校正码。然而,Android 设备设计为直接集成 NAND 闪存组件,因此需要一个软件管理层来提供这些重要功能。选定的管理 NAND 闪存的层是 Memory Technology Device(MTD)系统。

MTD 是为了满足 NAND 闪存及其类似设备的需要而开发的。在 MTD 之前,Linux 主要支持字符设备和块设备。这两种设备类型都没有解决新型存储设备独特的特性。此外,虽然 NAND 闪存严格来说不是块设备(像传统硬盘那样),但向开发者暴露块设备特性有助于开发和支持。通过利用 MTD,Android 现在有了与 NAND 闪存有效交互所需的 Flash Transition Layer(FTL)。通过这种方式,Android 没有将制造商限制在只能使用少数 NAND 闪存供应商和相关控制器。相反,他们可以自由使用任何可用的 NAND 闪存,然后“简单”地与支持广泛 NAND 闪存的 MTD 集成。

在 Android 中,MTD 不仅为 NAND 闪存提供了块接口,还提供了 ECC、磨损均衡和其他关键功能。ECC 和其他块元数据存储在一个被称为 OOB(带外)或备用区域的保留空间中。OOB 位于 NAND 闪存上每个块的后面。虽然块、块和 OOB 布局是可配置的,但到目前为止,大多数 Android 设备都有一个 128 KB 的块,包含 64 个每块 2048 字节(2k)的块,每个块都有一个 64 字节的 OOB,如图 4.1 所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4.1 块(128 KB = 64 × 2k 块 + OOB)。

OOB 不仅存储由 MTD 管理的相关信息,还可以存储对文件系统至关重要的元数据,前提是文件系统要能识别 NAND 闪存。虽然系统将块呈现为 128 KB,但加上 64 个大小为 64 字节的 OOB 后,额外的 4096 字节(4 KB)使得 NAND 闪存上总共使用的字节数达到了 132 KB。

在 Android 设备上,您可以通过查看/proc/mtd 文件来确定 MTD 分区。在我们的参考设备 HTC Incredible 上,我们有以下分区:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有七个 MTD 分区,下一节将检查它们的挂载位置,并提供一个关于找到的目录和文件的高级概述。在之前的列表中,size 和 erasesize 都是十六进制值,提供了重要的 MTD/NAND 闪存属性。erasesize 指定了每个块的大小,即 0x20000 或 131,072 字节或 128 KB(128×1024)的十进制数。这与块图一致,特别是 64 页,每页 2048(2 KB)的大小。size 列指定了该分区的整体大小。因此,在这个实例中,我们有如表 4.5 所示的 MTD 分区。

表 4.5 MTD 分区大小转换

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表 4.5 中的值也可以使用 df(磁盘空闲)命令进行验证,该命令提供了已挂载文件系统及其总、已使用和可用空间的列表。以下是/system 的 df 数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,/proc/mtd 中找到的大小在我们的转换和 df 命令显示中是一致的。

既然我们已经对 Android 中的 NAND 闪存和 MTD 有了基本的了解,我们将研究 Android 使用的各种文件系统。

文件系统

与大多数 Linux 系统一样,Android 中也使用了多个文件系统,其中许多用于启动和运行系统。虽然我们会提到多个文件系统,但主要关注的是存储用户数据的分区,特别是 EXT、FAT32 和 YAFFS2 文件系统。

要确定 Linux 内核(以及因此的 Android)支持哪些文件系统,你可以查看文件 /proc/filesytem 的内容。在我们参考的 HTC Incredible 上,它包含以下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 HTC Incredible 支持的 18 个文件系统中,只有五个是由物理设备(如 NAND 闪存或 SD 卡)支持的。其余的文件系统具有“nodev”属性,这意味着它们本质上是虚拟文件系统,不会写入任何物理设备。此外,实际上在设备上只使用了六个 nodev 文件系统:

  1. rootfs

  2. tmpfs

  3. cgroup

  4. proc

  5. sysfs

  6. devpts

有三个由设备支持的文件系统被使用:

  1. ext3

  2. yaffs2

  3. vfat

下面的部分提供了大多数文件系统的简要概述,以及对存储大量用户数据的 YAFFS2 的深入分析。

rootfs、devpts、sysfs 和 cgroup 文件系统

Linux 中的许多文件系统用于启动、操作或管理系统,通常不会包含在取证调查中有用的信息。然而,安全工程师和研究人员可能会仔细检查这些文件系统以及内核的内部工作,试图找出安全漏洞和其他弱点。我们将快速强调在 Android 中发现的四个与基础设施相关的文件系统。

首先,rootfs 是内核在启动时挂载根文件系统(目录树的顶部,用正斜杠表示)的位置。为了让内核完成启动过程,它需要访问核心文件和库,因此需要挂载根文件系统。随着内核完成启动过程,随后的文件系统作为根文件系统下的目录被挂载。例如(本章后面会详细介绍),根文件系统会被挂载在 / 并包含关键文件。然后一个更完整的系统目录会被挂载在 /system。你可以通过从 shell 运行“ls -l”命令或输入“mount”来查看已挂载的文件系统以及它们在根文件系统中的目录。

devpts 文件系统用于在 Android 设备上提供模拟的终端会话,类似于使用 telnet 或 ssh 连接到传统的 Unix 服务器。每次虚拟终端连接时,在/dev/pts 下都会创建一个新节点。例如,如果你有一个 adb shell 连接到 Android 设备,/dev/pts 将显示以下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,在下一个示例中,有两个 adb shell 连接和一个来自设备上安装的应用程序的终端应用连接:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,原始的/dev/pts/0 连接存在。但是现在有两个额外的连接,并且来自终端应用的连接是在应用独特的用户 id(app_105)下运行的。

Sysfs 是另一个包含设备配置和控制文件的虚拟文件系统。在 HTC Incredible 上,存在以下顶级目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

出于好奇,你可以将/sys 目录下的文件通过 adb pull 命令拉取到你的取证工作站上,因为任何用户都可以读取这些文件。执行以下命令:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,大量文件被拉取,你现在可以使用完整的 Linux 工具套件来检查数据。尽管这些信息的取证价值需要进一步研究,但它清楚地提供了关于设备的低级信息,有助于安全研究。例如,如果你想了解更多关于 NAND 设备的信息,你可以检查以下目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后是每个文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

详尽了解 NAND 设备显然是进行取证和安全分析的重要步骤。将近 3000 个文件,有大量数据需要检查。以下是一种快速查看文件名、路径和大小的方法,这将使你能够轻松检查相关文件(尝试在两个终端会话中列出文件,在一个终端中使用复制/粘贴来“cat”文件内容):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

提示

附加 sysfs 分析

除了手动检查 sysfs 文件系统外,互联网上还有详细资源提供了额外的背景信息。这样一个资源是 Patrick Mochel 的一篇论文,提供了有用的背景信息(The sysfs filesystem, n.d.)。

最后一个虚拟文件系统被称为 cgroups,用于跟踪和汇总 Linux 文件系统中的任务。在 HTC Incredible 上,创建了两个 cgroup 文件系统:一个在/dev/cpuctl,另一个在/acct。尽管可能通过进一步分析得到结果,但会计数据在取证分析中通常并不证明是有用的。

proc

proc 文件系统在 /proc 目录下以结构化的方式提供了关于内核、进程和配置参数的详细信息。一些文件可以通过 shell 用户检查。然而,许多文件在你拥有 root 权限之前阻止访问。如前所述,探索 proc 文件系统的一种方法是将文件从 Android 设备拉到你的法医工作站上。这需要一些时间,并且在某些文件上可能会挂起,导致复制不完整。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 HTC Incredible 上,上述过程在尝试复制进程 76 时挂起,不得不使用 Ctrl-C 取消:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在取消之前,我们成功提取了 25 MB 的数据和近 6000 个文件。与 sysfs 检查一样,你可以使用 find 命令手动检查数据,以定位并列出文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另外,你可以直接从 adb shell 检查 /proc 中的某些文件,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设备的宝贵信息可以在 proc 文件系统中找到。检查员可以审计这些文件,并且应该从 /proc 目录中的文件开始,而不是子目录。

tmpfs

tmpfs 是一个文件系统,它将所有文件存储在由 RAM 支持的虚拟内存中,如果有的话,还包括设备的交换或缓存文件。目前大多数 Android 设备没有交换空间。然而,一些售后固件启用了这个功能。tmpfs 的优点是,通过使用 RAM,存储速度非常快,而且是非永久的,因此在重启时不会被保存。

当然,对于法医检查员来说,这是一个挑战。如果重要数据位于 tmpfs 挂载点上,必须在设备重启或断电之前收集这些数据。这也提供了一个独特的机会,因为 tmpfs 通常可以被 shell 用户读取,并且法医程序可以复制并在 tmpfs 中执行,而无需修改 NAND 闪存或 SD 卡。这可能允许检查员在完全不修改 NAND 闪存或 SD 卡的情况下从 Android 设备获取法医数据。

警告

调查 tmpfs

如果你对设备内存分析的主要兴趣在于,除非你首先拥有你感兴趣的内存部分的法医级副本,否则不建议对 tmpfs 进行更改。

在 HTC Incredible 上,标准安装有四个 tmpfs 挂载点:

• /dev

• /mnt/asec

• /app-cache

• /mnt/sdcard/.android_secure

/dev 目录包含设备文件,允许内核读取和写入连接的设备,如 NAND 闪存、SD 卡、字符设备等。/mnt/asec 和 /mnt/sdcard/.android_secure 目录是 Android 的新增功能,允许应用存储在 SD 卡上,而不是 /data/data,从而提供更多存储空间。

有趣的是,/app-cache 也是一个新增加的项,似乎提供了 tmpfs 空间,应用程序可以使用。在 HTC Incredible 上,网页浏览器(com.andrew.browser)在/app-cache 中创建了一个目录,并存储了网页浏览的缓存文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从第一个列表中,我们可以看到 app-cache 目录对所有用户设置了读、写和浏览权限。此外,权限“rwxrwxrwt”中的最后一个“t”表示只有 root 或目录所有者才能删除或重命名目录。

第二个列表显示了 app-cache 内部的目录,其中只有 com.android.browser。但是,当我们深入到目录中时,我们发现我们最感兴趣的目录和文件只允许应用程序本身(com.android.browser,应用程序的用户 ID 为 app_12)或 root 访问文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于我们在设备上拥有 root 权限,以下是目录包含的内容:

• 1.4 MB 的数据

• 64 个文件

• 18 个 ASCII 文件(主要是 CSS 和 JavaScript)

• 1 个空文件

• 9 个 GIF 文件

• 5 个 HTML 文件

• 11 个 JPEG 文件

• 17 个 PNG 文件

• 3 个 UTF-8 文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你从 Ubuntu 工作站浏览 webviewCache 目录,你可以轻松预览图像和其他文件(图 4.2)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4.2 从 Ubuntu 工作站浏览的浏览器 webviewCache。

/app-cache tmpfs 目录包含的信息在法医调查中非常重要。这强调了教育前线响应人员以确保设备得到妥善处理,以最大化法医调查有效性的日益需求。

扩展文件系统(EXT)

扩展文件系统(EXT)是 Linux 的默认文件系统,专门为操作系统开发。正如你已经知道的,Linux 支持大量的文件系统。然而,默认的是 EXT。自从 1992 年开发出 EXT 的原始版本以来,已经推出了三个额外的版本:EXT2、EXT3 和 EXT4。

尽管 EXT 已经集成到大多数笔记本电脑、台式机和服务器 Linux 发行版中,但在早期的 Android 设备中并未发现 EXT。然而,到了 2010 年,EXT 开始出现在设备中,2010 年 12 月 9 日,谷歌在他们的 Android 开发者博客上宣布,越来越多的 Android 设备将从 YAFFS 转移到 EXT(Android 开发者博客,未标明日期)。从 YAFFS 转向 EXT 似乎是由在线讨论的几个因素推动的(Way,未标明日期),包括

• 越来越多的 Android 设备从原始 NAND 闪存转向常规块设备(eMMC)

• EXT4 是一个标准的 Linux 文件系统,支持完整的 Unix 权限和语义

• EXT4 稳定且性能高

• YAFFS 是单线程的,在即将到来的双核系统上会遇到瓶颈

第一款使用 EXT4 的 Android 设备是 Google Nexus S,预计许多运行 Android Honeycomb 版本的平板设备也将使用这个新的文件系统。目前,Nexus 在以下挂载点使用 EXT4:

• 系统镜像(只读,/system)

• 本地用户数据(读写,/data/data)

• 缓存分区(读写,/cache 及其他可能)

从取证的角度来看,EXT4 只是一个需要取证工具理解和支持的文件系统。当然,目前大多数取证工具并不完全(甚至只是名义上)支持 EXT4,这确实带来了一些问题。文件雕刻技术是有效的,预计随着时间的推移,将会有更多的取证软件开始支持这个文件系统。

FAT32/VFAT

Android 设备通常具有一个或多个 Microsoft FAT32 分区,通常位于 SD 卡和 eMMC 上。采用这种久经考验的文件系统并非因为其设计优越,而是因为其与其他操作系统的高度兼容性。FAT32 文件系统在大多数操作系统中都得到广泛支持,包括 Mac OS X、所有 Windows 版本(显然)、Linux 等等。这意味着,存储在 FAT32 分区上的 Android 数据可以轻松地在其他文件系统上被读取、修改甚至删除。

在 Linux 中,FAT32 分区的文件系统驱动被称为 VFAT,不要与微软早期桥接 FAT16 和 FAT32 实现的虚拟 FAT 文件系统混淆,后者增加了包括长文件名支持在内的其他功能。在 HTC Incredible 上,有 3 个使用 FAT32 的挂载点。

/mnt/sdcard

/mnt/secure/asec

/mnt/emmc

如您在第三章关于 USB 接口的部分所记得的,当 Android 设备连接到另一台计算机时,可以选择暴露设备的 USB 大容量存储(UMS)接口以实现文件共享。在 HTC Incredible 上,/mnt/sdcard/mnt/emmc分区可以通过 USB 连接作为 UMS 设备向其他操作系统呈现。

/mnt/secure/asec分区是 SD 卡上的一个加密分区,Android 设备可以在此存储应用程序。当引入了从 SD 卡运行应用程序的功能后,安全工程师们理所当然地担心应用程序数据可能会容易被损坏或泄露,因为 VFAT/FAT32 分区没有维护文件权限。因此,应用程序(.apk 文件)在物理设备上被加密,在使用时会被解密并临时存储在/mnt/asec或其他指定位置。

如前所述,可移动的 SD 卡被挂载在/mnt/sdcard 上,通常包含照片、视频、缩略图、下载的文件、文本语音临时文件以及 Google Maps 导航数据,还包括许多 Android Market 应用程序的数据。较新的/mnt/emmc 是一个 FAT32 分区,不可移动,位于设备架构的存储中。在迄今为止检查的设备中,eMMC 通常被格式化为 FAT32,这也是为了互操作性。

YAFFS2

当第一个 Android 设备发布时,许多人对一个相对不知名的文件系统在系统中扮演关键角色感到惊讶。YAFFS(Yet Another Flash File System 的缩写)是一个专门为 NAND 闪存开发的开放源代码文件系统,同时遵循 GNU 公共许可证(GPL)和商业许可协议,后者适用于那些不想严格遵守 GPL 指导方针的人(YAFFS licence FAQs, n.d.)。Android 设备使用 YAFFS 的最新版本(YAFFS2),该版本遵循更严格的 NAND 闪存指导方针,旨在提高 NAND 闪存的耐久性,同时针对低内存移动或嵌入式设备进行优化。

YAFFS2 由新西兰的 Aleph One Ltd 公司开发。应客户要求,Aleph One 于 2001 年 12 月开始了 YAFFS 的设计工作,并于 2002 年 5 月发布了首个公开可用的源代码。主要开发者(或至少是最知名的)是 Charles Manning,他被描述为“嵌入式清洁工”,在过去的 20 年里一直在开发和完善嵌入式系统(YAFFS: the NAND-specific flash, n.d.)。Charles 在 YAFFS 邮件列表上非常活跃,是 YAFFS 和 YAFFS2 方面的公认专家。

提示

附加的 YAFFS2 资源

对于内部结构感兴趣的 分析师和工程师们,鼓励他们阅读完整的 YAFFS2 文档(如果感兴趣,还可以阅读源代码),访问www.yaffs.net/并订阅邮件列表。

YAFFS2 是专门为日益增长的 NAND 闪存设备而构建的,它具有许多重要特性,满足这一介质严格的需求。YAFFS2 是

• 支持日志结构文件系统(即使在意外断电情况下也能保护数据)

• 提供内置的磨损均衡和错误校正

• 能够处理坏块

• 快速且在 RAM 中占用空间小

然而,由于在 Android 之前其使用受到限制,目前没有(商业或开源)取证工具支持该文件系统。这使得取证分析师除了下载 YAFFS2 源代码,获取分区的取证映像,用你喜欢的十六进制编辑器打开并开始挖掘之外,几乎别无选择。尽管随着时间的推移可能会开发出一些工具,但 Android 转向 EXT4 可能会降低商业取证公司开发此类支持的积极性。

如 NAND 闪存部分所述,YAFFS2 通过 MTD 子系统以块的形式处理内存,每个块包含一定数量的页面(在 YAFFS 文档和代码中称为数据块)。当 YAFFS2 准备好将数据写入 NAND 闪存时,它将数据和元数据结构都传递给 MTD。MTD 然后负责将(以及读取)数据和元数据写入 NAND 闪存。

对于大多数 Android 设备,MTD 子系统以块的形式处理 NAND 闪存,这些块被划分为 64 个数据块,每个数据块包含 2048 字节(因此块为 128K),加上一个 64 字节的带外/备用区域(OOB),各种标签和元数据都存储在这里。当为写入分配一个块时,它会被分配一个从 1 开始并随每个新块增加的序列号。

YAFFS2 中存储的所有数据结构都被视为对象,可以是文件、目录、符号链接和硬链接。每个数据块要么存储一个 yaffs_ObjectHeader(对象元数据),要么存储对象的数据。yaffs_ObjectHeader 跟踪各种信息,包括对象类型、父对象、用于加速搜索的名称校验和、对象名称、权限和所有权、MAC 信息,如果对象是文件,还包括对象的大小。

在 64 字节的 OOB/备用区域中,YAFFS2 不仅存储关于数据块的 critical 信息,还与 MTD 子系统共享该区域。关键的 YAFFS2 标签如下:

• 1 字节:块状态(0xFF 表示块良好,其他值表示坏块)

• 4 字节:32 位数据块 ID(0 表示数据块存储 yaffs_ObjectHeader,否则为数据)

• 4 字节:32 位对象 ID(类似于传统的 Unix i 节点)

• 2 字节:此数据块中的数据块数(最后一个数据块除外,其余都会被完全分配)

• 4 字节:此块的序列号

• 3 字节:标签的 ECC(在 Android 中,由 MTD 处理)

• 12 字节:数据的 ECC(在 Android 中,由 MTD 处理)

如果对象被更改,新的 yaffs_ObjectHeader 将被写入闪存,因为 NAND 内存只能在擦除前写入一次。旧数据和头部仍然存在,但通过检查序列号的值,在文件结构中被忽略。这个过程符合 NAND 闪存中的块永远不会被重写(只写入一次,然后在不再需要时擦除)的指导原则。当然,这对于数据恢复过程可能具有巨大的好处,因为除非块经历了用于擦除块并准备接受新数据的垃圾回收过程,否则修改或删除的数据仍然存在于 NAND 闪存上。

同样,在 YAFFS2 中删除文件时,ObjectHeader 的父目录会被移动到一个特殊的隐藏目录中,称为未链接目录。文件将保留在此目录中,直到文件中的所有块段被擦除。为了实现这一点,文件系统跟踪系统中文件的块段数量。当它达到 0 时,文件残留部分不再存在。在这一点上,它将不再在未链接目录中跟踪对象。

虽然文件系统结构可以从 OOB 区域和 ObjectHeader 信息完全重新生成,但这并不高效——特别是随着 NAND 闪存大小的增长。因此,结构被加载到 RAM 中并维护(根据需要写入 NAND 闪存),使用树节点结构(T 节点)来跟踪所有已分配的块段。T 节点是固定的 32 字节,在其最低级别(级别 0)存储一个索引,用于定位第一个块段 ID。随着文件大小的增长,会添加额外的级别,这些级别由指向其他 T 节点的八个指针组成。

YAFFS2 通过从块的分配顺序的末尾开始,逆向读取每个块段来重新生成,并在 RAM 中填充文件系统结构作为 T 节点。这需要扫描整个 NAND,这是一个耗时的操作。为了解决这个问题,YAFFS2 开发了检查点机制,当它正常卸载时,该机制更喜欢将 RAM 结构保存到 NAND 闪存(使用 10 个块)。

为了让你更全面地了解 YAFFS2,还需要掌握一些其他关键概念。首先,垃圾回收是排队进行的,并且每次写入系统时如有需要都会执行。如果一个块中的所有块段都不再被使用,那么这个块就成为了垃圾回收的候选对象。系统还能够找到“最脏”的块,将已分配的块段复制到新块中,从而使该块可以进行垃圾回收。为了再次使用这个块,会通过写入全 1(0xFF)来擦除它。

在 Android 设备上,我们可以通过检查 /proc/yaffs 文件来找到关于 YAFFS2 文件系统的详细信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到许多有用的详细信息,例如,在挂载于 /data/data 的 “datadata” YAFFS2 分区上。通过检查该分区的 /proc/yaffs 列表,我们可以了解到以下内容:

  1. 有 1192 个块(从 0 到 1191),我们知道每个块有 64 个块段(2048 字节)。所以,128K × 1192 = 152,576K,你可以通过运行 df 命令或像我们上面那样检查 /proc/mtd 来确认。

  2. 显示了页面读取、页面写入和块擦除的数量。这将提供一个关于 NAND 闪存使用情况的总体概念。

  3. 垃圾回收过程中的一个策略是找到几乎空闲的块,将剩余数据复制出来,然后标记块为可收集。我们可以看到这个过程以很高的速率(323,313)发生。

  4. 我们可以看到没有检测到 ECC 错误。

  5. YAFFS2 元数据报告超过 63,000 个未链接的文件。

  6. YAFFS2 不使用软件 ECC,而是依赖于 MTD 或 NAND 闪存。

如果你比较没有高读写使用的 /data/data 目录的系统分区,你会注意到明显的差异。检查 /proc/yaffs 文件可能有助于提供解释错误纠正代码、碎片化数据等时的必要背景信息。

深入理解 YAFFS2 的最佳方式是直接创建、修改和检查文件系统。所有这些在本书其他练习中创建的 Ubuntu 工作站上都是可能的。由于我们已经安装了 Linux 虚拟机和 build-essential 软件包(包括必要的 C 编译器和支持软件包),我们现在需要安装 mtd-utils 软件包:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,我们下载最新的 YAFFS2 源代码:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后解压 yaffs2.tar.gz 并编译,这样我们就可以使用内核模块了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我们将加载必要的内核模块在 RAM 中模拟 MTD(除非你恰好有一些可以直接连接的 NAND 闪存)然后挂载 YAFFS2 分区。

首先,我们将在主目录中创建一个挂载文件系统的地方:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我们需要加载几个内核模块以启用 MTD 支持:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我们使用 nandsim 内核模块创建模拟的 NAND 闪存:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

提示

关于 Linux MTD 的额外信息

Linux MTD 网页提供了关于 nandsim 的更多详细信息。该网站提供了 MTD 的深入背景信息和支持,请访问以获取完整详情。

这里提供了来自 Linux MTD 网站的关于 nandsim 的额外详细信息以供直接参考(NAND FAQ, n.d.):

“NAND 模拟器(nandsim)是一个极其有用的调试和开发工具,它可以在 RAM 或文件中模拟 NAND 闪存。要选择模拟的闪存类型,你应该指定你的闪存的 ID 字节——即通过“读取 ID”命令(0x90)返回的字节——请参阅闪存手册。以下是输入参数的示例:

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x33—16MiB, 512 字节页”

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x35—32MiB, 512 字节页;

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x36—64MiB, 512 字节页;

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x78—128MiB, 512 字节页;

• modprobe nandsim first_id_byte=0x20 second_id_byte=0x71—256MiB, 512 字节页;

• modprobe nandsim first_id_byte=0x20 second_id_byte=0xa2 third_id_byte=0x00 fourth_id_byte=0x15—64MiB, 2048 字节页;

• 使用modprobe nandsim first_id_byte=0xec second_id_byte=0xa1 third_id_byte=0x00 fourth_id_byte=0x15创建一个 128MiB 的模拟 NAND 闪存,每页 2048 字节;

• 使用modprobe nandsim first_id_byte=0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte=0x15创建一个 256MiB 的模拟 NAND 闪存,每页 2048 字节;

• 首先使用modprobe nandsim first_id_byte=0x20 second_id_byte=0xac third_id_byte=0x00 fourth_id_byte=0x15创建一个 512MiB 的模拟 NAND 闪存,每页 2048 字节;

• 使用modprobe nandsim first_id_byte=0xec second_id_byte=0xd3 third_id_byte=0x51 fourth_id_byte=0x95创建一个 1GiB 的模拟 NAND 闪存,每页 2048 字节;

既然已经有了模拟的 NAND 闪存,我们可以像在 Android 设备上一样通过检查/proc/mtd来验证其大小和分区信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

系统显示我们有一个 MTD 分区(mtd0),擦除大小为十六进制的 0x20000 字节(128 KB),总大小为十六进制的 0x4000000(65,536 KB 或 64 MB)。接下来,我们需要将 YAFFS2 内核模块加载到内存中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们挂载 YAFFS2 文件系统之前,先在十六进制编辑器中查看未初始化的模拟 NAND 闪存。如果你尝试使用dd或仅仅是xxd这样的工具来查看 NAND 闪存设备,你将看不到 OOB 区域,因为它们对大多数工具是不可见的。这是为了防止那些不期望文件中有 OOB 的程序的混淆(想象一下尝试显示每个 2k 数据块后都有 64 字节二进制 OOB 数据的 PDF)。为了读取包括 OOB 在内的完整 NAND 闪存,我们使用之前安装的mtd-utils包中的nanddump程序。这将读取数据并以二进制形式返回它们。有几个选项可以考虑,可以很容易地查看:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于我们的目的,我们想使用nanddump提取包含 OOB 的完整 NAND,并将输出管道到十六进制编辑器(xxd)进行查看:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意,模拟的 NAND 闪存包含预期的 0xFF 值,这是空白或已擦除的 NAND 闪存应有的。上述命令将允许你检查在初始化和随后修改文件系统时,原始 NAND 闪存是如何被修改的。

因此,最后,我们准备挂载 YAFFS2 文件系统:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以验证文件系统是否已挂载并可访问:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,我们可以看到 YAFFS2 文件系统以读/写权限挂载在~/mnt/yaffs2目录下。尽管我们没有创建任何文件,但该目录包含一个lost+found虚拟目录,用于存放无法确定父目录的文件和目录。如果你再次使用xxd十六进制编辑器检查模拟的 NAND 闪存设备,它仍然会包含 0xFF。但是,如果你使用以下命令写入单个文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

并在文件中放入“Android 取证与移动安全”的内容,然后当我们检查原始 NAND 闪存时,可以清楚地看到包括 ObjectHeaders、Objects 和文件内容的 YAFFS2 结构。以下是使用 nanddump 和稍微修改过的 xxd 命令(添加了-a 选项以跳过 0x00 行)的部分十六进制内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从偏移量 0x0000000 开始,我们可以看到空白的 ObjectHeader,可以轻松地看到 ASCII 码中的文件名(book.txt)。从 0x0000800 到 0x000083F,我们可以看到由 YAFFS2 存储并由 MTD 作为打包二进制数据存储的 OOB 数据,必须进行解析。文件的实际内容被写入到 NAND 闪存的 0x0000840 位置。我们从 0x0001040 到 0x000107F 看到了另一个 OOB,然后在 0x0001080 位置再次写入 ObjectHeader 到 NAND 闪存,因为原始 ObjectHeader 表示的是空文件。一旦我们添加了内容并保存了文件,数据就被写入 NAND 闪存,并且一个新的 ObjectHeader 被写入到 NAND 闪存。新的 ObjectHeader 反映了关于对象的新元数据,包括哪些数据块保存了数据、MAC(修改、访问、更改)数据等。

需要理解的一个关键点是,YAFFS2 不能简单地将此信息更新到第一个 ObjectHeader,因为它首先需要擦除整个块。因此,它写入一个新的 ObjectHeader,为该头部生成一个高序列号,使其成为文件的最新 ObjectHeader。可以想象,旧的 ObjectHeader 和数据除非通过垃圾回收,否则会保留在 NAND 闪存上,从而为使用取证技术恢复文件元数据和内容提供了极大的机会。

YAFFS 示例

在关于 YAFFS2 的最后部分,提供了一个虚构的场景来说明 ObjectHeaders 和 Objects 是如何写入 NAND 闪存的。这个例子是由 Charles Manning 在他的“Yaffs 如何工作”(How YAFFS works, n.d.)中提出的。任何对 YAFFS 内部感兴趣的人都被鼓励打印、阅读或重新阅读这份文件。在示例中,我们使用了一个 NAND 闪存,为了简单起见,该闪存每个块有四个数据块,并且已被擦除(0xFF)。在描述每个更改后,一个表格将显示 NAND 闪存的内容。

首先,我们在 NAND 闪存上创建一个空文件,如表 4.6 所示。

表 4.6 创建空白文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ObjectHeader 指向一个空文件。接下来,我们向文件写入三个数据块,如表 4.7 所示。

表 4.7 写入三个数据块

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

到目前为止,这可能看起来很简单。现在对象占据了第一个块的全部。

注意

虚构的 NAND 闪存

请记住,我们的虚构 NAND 闪存每个块有四个数据块,而不是我们在商用 NAND 闪存中常见的 64 个数据块。

接下来,我们将保存文件,这将导致新的 ObjectHeader 被写入 NAND 闪存,如表 4.8 所示。

表 4.8 保存文件的新 ObjectHeader

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里需要理解的关键点是,YAFFS2 无法回过头来用新的大小、数据块和其他信息更新原始 ObjectHeader。相反,它必须写入一个新的 ObjectHeader,其中包含更新文件所需的元数据。在 YAFFS2 中,新的 ObjectHeader 被赋予更大的序列号,因此它成为当前的 ObjectHeader,YAFFS2 简单地忽略了之前的那个(然而,它仍然留在磁盘上)。

接下来,文件将以读写权限打开,并给第一个数据块赋予新值。最后,保存并关闭文件,这会导致额外的数据写入 NAND 闪存,如表 4.9 所示。

表 4.9 保存新数据和 ObjectHeader

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样,由于我们不能简单更改文件中的原始第一个数据块,因此将新的数据块写入 NAND 闪存,并将之前的数据块标记为过时。这通过向 NAND 闪存写入另一个新的 ObjectHeader 来实现,该 ObjectHeader 指向文件的新的第一个数据块。接下来,我们将文件截断为零长度文件,表 4.10 展示了 NAND 闪存的变化。

表 4.10 截断文件并写入新的 ObjectHeader

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于文件被截断,块 0 中的所有数据块都不再使用。这使得该块可用于垃圾回收,将在下一个写入周期发生。这被称为懒惰垃圾回收,因为它使用现有的写入周期来执行必要的垃圾回收。与之前一样,新的 ObjectHeader 被写入 NAND 闪存,以解释被截断的文件。

最后,我们重命名文件,NAND 闪存的结果如表 4.11 所示。

表 4.11 重命名文件并写入新的 ObjectHeader

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个周期中,块 0 进行了垃圾回收,现在可用于写入数据。由于文件被重命名,新的 ObjectHeader 被写入 NAND 闪存。块 1 中的所有数据块现在都过时了,它们可用于垃圾回收。然而,请记住,由于 NAND 闪存的有限耐久性,应避免写入/擦除周期。

对于法医调查来说,除非进行垃圾回收,否则 ObjectHeader 和 Object 数据块的整个历史都将保留在 NAND 闪存上。借助适当的软件,可以扫描 NAND 闪存,从而基本上重建文件系统的整个历史。时间线不仅会包含每次编辑的日期/时间,还有可能恢复文件的实际状态。实际上,YAFFS2 分区的状态并非这么简单。然而,这个基本原则仍然是相关的。

挂载的文件系统

我们已经详细介绍了 Android 内存系统的许多组成部分。我们不仅探讨了 RAM 和 NAND 闪存,还详细检查了许多文件系统。这些背景信息将帮助您对 Android 设备进行法医和安全性分析。为了更好地理解这些更学术的信息,我们现在将探讨在 Android 设备上找到的已挂载文件系统。

已挂载的文件系统

让我们从 HTC Incredible 上挂载的文件系统开始:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当你运行不带参数的 mount 命令时,它会返回已挂载的文件系统及其选项的列表。表 4.12 是使用多个条目的输出描述。但是,请注意,上述每个条目都以“0 0”结尾,由于空间原因,在表中省略了这部分。“0 0”条目确定文件系统是否由 dump 命令归档以及确定文件系统检查器(fsck)在引导时检查设备/分区错误的顺序的传递编号。在大多数桌面或服务器 Linux 系统上,根文件系统具有 1 的传递编号,因此它会在其他文件系统之前被检查。

表 4.12 mount 命令输出概述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

/mnt/sdcard 有许多选项。这些选项包括:

1. rw:挂载以允许读写

2. dirsync:对目录的所有更新都是同步进行的

3. nosuid:不允许设置 setuid(这会允许其他用户使用文件所有者的权限执行程序)

4. nodev:不将任何文件解释为特殊的块设备

5. noexec:不允许从文件系统执行所有文件

6. relatime:如果文件访问时间早于修改时间,则更新文件访问时间

7. uid=1000:将所有文件的所有者设置为 1000

8. gid=1015:将所有文件的组设置为 1015

9. fmask=0702:仅对常规文件应用 umask(设置权限—rwxr-x,或者用户=无,组=读写执行,其他=读执行)

10. dmask=0702:仅对目录应用 umask(设置权限—rwxr-x,或者用户=无,组=读写执行,其他=读执行)

11. allow_utime=0020:控制 mtime/atime 的权限检查。

12. codepage=cp437:为 FAT 和 VFAT 文件系统转换短名称字符设置代码页。

13. iocharset=iso8859-1:用于在 8 位字符和 16 位 Unicode 字符之间转换的字符集。默认为 iso8859-1。长文件名以 Unicode 格式存储在磁盘上。

14. shortname=mixed:定义了符合 8.3 字符限制的文件名的创建和显示行为。如果文件存在长文件名,它将始终优先显示。Mixed 模式会按原样显示短名称,并在短名称不全为大写时存储长名称。

15. utf8:将 CD 上的 16 位 Unicode 字符转换为 UTF-8。

16. errors=remount-ro:定义遇到错误时的行为;在这种情况下,重新以只读方式挂载文件系统。

所有挂载命令的选项在手册页(man 8 mount)中都有解释。然而,在大多数情况下,快速浏览将揭示审查员需要的信息,包括文件系统上的挂载点、类型和权限。

df 命令将提供有关已挂载文件系统上可用空间的免费信息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,当 shell 用户尝试确定可用磁盘空间量时,其中一个挂载点(/mnt/secure/asec)返回了权限被拒绝。通过查看父目录,我们可以看到只有 root 用户可以访问该目录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有趣的是,当通过 USB 大容量存储(UMS)选项暴露这两个文件系统/目录时,目录的权限会发生变化。如果未启用 UMS 选项,正如你可以看到 /mnt/emmc 和 /mnt/sdcard 的情况,文件系统对 Android 设备是完全可访问的。

然而,当 UMS 激活并且两个文件系统对连接的工作站可用时,权限会发生变化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,/mnt/emmc 和 /mnt/sdcard 上的所有权限都被移除了,因此 Android 设备不能直接从手机访问 /mnt/emmc 或 /mnt/sdcard(即它是与连接的工作站独占共享的)。

摘要

Android 设备上的物理内存、文件系统及数据结构是数据存储的基本构建块。对这些结构的深入理解不仅能够帮助你理解 Android 设备,而且当面对新的文件系统和数据结构时,还能进行自己的研究和开发。

参考文献

1. Android 开发者博客:安全保存数据。(未注明日期)。2011 年 2 月 2 日检索自 android-developers.blogspot.com/2010/12/saving-data-safely.html

2. Android 逆向工程。(未注明日期)。thomascannon.net。2011 年 1 月 29 日检索自 thomascannon.net/projects/android-reversing/

3. 数据存储。(未注明日期)。Android 开发者。2011 年 3 月 13 日检索自 developer.android.com/guide/topics/data/data-storage.html#netw

4. YAFFS 的工作原理:内部机制。(未注明日期)。YAFFS。2011 年 2 月 4 日检索自 www.yaffs.net/how-yaffs-works-internals

5. Nand Faq. (未注明日期)。Linux 的内存技术设备(MTD)子系统,2011 年 3 月 13 日检索自 www.linux-mtd.infradead.org/faq/nand.html

6. sysfs 文件系统。(未知日期),引自 2011 年 2 月 1 日,来自www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf

7. Way, T. (未知日期)。从姜饼开始,Android 将开始使用 ext4。Ted 的思考。欢迎来到 ce:italicthunk.org</ce:italic>,引自 2011 年 2 月 2 日,来自thunk.org/tytso/blog/2010/12/12/android-will-be-using-ext4-starting-with-gingerbread/

8. 许可证常见问题,Y. A. F. F. S. (未知日期)。YAFFS,引自 2011 年 2 月 4 日,来自YAFFS 许可证常见问题

9. YAFFS:NAND 专用闪存文件系统—介绍性文章。(未知日期)。引自 2011 年 2 月 2 日,来自YAFFS:NAND 专用闪存文件系统—介绍性文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值