Difference between revisions of "闪存文件系统"

From 3dbrew
Jump to navigation Jump to search
(Translated from Flash Filesystem(14:54, 5 November 2011) and complated. // 翻译自Flash Filesystem,已完成。)
 
(fix)
 
(8 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 +
3DS使用了容量为1GB的一片NAND闪存芯片。
 +
从NCSD的头部来看,NAND实际使用的大小为0x3AF00000.
 +
 
=== 格式 ===
 
=== 格式 ===
任天堂3DS的闪存文件格式目前尚未公开,闪存芯片可能是通过主板上的输出针脚<!--  原文是pinouts,抱歉我不清楚在N3DS中如何翻译 -->读取的,并内容已经被执行了。然而数据却被加密了,若不解解谜将无法理解。
+
通过主板上的输出针脚提取闪存芯片内容是可行的,并且已经取得成功。但由于数据是加密过的,不经解密无法理解。
 
 
===文件系统===
 
 
 
每个NAND分区皆为FAT磁盘格式。
 
  
 
===加密===
 
===加密===
 +
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分区)。
  
NAND文件系统似乎采用AES进行加密。
+
切记,一台3DS重加密的NAND镜像,不能直接给另一台3DS使用,“NAND”分区的某些文件也需要修改/更换。
 
 
===分区===
 
  
 +
===NAND结构===
 
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
 
|-
 
|-
名称
+
分区名
 +
!  偏移
 +
!  长度
 +
!  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
 
|  firm0
固件分区
+
0x0B130000
 +
|  0x00400000
 +
|  0x03
 +
|  0x02
 +
|  [[FIRM|Firmware]] 分区.
 
|-
 
|-
 
|  firm1
 
|  firm1
| 固件分区
+
| 0x0B530000
 +
|  0x00400000
 +
|  0x03
 +
|  0x03
 +
|  [[FIRM|Firmware]] 分区.(备份分区, 同上)
 +
|-
 +
 +
|  0x0B930000
 +
|  0x2F5D0000
 +
|  0x01
 +
|  0x04
 +
|  CTR-NAND partition. (3DS)
 
|-
 
|-
 
|  nand
 
|  nand
CTR-NAND文件系统。(N3DS)
+
0x0B95CA00
|-
+
| 0x2F3E3600
twln
+
|   
TWL-NAND文件系统,(DSi)
+
|
 +
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访问控制描述符启用时候访问。对于零售版机器中的[[NCCH#CXI|CXI]]进程,CTR/TWL的NAND描述符一般都是未启用的状态。ARM11只能将"nand:/rw/"挂载为"nandrw"的[[FS:OpenArchive|档案]],而"nand:/ro/"则挂载为如下的nandro档案。
 +
 +
==== 0x4000 ====
 +
某些3DS系统(比如3DS XL),有一个明文的FAT16引导记录在NAND偏移的0x4000位置。这个块在launch-day 3DS的系统里是不存在的。在这个“分区”内只有明文的块。
 +
 +
=CTR分区=
 +
[[nand/title]]的结构似乎和[[SD Filesystem|SD卡系统]]的完全相似,除了存档保存在[[System SaveData|nand/data/<ID0>/sysdata]]目录。
 +
 +
在[[nand/data]]之下的子目录名是[[nand/private/movable.sed|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"[[FS:OpenArchive|归档]]会挂载到"nand:/rw/",而"nandro"归档会挂载到"nand:/ro/"。
 +
 +
 +
nandro
 +
├── [[nandro/private|private]]
 +
├── [[nandro/shared|shared]]
 +
└── [[nandro/sys|sys]]
 +
    ├── [[nandro/sys/HWCAL0.dat|HWCAL0.dat]]
 +
    └── [[nandro/sys/HWCAL1.dat|HWCAL1.dat]]
 +
nandrw
 +
├── [[nandrw/shared|shared]]
 +
└── [[nandrw/sys|sys]]
 +
    ├── [[nandrw/sys/lgy.log|lgy.log]] (发生错误时由[[FIRM|TWL_FIRM]]记录,是与native.log等效的)
 +
    ├── [[nandrw/sys/LocalFriendCodeSeed_B|LocalFriendCodeSeed_B]]
 +
    ├── [[nandrw/sys/native.log|native.log]] (This is written to by [[ErrDisp]])
 +
    ├── [[nandrw/sys/rand_seed|rand_seed]]
 +
    ├── [[nandrw/sys/SecureInfo_A|SecureInfo_A]]
 +
    └── [[nandrw/sys/updater.log|updater.log]]
 +
 +
 +
nand
 +
├── __journal.nn_
 +
├── [[nand/data|data]]
 +
│  └── <ID0>
 +
│      ├── [[Extdata|extdata]]         
 +
│      └── [[System SaveData|sysdata]]
 +
├── [[Title Database|dbs]]
 +
├── [[nand/fixdata|fixdata]]
 +
│  └── [[nand/fixdata/sysdata|sysdata]]
 +
├── private
 +
│  └── [[nand/private/movable.sed|movable.sed]]
 +
├── [[nand/ro|ro]]
 +
├── [[nand/rw|rw]]
 +
├── [[nand/ticket|ticket]] (自ticket存放到[[Title Database|ticket.db]]后,这个目录就是空的了)
 +
├── [[Title Data Structure|title]]
 +
└── [[nand/tmp|tmp]] (这个通常是空的, even when installation for a system update still needs [[AMNet:FinishInstallToMedia|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
 +
├── [[twln/import/|import]]
 +
├── [[twln/shared1/|shared1]]
 +
├── [[twln/shared2/|shared2]]
 +
│  └── [[twln/shared2/0000|0000]]
 +
├── [[twln/sys|sys]]
 +
│  ├── [[twln/sys/TWLFontTable.dat|TWLFontTable.dat]]
 +
│  └── [[twln/sys/log/|log]]
 +
│      ├── [[twln/sys/log/inspect.log|inspect.log]]
 +
│      └── [[twln/sys/log/product.log|product.log]]
 +
├── [[twln/ticket/|ticket]]
 +
├── [[twln/title/|title]]
 +
└── [[twln/tmp/|tmp]]
 +
 +
twlp
 +
└── [[twlp/photo/|photo]]

Latest revision as of 09:19, 1 February 2014

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

格式[edit]

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

加密[edit]

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结构[edit]

分区名 偏移 长度 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[edit]

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

CTR分区[edit]

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分区[edit]

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