闪存文件系统

From 3dbrew
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

3DS使用了容量为1GB的一片NAND闪存芯片。 从NCSD的头部来看,NAND实际使用的大小为0x3AF00000.

格式

通过主板上的输出针脚提取闪存芯片内容是可行的,并且已经取得成功。但由于数据是加密过的,不经解密无法理解。

加密

NAND文件系统使用AES-CTR加密。NAND中TWL region使用TWL NAND的keyslot,而CTR region使用CTR NAND的keyslots。CTR NAND分区的 keyslot 是由NCSD分区的磁盘文件系统类型所决定的。每个分区表的NCSD分区加密标志位(TWL keyslot 或 CTR keyslots)这样表示: 0x01=TWL, 0x02=CTR。TWL/CTR NAND region在NCSD头部指定。NAND的前 0x0B100000 byte使用TWL keyslot加密,在0x00012E00之前则只有MBR分区表使用TWL keyslot(那个region包括下表所示的TWL分区)。

切记,一台3DS重加密的NAND镜像,不能直接给另一台3DS使用,“NAND”分区的某些文件也需要修改/更换。

NAND结构

分区名 偏移 长度 NCSD分区文件系统类型 NCSD分区索引(index) 注释
0x0 0x200 NCSD头, 包括了后续CTR-NAND的偏移/大小信息. 这个块也包含了 TWL-NAND MBR分区表.
0x00000000 0x0B100000 0x1 0x00 TWL NAND region
twln 0x00012E00 0x08FB5200 TWL-NAND FAT16. (DSi)
twlp 0x09011A00 0x020B6600 TWL-NAND PHOTO FAT12. (DSi)
0x0B100000 0x00030000 0x04 0x01 默认为全空填充此分区(只有 0x00/0xFF byte,并且从不写入). AGB_FIRM was never launched. 包含 AGB_FIRM GBA游戏.
firm0 0x0B130000 0x00400000 0x03 0x02 Firmware 分区.
firm1 0x0B530000 0x00400000 0x03 0x03 Firmware 分区.(备份分区, 同上)
0x0B930000 0x2F5D0000 0x01 0x04 CTR-NAND partition. (3DS)
nand 0x0B95CA00 0x2F3E3600 CTR-NAND FAT16文件系统.

3DS中NAND TWL FAT分区的卷标为"TWL",CTR FAT分区为"CTR"。TWL分区的偏移和大小存储在MBR分区表中,而CTR分区表信息存在NAND NCSD头部。CTR-NAND分区的0扇面包含一个TWL-NAND分区的MBR分区表,而MBR的签名在+0x1fe位置。

NAND扇面未被写入前,只包含明文的0x00或0xFF byte.

除TWLP,以上NAND物理分区均不能使用ARM11直接读取。CTR/TWL NAND文件系统只能当exheader访问控制描述符启用时候访问。对于零售版机器中的CXI进程,CTR/TWL的NAND描述符一般都是未启用的状态。ARM11只能将"nand:/rw/"挂载为"nandrw"的档案,而"nand:/ro/"则挂载为如下的nandro档案。

0x4000

某些3DS系统(比如3DS XL),有一个明文的FAT16引导记录在NAND偏移的0x4000位置。这个块在launch-day 3DS的系统里是不存在的。在这个“分区”内只有明文的块。

CTR分区

nand/title的结构似乎和SD卡系统的完全相似,除了存档保存在nand/data/<ID0>/sysdata目录。

nand/data之下的子目录名是movable.sed的SHA256散列。这个NAND的nand/data/<ID0>目录和"sdmc/Nintendo 3DS/<ID0>/<ID1>",只是里面的数据是明文。movable.sed keyY只用于nand/data/<ID0>的AES MACs(AES加密+MAC绑定?)。nand/data/<ID0>/extdata保存的是公用的extdata,结构和SD卡的extdata完全一致。

"nandrw"归档会挂载到"nand:/rw/",而"nandro"归档会挂载到"nand:/ro/"。


nandro
├── private
├── shared
└── sys
    ├── HWCAL0.dat
    └── HWCAL1.dat
nandrw
├── shared
└── sys
    ├── lgy.log (发生错误时由TWL_FIRM记录,是与native.log等效的)
    ├── LocalFriendCodeSeed_B
    ├── native.log (This is written to by ErrDisp)
    ├── rand_seed
    ├── SecureInfo_A
    └── updater.log


nand
├── __journal.nn_
├── data
│   └── <ID0>
│       ├── extdata          
│       └── sysdata
├── dbs
├── fixdata
│   └── sysdata
├── private
│   └── movable.sed
├── ro
├── rw
├── ticket (自ticket存放到ticket.db后,这个目录就是空的了)
├── title
└── tmp (这个通常是空的, even when installation for a system update still needs finalized)


TWL分区

TWL分区的结构和DSi的几乎一样,除了Tickets存在CTR的FAT文件系统。TWLP分区则是和DSi完全一致。

twln/title的结构和CTR的NAND/SD一致,除了.cmd是明文(好像是虚假文件)。在系统Title的/title目录下的data目录并不存在,似乎只有DSiWare的才有。

twln/title下名为titleID-High的目录是DSi的。

twln
├── import
├── shared1
├── shared2
│   └── 0000
├── sys
│   ├── TWLFontTable.dat
│   └── log
│       ├── inspect.log
│       └── product.log
├── ticket
├── title
└── tmp
twlp
└── photo