Difference between revisions of "闪存文件系统"
(update 对应英文版 http://www.3dbrew.org/w/index.php?title=Flash_Filesystem&oldid=7272) |
(updata to eng.ver http://www.3dbrew.org/w/index.php?title=Flash_Filesystem&diff=8383) |
||
Line 1: | Line 1: | ||
3DS使用了容量为1GB的一片NAND闪存芯片。 | 3DS使用了容量为1GB的一片NAND闪存芯片。 | ||
+ | 从NCSD的头部来看,NAND实际使用的大小为0x3AF00000. | ||
=== 格式 === | === 格式 === | ||
Line 5: | Line 6: | ||
===加密=== | ===加密=== | ||
− | + | NAND文件系统使用[[AES|AES-CTR]]加密。NAND中TWL region使用TWL NAND的[[AES|keyslot]],而CTR region使用CTR NAND的[[AES|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分区)。 | |
+ | |||
+ | Note that re-encrypting a NAND image alone from another 3DS for use on a different 3DS is not enough to use that NAND image on a different 3DS: certain files in the "nand" partition would need modified/replaced as well. | ||
===NAND结构=== | ===NAND结构=== | ||
Line 14: | Line 17: | ||
! 长度 | ! 长度 | ||
! NCSD分区文件系统类型 | ! NCSD分区文件系统类型 | ||
+ | ! NCSD分区索引(index) | ||
! 注释 | ! 注释 | ||
|- | |- | ||
| | | | ||
| 0x0 | | 0x0 | ||
− | | 0x200 | + | | 0x200 |
+ | | | ||
| | | | ||
| NCSD头, 包括了后续CTR-NAND的偏移/大小信息. 这个块也包含了 TWL-NAND MBR分区表. | | NCSD头, 包括了后续CTR-NAND的偏移/大小信息. 这个块也包含了 TWL-NAND MBR分区表. | ||
+ | |- | ||
+ | | | ||
+ | | 0x00000000 | ||
+ | | 0x0B100000 | ||
+ | | 0x1 | ||
+ | | 0x00 | ||
+ | | TWL NAND region | ||
|- | |- | ||
| twln | | twln | ||
| 0x00012E00 | | 0x00012E00 | ||
| 0x08FB5200 | | 0x08FB5200 | ||
+ | | | ||
| | | | ||
| TWL-NAND FAT16. (DSi) | | TWL-NAND FAT16. (DSi) | ||
Line 31: | Line 44: | ||
| 0x09011A00 | | 0x09011A00 | ||
| 0x020B6600 | | 0x020B6600 | ||
+ | | | ||
| | | | ||
| TWL-NAND PHOTO FAT12. (DSi) | | TWL-NAND PHOTO FAT12. (DSi) | ||
Line 36: | Line 50: | ||
| | | | ||
| 0x0B100000 | | 0x0B100000 | ||
+ | | 0x00 | ||
| 0x00030000 | | 0x00030000 | ||
| 0x04 | | 0x04 | ||
− | | | + | | 0x01 |
+ | | 默认为全空填充此分区(只有 0x00/0xFF byte,并且从不写入). AGB_FIRM was never launched. 包含 AGB_FIRM GBA游戏. | ||
|- | |- | ||
| firm0 | | firm0 | ||
Line 44: | Line 60: | ||
| 0x00400000 | | 0x00400000 | ||
| 0x03 | | 0x03 | ||
+ | | 0x02 | ||
| [[FIRM|Firmware]] 分区. | | [[FIRM|Firmware]] 分区. | ||
|- | |- | ||
Line 49: | Line 66: | ||
| 0x0B530000 | | 0x0B530000 | ||
| 0x00400000 | | 0x00400000 | ||
+ | | 0x03 | ||
| 0x03 | | 0x03 | ||
| [[FIRM|Firmware]] 分区.(备份分区, 同上) | | [[FIRM|Firmware]] 分区.(备份分区, 同上) | ||
Line 56: | Line 74: | ||
| 0x2F5D0000 | | 0x2F5D0000 | ||
| 0x01 | | 0x01 | ||
+ | | 0x04 | ||
| CTR-NAND partition. (3DS) | | CTR-NAND partition. (3DS) | ||
|- | |- | ||
Line 62: | Line 81: | ||
| 0x2F3E3600 | | 0x2F3E3600 | ||
| | | | ||
+ | | | ||
| CTR-NAND FAT16文件系统. | | CTR-NAND FAT16文件系统. | ||
|} | |} | ||
Line 67: | Line 87: | ||
3DS中NAND TWL FAT分区的卷标为"TWL",CTR FAT分区为"CTR"。TWL分区的偏移和大小存储在MBR分区表中,而CTR分区表信息存在NAND NCSD头部。CTR-NAND分区的0扇面包含一个TWL-NAND分区的MBR分区表,而MBR的签名在+0x1fe位置。 | 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访问控制描述符启用时候访问。对于零售版机器中的[[NCCH#CXI|CXI]]进程,CTR/TWL的NAND描述符一般都是未启用的状态。ARM11只能将"nand:/rw/"挂载为"nandrw"的[[FS:OpenArchive|档案]],而"nand:/ro/"则挂载为如下的nandro档案。 | 除TWLP,以上NAND物理分区均不能使用ARM11直接读取。CTR/TWL NAND文件系统只能当exheader访问控制描述符启用时候访问。对于零售版机器中的[[NCCH#CXI|CXI]]进程,CTR/TWL的NAND描述符一般都是未启用的状态。ARM11只能将"nand:/rw/"挂载为"nandrw"的[[FS:OpenArchive|档案]],而"nand:/ro/"则挂载为如下的nandro档案。 | ||
+ | |||
+ | ==== 0x4000 ==== | ||
+ | On some 3DS systems(such as 3DS XL), there's a plaintext FAT16 boot record located at NAND offset 0x4000. This block does not exist for launch-day 3DS systems. This is the only plaintext block for this "partition". | ||
=CTR分区= | =CTR分区= | ||
Line 88: | Line 111: | ||
├── [[nandrw/shared|shared]] | ├── [[nandrw/shared|shared]] | ||
└── [[nandrw/sys|sys]] | └── [[nandrw/sys|sys]] | ||
− | ├── [[nandrw/sys/lgy.log|lgy.log]] | + | ├── [[nandrw/sys/lgy.log|lgy.log]] (This is written to by [[FIRM|TWL_FIRM]] when errors occur, this is equivalent to native.log) |
├── [[nandrw/sys/LocalFriendCodeSeed_B|LocalFriendCodeSeed_B]] | ├── [[nandrw/sys/LocalFriendCodeSeed_B|LocalFriendCodeSeed_B]] | ||
− | ├── [[nandrw/sys/native.log|native.log]] | + | ├── [[nandrw/sys/native.log|native.log]] (This is written to by [[ErrDisp]]) |
├── [[nandrw/sys/rand_seed|rand_seed]] | ├── [[nandrw/sys/rand_seed|rand_seed]] | ||
├── [[nandrw/sys/SecureInfo_A|SecureInfo_A]] | ├── [[nandrw/sys/SecureInfo_A|SecureInfo_A]] | ||
└── [[nandrw/sys/updater.log|updater.log]] | └── [[nandrw/sys/updater.log|updater.log]] | ||
+ | |||
nand | nand |
Revision as of 06:33, 1 February 2014
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分区)。
Note that re-encrypting a NAND image alone from another 3DS for use on a different 3DS is not enough to use that NAND image on a different 3DS: certain files in the "nand" partition would need modified/replaced as well.
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 | 0x00 | 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
On some 3DS systems(such as 3DS XL), there's a plaintext FAT16 boot record located at NAND offset 0x4000. This block does not exist for launch-day 3DS systems. This is the only plaintext block for this "partition".
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 (This is written to by TWL_FIRM when errors occur, this is equivalent to 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 (This directory is empty since tickets are stored in ticket.db) ├── title └── tmp (This is usually empty, 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