如何使用VB.Net检索存储的信息,NAND文件系统

逆向工程 加密 解密
2021-06-26 04:08:29

我一直在阅读和阅读有关 NAND 和 NOR 闪存的内容。我想要(通常为 512 字节)来访问 nand.bin 文件中的一些存储信息,但我一生都无法弄清楚我需要做什么才能解密它. 我知道它需要一个我有的钥匙,只是不知道如何使用它。这是我所知道的。任何建议都非常感谢,我不知所措。

NAND 使用专有格式。

该格式用于存储设备特定数据(配置块等)和系统数据(引导加载程序、内核等)。

文件使用设计为可转换的格式存储(每个更改都可以还原)。

nand 使用一系列页面组合成块,这些块是数据片段(通常为 512 字节),每个片段末尾都有一个 EDC 标签(额外的 16 字节)

这些页面是特定块(可以用 EDC 标识)的每个部分,通常由 16 页组成。

所有(非 eMMC)NAND 对 NAND 内的每个页面都有特定的备用/元数据。有时它不会与 NAND 一起转储,因此必须将其添加回或重新转储。元数据包含页块号、一系列标志和校验和。这些略有不同,具体取决于块大小。

ECC/EDC 校验和使用自定义算法 - 这里是 C 代码(将转换为 vb.net)

int checkEcc(u8* datc, u8* spare)
{
unsigned int i=0, val=0;
unsigned char edc[4] = {0,0,0,0};
unsigned long * data = (unsigned long*) datc;

unsigned int v=0;
 // printf("original ECC  : %02x %02x %02x %02x ", (spare[0xC] & 0xC0),       spare[0xD],spare[0xE],spare[0xF]);

for (i = 0; i < 0x1066; i++)
{
if (!(i & 31))
{
    if (i == 0x1000)
    data = (unsigned long*)spare;
    v = ~*data++; // byte order: LE 
}
   val ^= v & 1;
   v>>=1;
   if (val & 1)
       val ^= 0x6954559;
val >>= 1;
}

val = ~val;

edc[0] = (val << 6) & 0xC0;
edc[1] = (val >> 2) & 0xFF;
edc[2] = (val >> 10) & 0xFF;
edc[3] = (val >> 18) & 0xFF;

if(((spare[0xC] & 0xC0) != edc[0])||(spare[0xD] != edc[1])||(spare[0xE] != edc[2])||(spare[0xF] != edc[3]))
return ECC_FAILED;

return ECC_CORRECT;
}

在 NAND 的 0x2 处存储了闪存的版本(2 字节)。进一步在 0x8 处存储 CB 的偏移量,然后是 CF1 偏移量(每个 4 字节)。

在 0x78 处存储了 SMC 的长度和到 SMC 的偏移量(每个 4 字节)。

这是我之前被告知但仍在学习并且无法理解的内容:

根据 nand 检查密钥非常简单,因为 nand 的某些部分是使用您的密钥加密的,作为密钥,每个部分都有不同的算法……其中大多数使用 RC4 与 HMAC-SHA1(用于RC4 密码是您的 cpukey 的 HMAC-SHA1 哈希)

要从 nand 中获取数据,您必须逐个读取 32 页中的每一页,丢弃 0x200 字节用户数据之后的 0x10 字节空闲字节......

有人可以对我更了解吗?请?

1个回答

一、NAND flash的一些基础知识:NAND flash分为blocks,再细分pages。页的写入是原子性的(您可以对页进行部分编程,单个页最多可编程 4 次,但很少使用),并且擦除总是在整个块上完成。而且,由于缺乏可靠性,页面带有备用区域来放置一些纠错码。

让我们尝试使用您所拥有的:带有从 0 到 0x1066 的循环的源代码,但仅在 (!(i & 31)) 时使用数据,条件为 (i == 0x1000) 从数据到备用,并且data是一个unsigned long *,通常是一个指针,指向4个字节长的整数。所以,这些是大约 512 字节的页面,备用至少 12 字节大。字节 12、13、14 和 15 用于 EDC,它是 16 个备用字节,这对于小页面 NAND 很常见。我还期望每块 32 页。

现在,您的 EDC 只是一个 EDC,而不是 ECC,也许它适用于旧的 NAND 技术。

但这就是我们所能得到的。我们可以确认您已经知道的内容。

您询问 NAND 版本、CB SMC 和 CF1(无论这些首字母缩写词对您意味着什么)。在没有数据的情况下,我们无法向您展示任何模式来判断您的数据是否包含备件,您的数据是否看起来倒置等等。您对我们有什么期望?

事实上,最简单的方法是拥有文件系统源代码,但也许你不想在你的安全实现中发布潜在的缺陷......