《iOS取证实战:调查、分析与移动安全》一3.5 存储器类型

简介: 本节书摘来自华章出版社《iOS取证实战:调查、分析与移动安全》一书中的第3章,第3.6节,作者(美)Andrew Hoog Katie Strzempka,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.5 存储器类型

iPhone设备有两种主要的存储器类型,易失性存储器(RAM)和非易失性存储器(NAND闪存)。这两种存储器各自提供了对设备数据的不同处理方法。

3.5.1 RAM

RAM用于系统加载、执行,以及处理操作系统、应用程序和数据的关键部分,它的数据在重启后不保存。类似于传统计算机,RAM可包含应用程序处理数据的重要信息。例如:
密码
加密密钥
用户名
应用程序数据
系统进程和服务数据
在审查调查中,获取设备RAM中存储的数据的能力是非常重要的。然而,更重要的一点是,我们必须在设备关闭或重启前去获取这些信息。尽管从标准Windows硬盘驱动器、Linux工作站甚至Android设备上都可能进行内存检查,但是目前还没有方法从一台开机状态的iPhone设备上恢复内存数据。直到2011年初,通过恢复位于/private/var/vm/sleepimage目录的“sleepimage”文件,Mac OS X才在某种程度上能够执行内存数据提取。这个文件的用途是存储系统休眠时Mac内存中的数据。当计算机被“唤醒”时,包含在sleepimage文件中的信息会重新发布到内存中,这样Mac能够回到休眠前的初始状态(Sleepimage,2010)。
2011年初,Mac Memory Reader发布。这是一个实用的命令行工具,它能够执行Mac OS设备的内存信息转储,并将结果输出到外部设备上(Valenzuela, 2011)。不过,Mac Memory Reader还不能应用在iOS设备上。

3.5.2 NAND闪存

与RAM不同,NAND闪存是非易失性的,因此在设备掉电或者重启后数据依然存在。NAND闪存不仅用来存储系统文件,也用来存储用户数据中的重要部分。
NAND闪存存储器有一些特点,这和近代硬盘驱动器中的磁性介质有很大不同。这些特点使得NAND闪存成为移动设备理想的存储器。在带给程序员许多挑战的同时,这些特点也给取证分析师带来许多机会。
首先,NAND闪存没有机械移动部件,而传统磁性介质硬盘驱动器上有旋转磁盘和磁头臂。这一特性提高了存储器的耐用性,减小了设备的尺寸,降低了设备的电量消耗。存储器由一个或多个芯片组成,这种芯片通常集成了NAND闪存和RAM,并直接集成到设备的电路板上。
其次,NAND闪存有非常高的密度,对制造商来讲是有成本的。当然,这种高存储密度使得NAND闪存很受制造商欢迎。但有一个不利因素是,受制造商制造过程和工艺的影响,NAND闪存通常会产生一些坏块。制造商在生产过程中通常会检测存储器件,并在NAND闪存中的一个特殊结构中标记坏块,这在制造商的文档中有相关描述。直接和NAND闪存交互的软件可以读取制造商的坏块标记,通常是一个坏块表,以此逻辑跟踪系统中的坏块,并在操作中移除它们。这极大地提高了坏块检测和管理的效率。因此,尽管NAND闪存物理上比旋转磁盘更加耐用,但是它的错误率更高,而且这种错误必须在开发和使用中予以记录。
NAND闪存的另一个重要的限制是其非常有限的写入/擦除使用寿命,在使用寿命结束之后块将不能存储数据。使用寿命根据设备而不同,在很大程度上受到每个NAND闪存单元中存储数据的数目影响。NAND闪存单元是存储比特1或0的中央构建基块。如果一个单元仅存储一个比特(single-level cell,SLC),那么对于一年数据保留(1-year data retension)来讲,NAND闪存支持大约100 000次写入/擦除周期。然而,NAND闪存很少使用SLC,因为制造商(和消费者)需要设备在相同大小的存储器件上进行更多的数据存储,或者让存储器件更小。NAND闪存从技术上已经迁移到多层单元(MLC),这样一个单元能够存储2比特、3比特甚至更多比特。但是,这种技术不仅使制造过程更加复杂,减慢了写入/擦除周期,也极大降低了设备的耐久性。一个典型的每单元存储2比特的MLC NAND 闪存在耐久性上减少了10倍(用一年数据保留来衡量),写入/擦除周期大约为10 000次。随着每单元比特密度的增加,耐久性持续降低,很明显,因为必须通过控制设备来进行寻址操作。
不像RAM和NOR闪存(NOR闪存也是闪存存储器件,其在系统中的典型应用是用于计算机的基本输入/输出系统,即BIOS),NAND闪存不能随机访问。相反,需要通过分配单元(称为“页”)来达到数据访问的目的。一个典型的页大小在512~2048字节,但是通常随着整个NAND闪存容量的增加,页大小也在增加。例如,一个32GB 的iPhone 4设备,每个页有8192字节。尽管不能提供像RAM那样快速随机访问,但是由于NAND 闪存不需要传统磁盘驱动器的机械磁盘和磁头臂移动,它的访问速度也是相当快的。将页组织起来形成更大的逻辑单元,称为块。典型的块大小比传统的512GB硬盘驱动器的扇区要大很多。当要向块写入时,块内的页是连续写入的。
在iPhone文件系统中,有一个称为ADDataStore.sqlitedb的文件,这个文件包含了设备中有关NAND闪存的特定细节。在早期模型中,这个数据库是空的。然而,填充之后的“标量”表将包含类似下面的信息:

