我有一张 16GB microSDHC 卡,显然被手机(朋友的手机,不确定是哪款,但我能查出来)搞坏了:拍照时,突然无法访问/识别卡。事情发生时我和她在一起。我们立即关掉手机,没有尝试格式化卡或做任何事情。
使用 SD-CardReader 和 Ubuntu,设备仍然可以被识别,并且可以通过 dd 读取完整的 16GB 数据,不会出现错误。然而,99% 的 dd-dump 都是零字节尽管该卡之前已包含数 GB 的数据。只有极小部分仍包含数据,这些碎片分散在整个 16GB 中。
例如,该卡最初包含一个 FAT32 文件系统。但是,现在引导扇区和分区表以及第一个 FAT 副本和大部分数据都被清零了。奇怪的是,第二个 FAT 副本和根目录都完好无损。我在 dd-dump 中发现了(仅)三个部分 JPG,有趣的是,这些 JPG 中的 Exif 数据显示它们是在卡崩溃前拍摄的。
我的问题如下:
- 除了使用依赖于 Linux usb 大容量存储驱动程序识别(和解释)设备的 dd 之外,还有其他方法可以访问闪存卡的更低级别的信息吗(即真正读取芯片内容,而不是 usb_storage 看到的内容?某种形式的 FTL、JFFS 等?)?
- 数据真的被删除了吗,还是只是在某个地方被标记为“脏”?手机在几秒钟内真正覆盖 16GB 内存在物理上是不可能的。那么也许有办法读出真正的数据?或者这通常只能通过拆卸卡并通过专用硬件直接访问 NAND(?) 设备来实现?
我将不胜感激任何指点 - 因为我的朋友除了手机之外并没有真正使用过电脑,她从来没有费心将任何图像从手机复制到更安全的地方,因此数百张朋友和家人的照片就会丢失 :-/
答案1
除了使用依赖于 Linux usb 大容量存储驱动程序识别(和解释)设备的 dd 之外,还有其他方法可以访问闪存卡的更低级别的信息吗(即真正读取芯片内容,而不是 usb_storage 看到的内容?某种形式的 FTL、JFFS 等?)?
是的,有时称为 NAND 或 ONFI 协议可用于访问“原始”NAND。正如您所怀疑的,在您转储 NAND 之后,您会发现自己面临另一个层面的问题,您必须在没有控制器处理 FTL、XOR 加扰、ECC 错误更正等的情况下解决这些问题。
因此,读取卡是最简单的部分,它会给你一个二进制 blob,需要将其“转换”为可以从中恢复文件的逻辑文件系统。要解决混乱问题,你需要 XOR 密钥,或者如果你幸运的话,你的软件已经知道这一点。ECC 算法也是如此。然后我们需要构建一个虚拟翻译器来将块按正确的顺序排列。
如果您想了解更多信息,请在 Google 上搜索 Igor Sestanj 撰写的“NAND Flash 数据恢复手册”。
数据真的被删除了吗,还是只是在某个地方被标记为“脏”?手机在几秒钟内真正覆盖 16GB 内存在物理上是不可能的。那么也许有办法读出真正的数据?或者这通常只能通过拆卸卡并通过专用硬件直接访问 NAND(?) 设备来实现
如果数据就这样消失了,那么确实有可能只是转换器损坏了。唯一能确定数据是否可以恢复的方法是尝试芯片恢复(假设您已验证卡中大部分内容为零)。某些相机在快速格式化 SD 卡时使用 SD 规范 TRIM 等效项“SD_ERASE”,也会发生这种情况。
对于 microSD,这意味着刮掉卡的背面以露出技术引脚。在全尺寸 SD 卡上,您可以幸运地从 PCB 上拆下 TSOP 或 NAND 芯片,这些芯片通常可以使用标准适配器读取。如果您很幸运,这是一种相当常见的布局,因此可以使用适配器。如果不是,则需要将电线从引脚焊接到 NAND 读取器。如果不知道引脚排列,则需要使用逻辑分析仪进行查找。
下一步是转储(读取)NAND 并解决扰乱、ECC、布局难题。幸运的是,存在可以帮助解决此问题的软件,例如 PC3000 Flash、Rusolut VNR 或 Flash Extractor(如下图所示)。
编辑:在我的热情和偏见中,我完全忘记提及 SPI 接口(串行外设接口),因为它在数据恢复中并不常用。
从技术上讲,您可能会认为我上面的文字不是关于访问 SD 卡,而是关于 NAND 内存,SPI 实际上是在较低级别上与 SD 卡进行更直接控制的通信方式。但是,您仍然需要通过控制器,因此如果出现“无效”转换表,它将对您无济于事。
编辑2:我也需要添加这个,因为我们正在处理(问题是关于)在(我假设是 Android)手机中使用的 SD 卡。
如果手机使用的 (micro) SD 卡丢失数据,我们需要考虑手机可能已加密数据。然后,这还取决于特定的 Android 版本和卡的使用模式(内部存储器 <> 便携式存储)。如果卡用作便携式存储,并且用户未应用加密,则我上面写的内容适用。有些手机(三星?)倾向于单独加密便携式存储上的文件。只要手机没有重置,就应该可以恢复文件。
如果您碰巧从 Android 手机中使用的 microSD 恢复文件,并发现它们已“损坏”,则请检查文件(例如 HxD)。如果您能发现字符串 CONSOLE,则文件已加密:
答案2
没有标准或“内置”方式来告诉 SD 卡向您提供原始 NAND 数据。
这只是猜测,但 SD 卡中的微控制器可能实现了某种物理块地址到逻辑块地址的映射,以便进行磨损均衡。此 PBA 到 LBA 表可能像实际数据一样存储在 NAND 上,相对较小,可能跟踪空闲块,并且确实可以在几秒钟内被覆盖。
还有其他方法可以访问闪存卡的更低级别的信息吗
如果您拆焊 NAND 或焊接外部电线,找出 NAND 的类型,并在 PC 上安装某种接口,您就可以转储原始内容。即使这样做了,您仍面临一项困难的逆向工程任务,因为数据的格式可能是 SD 卡上微控制器独有的,我无法想象您会从哪里开始寻找这些信息。
你可能会发现这很有趣,但可能不是很有用。看来 SD 卡具有与 SCSI“供应商特定命令”相当的功能,用于更新 SD 微控制器上的固件。因此,理论上可以上传自定义或修改过的 SD 微控制器固件,该固件对读/写请求的响应不同。不过,您只能达到上述相同的效果。我不知道有任何实际存在的 SD 微控制器自定义固件或项目。
更新:请在此处查看@Joep van Steen 的精彩回答。