我一直在阅读和阅读有关 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 字节空闲字节......
有人可以对我更了解吗?请?