image

NAND闪存的重要特征是读取和写入的有效操作:
读取(页)
写入(页)
擦除(块)
尽管可以读取和写入单独的页,但擦除却是运行在块级别的。擦除块时,整个的块写入全1(或者是十六进制的0xFF)。NAND闪存中擦除操作唯一的机制就是将0改为1,这点值得讨论。在传统硬盘驱动器中,如果一个值从0变为1(或者从1变成0),程序仅会搜索硬盘驱动器上的这个值,并利用适当的电压改变并存储新的值。然而,NAND 闪存的基本架构仅提供了从0变为1的机制,这种机制利用块级别(而非单个页级别)的擦除功能来实现。因此,一页仅能写入一次,如果需要改变页的值,必须擦除整个的块然后重新写入。
这里选用单字节的例子来简单说明:有一个字节,它的十进制值是179,想加上39,让其和变为218,不熟悉从十进制、十六进制及二进制之间数字转换的读者,可以使用Windows、Mac OS X、Ubuntu Linux中内置的计算器程序,这些程序都提供了程序员模式以执行这种转换。我们把以上数字在数字系统之间的转换列在表3-2中。
image

数值179的二进制表示包含3个0,需要将其中的2个0变为1才能表示新的数值218。但是,NAND闪存不擦除整个块就不能做这种修改。因此,如果不进行擦除就试图改变这个字节,那么得到的结果会是146,而不是218。下面是这个变化过程:
image

如果字节不是全1(0xFF),写周期内唯一能成功的部分是依然保持是1的比特位或者是改变为0的比特位。任何时候写入功能碰到0并且要求将这个0变为1,都将会失败,只会简单地保持原值。结果得到的字节是十六进制0x92(或十进制146),很明显这不是我们想要的。写入功能的另一种描述是:它仅能在需要时将1改变为0,这等同于两个值的逻辑与。
总之,页仅能写入一次,如果需要重新写入,就必须首先擦除整个块。
人们可以说,NAND闪存强加给开发者各种限制和局限,在这种限制中有效工作的文件系统必须是闪存感知的。已部署的两种重要技术是ECC(纠错码)和磨损均衡。这两种技术对取证和数据恢复有重要的意义。
首先,ECC可以使用算法来检测读取和写入操作时的数据错误,并立即更正这些错误。因为NAND闪存会随着使用时间而退化,所以当页或者块出现错误时,系统必须能够检测到并恢复存储在那里的数据。如果错误或操作失败次数过多(一般为3次失败操作),就会将这个页或者块标记为“坏的”并把它添加到坏块表中。
有效管理iPhone上NAND 闪存的第二个重要的算法是磨损均衡代码。磨损均衡技术将要写入的数据散布在整个NAND 闪存上,以避免过度使用单一区域,否则将使得某些块磨损得更快。建立HFS Plus(增强型分层文件系统)的目的之一就是减少对NAND的写入和擦除操作,以使得数据能尽可能久地保存。磨损均衡技术使得许多信息能够恢复。旧的数据备份并没有被删除,而只是被标记为“未分配的”。因此,即使在数天、数周或数月之前删除的数据,我们也可以通过分析iPhone敏感数据的隐藏副本来获取相关信息。在第6章将详细讨论相关的分析方法。

相关文章
|
8月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
798 4
|
8月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
10月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
113 2
|
8月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
340 21
|
7月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
147 8
|
8月前
|
监控 算法 iOS开发
深入探索iOS函数调用栈:符号化与性能调优实战
在iOS开发中,理解函数调用栈对于性能调优和问题排查至关重要。函数调用栈记录了程序执行过程中的函数调用顺序,通过分析调用栈,我们可以识别性能瓶颈和潜在的代码问题。本文将分享iOS函数调用栈的基本概念、符号化过程以及如何利用调用栈进行性能调优。
94 2
|
10月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
429 3
|
10月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
11月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着重要的位置。本文将深入探讨这两种操作系统的开发环境,从编程语言到开发工具,从用户界面设计到性能优化,以及市场趋势对开发者选择的影响。我们旨在为读者提供一个全面的比较视角,帮助理解不同平台的优势与挑战,并为那些站在选择十字路口的开发者提供有价值的参考信息。
173 17
|
9月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。