大多数现代的基于闪存的设备控制器利用加扰器模式来为他们写入闪存的数据。该扰码器通常是控制器制造商所独有的,有时也是独立的控制器型号。
只有在加扰模式已知(或可以确定)的情况下才能从以这种方式加扰的设备中恢复数据,因为加扰数据在没有首先被去除加扰模式的情况下将不可用。
加扰器实现类似于基本加密,其中由控制器对数据进行异或(此处为异或)操作。这是在使用控制器的线性反馈移位寄存器写入闪存之前发生的。
与真正的加密不同,加扰模式不是出于安全原因而设计的,因此易于识别,提取然后用于数据恢复。
我们应该首先确定我们的NAND芯片的结构,通过它我们可以轻松确定数据区域(可能是异或),备用区域标记和ECC代码。之后我们肯定需要删除制造商的备用区域标记和ECC,因为这些区域没有进行异或,并且不需要通过我们的过程进行排除。有时备用区标记也是异或的,这种情况并不常见,但可能会发生。
可以在文章中找到使用VNR的NAND芯片的目的,识别和结构生成的解释。
如果您已经花了一些时间处理案例并且无法确定您期望的通常的,可读的数据结构,则可能是数据被加扰或加密。对于市场上可用的大多数设备,不支持或实施加密。
在实现XOR扰码器的情况下,通常可以在闪存转储中找到模式。这些模式通常很容易识别,可以在文章中找到识别这些模式的指南。
要查看上面链接的“Xor键视觉识别”文章中显示的可识别结果的类型,我们需要将位图查看器设置为一页的大小(如果默认情况下未设置)。一旦我们完成了这个操作,我们就可以滚动NAND转储并尝试找到一个模式,例如与上面链接的模式,以便开始我们的提取。
还有另一种浏览转储的方法,可以节省时间并防止手动设置密钥的开始和结束偏移。我们可以通过将页面大小设置为闪存的一个块来实现这一点(这是我们之前记录的值之一)。
VNR允许我们将十六进制编辑器设置为Page View,并以恰好一个块大小的增量逐步执行转储。这也将有助于我们以后,因为十六进制编辑器也将只显示一个块,我们可以非常简单地提取整个XOR键,然后也保存它。
通过在主VNR界面中选择它,然后单击工具栏中的转储查看器项,打开您想要处理的“Phy Image”。这将允许我们打开VNR的转储查看器显示。在转储查看器的工具栏菜单中,您应确保选择了十六进制视图和位图视图。此外,单击十六进制视图并确保选中“页面视图”。
您现在应该有一个类似于以下内容的Window:
1.转到位图查看器选项卡
在左上角,您将看到一个标记为“页面大小”的字段,其右侧有一个图标,由P和两个绿色箭头组成。单击此图标会将我们的位图视图设置为我们在NAND芯片配置中使用的页面大小。
2.在Hex Viewer中,将页面大小设置为我们之前提到的NAND芯片“块大小”。
3.现在您可以通过两种不同的方式取得进展,您可以:
- 使用滑块和箭头一次单步执行1个块,直到找到您的键
- 使用位图视图右侧的滚动条并尝试以这种方式定位模式
当密钥和体系结构未知时(与新的和/或不支持的设备一样),没有确切的科学来定位密钥,但是有一些事情需要牢记。通常,设备的控制器利用闪存最开始的块来存储固件代码。该区域可以包括关于闪存上的数据的逻辑布局,转换器表和许多其他信息的信息。一次跳过这1个区块可能非常耗时。通常,我们跳32个块,如果没有数据,我们跳到块64,然后跳到128,依此类推。一旦我们找到了持久的数据区域,我们就可以恢复每次一个块的步进,直到找到密钥为止。
在下图中我们很幸运,我们有两个包含Xor键的连续块,这在提取“干净”键时非常有用。
这不应该被证明是一个太大的问题,因为块大小完全可以被XOR键大小整除,所以我们仍然可以使用一个完整的块作为我们的密钥,只是密钥将比它需要的大。 。
找到1个密钥后,我们就遇到了问题。我们提取的块有可能包含完整的不妥协的密钥,但这是不可能的。
我们还有一些事情需要考虑:
- 密钥可能包含已被数据破坏的区域,到目前为止,我们无法判断密钥是纯XOR密钥还是只是一个高密度区域浓度为0x00(零)或0xFF。
- 我们没有考虑ECC,提取的密钥很可能包含误码,我们也没有考虑过这个问题。
- 仍然有可能(但不太可能)这是一个用不像0x00或0xFF那么简单的模式编写的区域。该模式可以在整个密钥区域上重复相同的字节,或者可以重复2个字节或更多。
为了最有可能减轻上述问题,我们需要从转储的不同区域提取密钥的三个副本。如果我们知道转储包含特定数据集,我们可以选择三个连续的块 - 如果我们不能确定,那么尝试找到来自NAND上不同位置的三个块总是更好。
找到键后,我们可以在十六进制编辑器中选择整个块(这可以通过单击并拖动或使用Ctrl + A来完成)。在“转储查看器”选项卡中,使用“保存选定”将密钥保存到案例文件夹,对第二个和第三个区域重复此过程,如下图所示。
一旦我们有了3个区域,我们就可以开始清理密钥了。无论ECC如何,都可以清除密钥,因为即使在TLC内存上也会出现位错误的可能性,这些错误会影响与我们提取的其他两个版本完全相同的位,这一点可以忽略不计,也就是说,这并非完全不可能。这发生了,所以要注意它。如果ECC类型在VNR中可用且可用,则理想的是在绿色块上工作,这通过消除在我们提取的密钥内的ECC错误的可能性来减少等式中的一个未知数。理想情况下,应尽可能避免ECC映射中的红色块。
现在我们有了XOR键的样本,我们可以清理它们。通常,特别是如果我们通过VNR启用了ECC,我们的密钥已经非常干净了,但是我们不能排除密钥区域中存在的实际数据会破坏提取的密钥。如果密钥对我们来说是全新的,我们不能排除在模式下隐藏特定模式的数据 - 我们可以做的是最小化密钥中存在误码或偶然字符的可能性,从而破坏提取的内容版。
为此,我们使用VNR的“比特验证”功能。位验证器接收输入并比较它们。如果三个输入中的两个包含相同的数据而第三个输入不一致,则位验证器会忽略不一致的元素并与其他两个元素一起使用。这个过程并非万无一失,但在实践中它非常可靠,特别是与ECC结合使用时。
现在从VNR工作区打开提取的密钥。使用“打开物理图像”菜单项,您可以同时选择所有三个,它们将被添加到VNR工作区。我们现在可以验证它们。
要使用Bit Verificator,请执行以下操作:
A。将Bit Verificator“V”元素添加到VNR工作区
B.检查元素数是否已设置为已提取的键的版本数
C.加入每个元素提取密钥到Verificator
你应该留下以下内容:
在大多数情况下,Xor加扰器模式仅适用于闪存的数据区域,一些控制器也在备用区域上实现它,但这种情况不太常见。对于此示例,我们只需要从数据区域中删除加扰器。我们将完全从提取的密钥中删除ECC和备用区域。由于我们已经定义了flash的结构,这个过程很简单:
A.右键单击具有已定义结构的转储,然后选择“将结构复制到缓冲区”