Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Ninfs 3DS: Difference between revisions

From GameBrew
No edit summary
Line 22: Line 22:


===Installation===
===Installation===
bootROM:  
'''bootROM:'''
For 3DS types, The ARM9 bootROM is required. You can dump it using boot9strap, which can be set up by [https://3ds.hacks.guide 3DS Hacks Guide]. To dump the bootROM, hold Start+Select+X when you boot up your 3DS. It is checked in order of:
* For 3DS types, The ARM9 bootROM is required. You can dump it using boot9strap, which can be set up by [https://3ds.hacks.guide 3DS Hacks Guide].  
* <code>--boot9</code> argument (if set)
* To dump the bootROM, hold Start+Select+X when you boot up your 3DS. It is checked in order of:
* <code>BOOT9_PATH</code> environment variable (if set)
** <code>--boot9</code> argument (if set)
* <code>%APPDATA%\3ds\boot9.bin</code> (Windows-specific)
** <code>BOOT9_PATH</code> environment variable (if set)
* <code>~/Library/Application Support/3ds/boot9.bin</code> (macOS-specific)
** <code>%APPDATA%\3ds\boot9.bin</code> (Windows-specific)
* <code>~/.3ds/boot9.bin</code>
** <code>~/Library/Application Support/3ds/boot9.bin</code> (macOS-specific)
* <code>~/3ds/boot9.bin</code>
** <code>~/.3ds/boot9.bin</code>
** <code>~/3ds/boot9.bin</code>
* <code>boot9_prot.bin</code> can also be used in all of these locations.
* "<code>~</code>" means the user's home directory. "<code>~/3ds</code>" would mean <code>/Users/username/3ds</code> on macOS and <code>C:\Users\username\3ds</code> on Windows.


<code>boot9_prot.bin</code> can also be used in all of these locations.
'''SeedDB:'''
 
* CDN, CIA, and NCCH mounting may need [https://github.com/ihaveamac/3DS-rom-tools/wiki/SeedDB-list SeedDB] for mounting NCCH containers of newer games (2015+) that use seeds.  
"<code>~</code>" means the user's home directory. "<code>~/3ds</code>" would mean <code>/Users/username/3ds</code> on macOS and <code>C:\Users\username\3ds</code> on Windows.
* SeedDB is checked in order of:
 
** <code>--seeddb</code> argument (if set)
SeedDB:
** <code>SEEDDB_PATH</code> environment variable (if set)
CDN, CIA, and NCCH mounting may need [https://github.com/ihaveamac/3DS-rom-tools/wiki/SeedDB-list SeedDB] for mounting NCCH containers of newer games (2015+) that use seeds. SeedDB is checked in order of:
** <code>%APPDATA%\3ds\seeddb.bin</code> (Windows-specific)
* <code>--seeddb</code> argument (if set)
** <code>~/Library/Application Support/3ds/seeddb.bin</code> (macOS-specific)
* <code>SEEDDB_PATH</code> environment variable (if set)
** <code>~/.3ds/seeddb.bin</code>
* <code>%APPDATA%\3ds\seeddb.bin</code> (Windows-specific)
** <code>~/3ds/seeddb.bin</code>
* <code>~/Library/Application Support/3ds/seeddb.bin</code> (macOS-specific)
* <code>~/.3ds/seeddb.bin</code>
* <code>~/3ds/seeddb.bin</code>


===Windows===
===Windows===
'''Using Installer:'''
'''Using Installer:'''
* An installer is provided in releases. It includes both ninfs and WinFsp, which is installed if required.
* An installer is provided in releases.  
* It includes both ninfs and WinFsp, which is installed if required.


'''Using Standalone release:'''
'''Using Standalone release:'''
* A standalone zip is also provided in releases. [http://www.secfs.net/winfsp/rel/ WinFsp] must be installed separately.
* A standalone zip is also provided in releases.  
* [http://www.secfs.net/winfsp/rel/ WinFsp] must be installed separately.


'''Installing with existing Python:'''
'''Installing with Python:'''
* Install the latest version of [https://www.python.org/downloads/ Python 3]. The x86-64 version is preferred on 64-bit Windows.
* Install the latest version of [https://www.python.org/downloads/ Python 3]. The x86-64 version is preferred on 64-bit Windows.
** Python from the Microsoft Store can also be used. If this is used, python3 must be used instead of py -3.  
** Python from the Microsoft Store can also be used. If this is used, python3 must be used instead of py -3.  
Line 59: Line 61:


===macOS===
===macOS===
Versions of macOS supported by Apple are highly recommended. macOS Sierra is the oldest version that should work. [https://osxfuse.github.io/ macFUSE] is required. No standalone build is available at the moment.
* Versions of macOS supported by Apple are highly recommended.  
* macOS Sierra is the oldest version that should work. [https://osxfuse.github.io/ macFUSE] is required.  
* No standalone build is available at the moment.


'''Installing with existing Python:'''
'''Installing with Python:'''
* Install the latest version of Python 3. The recommended way is [https://brew.sh Homebrew]. You can also use an installer from [https://www.python.org/downloads/ python.org] or a tool like [https://github.com/pyenv/pyenv pyenv].
* Install the latest version of Python 3. The recommended way is [https://brew.sh Homebrew]. You can also use an installer from [https://www.python.org/downloads/ python.org] or a tool like [https://github.com/pyenv/pyenv pyenv].
* Install the latest version of [https://github.com/osxfuse/osxfuse/releases/latest FUSE for macOS].
* Install the latest version of [https://github.com/osxfuse/osxfuse/releases/latest FUSE for macOS].
Line 81: Line 85:
==User guide==
==User guide==
===Supported types===
===Supported types===
{| class="wikitable" style="width: 480px;"
{| class="wikitable" style="width: 420px;"
|-
|-
! colspan="2"| Nintendo 3DS:
! colspan="2"| Nintendo 3DS
|-
|-
|style="width: 45%;"| CTR Cart Image  
|style="width: 45%;"| CTR Cart Image  
Line 89: Line 93:
|-
|-
| CDN contents  
| CDN contents  
| cetk, tmd, and contents.
| cetk, tmd, and contents
|-
|-
| CTR Importable Archive || .cia.
| CTR Importable Archive || .cia.
Line 101: Line 105:
| Read-only Filesystem || .romfs, romfs.bin
| Read-only Filesystem || .romfs, romfs.bin
|-
|-
| SD Card Contents || Nintendo 3DS from SD
| SD Card Contents || Nintendo 3DS folder from SD
|-
|-
| Installed SD Title Contents || *.tmd and *.app files
| Installed SD Title Contents || *.tmd and *.app files
Line 126: Line 130:


===Graphical user interface===
===Graphical user interface===
A GUI can be used by specifying the type to be <code>gui</code>. It controls mounting and unmounting. Examples:
* A GUI can be used by specifying the type to be <code>gui</code>.  
* Windows: <code>py -3 -mninfs gui</code>
* It controls mounting and unmounting. Examples:
* *nix: <code>python3 -mninfs gui</code>.
** Windows: <code>py -3 -mninfs gui</code>
** *nix: <code>python3 -mninfs gui</code>.


===Command line===
===Command line===
Line 137: Line 142:
** Windows: <code>py -3 -mninfs cci game.3ds mountpoint</code>  
** Windows: <code>py -3 -mninfs cci game.3ds mountpoint</code>  
** *nix: <code>python3 -mninfs cci game.3ds mountpoint)</code>
** *nix: <code>python3 -mninfs cci game.3ds mountpoint)</code>
 
* Windows users can use a drive letter like <code>F:</code> as a mountpoint. Or use <code>*</code> and a drive letter will be automatically chosen.
Windows users can use a drive letter like <code>F:</code> as a mountpoint. Or use <code>*</code> and a drive letter will be automatically chosen.
* Developer-unit contents are encrypted with different keys, which can be used with <code>--dev</code> with CCI, CDN, CIA, NANDCTR, NCCH, and SD.
 
Developer-unit contents are encrypted with different keys, which can be used with <code>--dev</code> with CCI, CDN, CIA, NANDCTR, NCCH, and SD.


'''Unmounting:'''
'''Unmounting:'''
Line 150: Line 153:


===Examples===
===Examples===
* 3DS game card dump:
# 3DS game card dump  
<code>mount_cci game.3ds mountpoint</code>
mount_cci game.3ds mountpoint
* Contents downloaded from CDN:
<code>mount_cdn cdn_directory mountpoint</code>
# Contents downloaded from CDN
* CDN contents with a specific decrypted titlekey:
mount_cdn cdn_directory mountpoint
<code>mount_cdn --dec-key 3E3E6769742E696F2F76416A65423C3C cdn_directory mountpoint</code>
* CIA:
# CDN contents with a specific decrypted titlekey
<code>mount_cia game.cia mountpoint</code>
mount_cdn --dec-key 3E3E6769742E696F2F76416A65423C3C cdn_directory mountpoint</code>
* ExeFS:
 
<code>mount_exefs exefs.bin mountpoint</code>
# CIA
* 3DS NAND backup with essential.exefs embedded:
mount_cia game.cia mountpoint
<code>mount_nandctr nand.bin mountpoint</code>
# ExeFS
* 3DS NAND backup with an OTP file (Counter is automatically generated):
mount_exefs exefs.bin mountpoint
<code>mount_nandctr --otp otp.bin nand.bin mountpoint</code>
* 3DS NAND backup with OTP and CID files:
# 3DS NAND backup with essential.exefs embedded
<code>mount_nandctr --otp otp.bin --cid nand_cid.bin nand.bin mountpoint</code>
mount_nandctr nand.bin mountpoint
* 3DS NAND backup with OTP file and a CID hexstring:
<code>mount_nandctr --otp otp.bin --cid 7468616E6B7334636865636B696E6721 nand.bin mountpoint</code>
# 3DS NAND backup with an OTP file (Counter is automatically generated)
* DSi NAND backup (Counter is automatically generated):
mount_nandctr --otp otp.bin nand.bin mountpoint
<code>mount_nandtwl --console-id 5345445543454D45 nand_dsi.bin mountpoint</code>
* DSi NAND backup with a Console ID hexstring and specified CID hexstring:
# 3DS NAND backup with OTP and CID files
<code>mount_nandtwl --console-id 5345445543454D45 --cid 576879446F657344536945786973743F nand_dsi.bin mountpoint</code>
mount_nandctr --otp otp.bin --cid nand_cid.bin nand.bin mountpoint
* DSi NAND backup with a Console ID file and specified CID file:
<code>mount_nandtwl --console-id ConsoleID.bin --cid CID.bin nand_dsi.bin mountpoint</code>
# 3DS NAND backup with OTP file and a CID hexstring
* iQue Player NAND backup:
mount_nandctr --otp otp.bin --cid 7468616E6B7334636865636B696E6721 nand.bin mountpoint
<code>mount_nandbb nand.bin mountpoint</code>
* Switch NAND backup:
# DSi NAND backup (Counter is automatically generated)
<code>mount_nandhac --keys prod.keys rawnand.bin mountpoint</code>
mount_nandtwl --console-id 5345445543454D45 nand_dsi.bin mountpoint
* Switch NAND backup in multiple parts:
<code>mount_nandhac --keys prod.keys -S rawnand.bin.00 mountpoint</code>
# DSi NAND backup with a Console ID hexstring and specified CID hexstring
* Switch NAND encrypted partition dump:
mount_nandtwl --console-id 5345445543454D45 --cid 576879446F657344536945786973743F nand_dsi.bin mountpoint
<code>mount_nandhac --keys prod.keys --partition SYSTEM SYSTEM.bin mountpoint</code>
* NCCH container (.app, .cxi, .cfa, .ncch):
# DSi NAND backup with a Console ID file and specified CID file
<code>mount_ncch content.cxi mountpoint</code>
mount_nandtwl --console-id ConsoleID.bin --cid CID.bin nand_dsi.bin mountpoint
* RomFS:
<code>mount_romfs romfs.bin mountpoint</code>
# iQue Player NAND backup
* Nintendo 3DS directory from an SD card:
mount_nandbb nand.bin mountpoint
<code>mount_sd --movable movable.sed "/path/to/Nintendo 3DS" mountpoint</code>
* Nintendo 3DS directory from an SD card with an SD key hexstring:
# Switch NAND backup
<code>mount_sd --sd-key 504C415900000000504F4B454D4F4E21 "/path/to/Nintendo 3DS" mountpoint</code>
mount_nandhac --keys prod.keys rawnand.bin mountpoint
* Nintendo DS ROM image (NDS/SRL, mount_nds also works):
<code>mount_srl game.nds mountpoint</code>
# Switch NAND backup in multiple parts
* 3DSX homebrew application:
mount_nandhac --keys prod.keys -S rawnand.bin.00 mountpoint
<code>mount_threedsx boot.3dsx mountpoint</code>
# Switch NAND encrypted partition dump
mount_nandhac --keys prod.keys --partition SYSTEM SYSTEM.bin mountpoint
# NCCH container (.app, .cxi, .cfa, .ncch)
mount_ncch content.cxi mountpoint
# RomFS
mount_romfs romfs.bin mountpoint
# Nintendo 3DS directory from an SD card
mount_sd --movable movable.sed "/path/to/Nintendo 3DS" mountpoint
# Nintendo 3DS directory from an SD card with an SD key hexstring
mount_sd --sd-key 504C415900000000504F4B454D4F4E21 "/path/to/Nintendo 3DS" mountpoint
# Nintendo DS ROM image (NDS/SRL, mount_nds also works)
mount_srl game.nds mountpoint
 
# 3DSX homebrew application
mount_threedsx boot.3dsx mountpoint


===Useful tools===
===Useful tools===

Revision as of 03:03, 20 March 2022

Ninfs
File:Ninfs2.png
General
Authorihaveamac
TypePC Utilities
Version2.0a6
LicenseMixed
Last Updated2021/06/22
Links
Download
Website
Source

ninfs (formerly fuse-3ds) is a FUSE program to extract data from Nintendo game consoles. It works by presenting a virtual filesystem with the contents of your games, NAND, or SD card contents, and you can browse and copy out just the files that you need.

Requires Python 3.6.1+. Supports Windows (7 or later), macOS, and Linux.

Features

  • Mount a NAND backup and browse CTRNAND, TWLNAND, and others, and write back to them without having to extract and decrypt them first.
  • Browse decrypted SD card contents. Dump installed games and saves, or copy contents between two system's SD contents.
  • Extract a game's files out of a CIA, CCI (".3ds"), NCCH, RomFS, raw CDN contents, just by mounting them and browsing its files. Or use the virtual decrypted file and start playing the game in Citra right away.

Installation

bootROM:

  • For 3DS types, The ARM9 bootROM is required. You can dump it using boot9strap, which can be set up by 3DS Hacks Guide.
  • To dump the bootROM, hold Start+Select+X when you boot up your 3DS. It is checked in order of:
    • --boot9 argument (if set)
    • BOOT9_PATH environment variable (if set)
    • %APPDATA%\3ds\boot9.bin (Windows-specific)
    • ~/Library/Application Support/3ds/boot9.bin (macOS-specific)
    • ~/.3ds/boot9.bin
    • ~/3ds/boot9.bin
  • boot9_prot.bin can also be used in all of these locations.
  • "~" means the user's home directory. "~/3ds" would mean /Users/username/3ds on macOS and C:\Users\username\3ds on Windows.

SeedDB:

  • CDN, CIA, and NCCH mounting may need SeedDB for mounting NCCH containers of newer games (2015+) that use seeds.
  • SeedDB is checked in order of:
    • --seeddb argument (if set)
    • SEEDDB_PATH environment variable (if set)
    • %APPDATA%\3ds\seeddb.bin (Windows-specific)
    • ~/Library/Application Support/3ds/seeddb.bin (macOS-specific)
    • ~/.3ds/seeddb.bin
    • ~/3ds/seeddb.bin

Windows

Using Installer:

  • An installer is provided in releases.
  • It includes both ninfs and WinFsp, which is installed if required.

Using Standalone release:

  • A standalone zip is also provided in releases.
  • WinFsp must be installed separately.

Installing with Python:

  • Install the latest version of Python 3. The x86-64 version is preferred on 64-bit Windows.
    • Python from the Microsoft Store can also be used. If this is used, python3 must be used instead of py -3.
    • This version has some limitations however, such as not being able to mount to directories.
  • Install the latest version of WinFsp.
  • Install ninfs with py -3 -m pip install --upgrade https://github.com/ihaveamac/ninfs/archive/2.0.zip

macOS

  • Versions of macOS supported by Apple are highly recommended.
  • macOS Sierra is the oldest version that should work. macFUSE is required.
  • No standalone build is available at the moment.

Installing with Python:

  • Install the latest version of Python 3. The recommended way is Homebrew. You can also use an installer from python.org or a tool like pyenv.
  • Install the latest version of FUSE for macOS.
  • Install ninfs with python3 -m pip install --upgrade https://github.com/ihaveamac/ninfs/archive/2.0.zip

Linux

Arch Linux:

  • (Note: git versions out of date while build process stabilizes.)
  • ninfs is available in the AUR: normal, with gui.

Other distributions:

  • Recent distributions (e.g. Ubuntu 18.04 and later) should have Python 3.6.1 or later pre-installed, or included in its repositories. If not, you can use an extra repository (e.g. deadsnakes's PPA for Ubuntu), build from source, or use a tool like pyenv.
  • Most distributions should have libfuse enabled/installed by default. Use your package manager if it isn't.
  • Install ninfs with python3 -m pip install --upgrade --user https://github.com/ihaveamac/ninfs/archive/2.0.zip
    • --user is not needed if you are using a virtual environment.
  • You can add a desktop entry with python3 -m ninfs --install-desktop-entry. If you want to install to a location other than the default ($XDG_DATA_HOME), you can add another argument with a path like /usr/local/share.
  • To use the GUI, tkinter needs to be installed. On Debian-/Ubuntu-based systems this is python3-tk. On Fedora this is python3-tkinter.

User guide

Supported types

Nintendo 3DS
CTR Cart Image .3ds, .cci.
CDN contents cetk, tmd, and contents
CTR Importable Archive .cia.
Executable Filesystem .exefs, exefs.bin
NAND backup nand.bin
NCCH .cxi, .cfa, .ncch, .app
Read-only Filesystem .romfs, romfs.bin
SD Card Contents Nintendo 3DS folder from SD
Installed SD Title Contents *.tmd and *.app files
3DSX Homebrew .3dsx
Nintendo DS / DSi
DSi NAND backup nand_dsi.bin
Nintendo DS ROM image .nds, .srl
iQue Player
NAND backup (read-only) nand.bin
Nintendo Switch
NAND backup rawnand.bin

Graphical user interface

  • A GUI can be used by specifying the type to be gui.
  • It controls mounting and unmounting. Examples:
    • Windows: py -3 -mninfs gui
    • *nix: python3 -mninfs gui.

Command line

Mounting:

  • Run a mount script by using "mount_<type>" (e.g. mount_cci game.3ds mountpoint).
  • Use -h to view arguments for a script.
  • If it doesn't work, the other way is to use <python-cmd> -mninfs <type>. Examples:
    • Windows: py -3 -mninfs cci game.3ds mountpoint
    • *nix: python3 -mninfs cci game.3ds mountpoint)
  • Windows users can use a drive letter like F: as a mountpoint. Or use * and a drive letter will be automatically chosen.
  • Developer-unit contents are encrypted with different keys, which can be used with --dev with CCI, CDN, CIA, NANDCTR, NCCH, and SD.

Unmounting:

  • Windows: Press Ctrl+C in the command prompt/PowerShell window.
  • macOS (two methods):
    • Right-click on the mount and choose "Eject "drive name"".
    • Run from terminal: diskutil unmount /path/to/mount
  • Linux: Run from terminal: fusermount -u /path/to/mount

Examples

# 3DS game card dump 
mount_cci game.3ds mountpoint

# Contents downloaded from CDN
mount_cdn cdn_directory mountpoint

# CDN contents with a specific decrypted titlekey
mount_cdn --dec-key 3E3E6769742E696F2F76416A65423C3C cdn_directory mountpoint
 
# CIA
mount_cia game.cia mountpoint
# ExeFS
mount_exefs exefs.bin mountpoint

# 3DS NAND backup with essential.exefs embedded
mount_nandctr nand.bin mountpoint

# 3DS NAND backup with an OTP file (Counter is automatically generated)
mount_nandctr --otp otp.bin nand.bin mountpoint

# 3DS NAND backup with OTP and CID files
mount_nandctr --otp otp.bin --cid nand_cid.bin nand.bin mountpoint

# 3DS NAND backup with OTP file and a CID hexstring
mount_nandctr --otp otp.bin --cid 7468616E6B7334636865636B696E6721 nand.bin mountpoint

# DSi NAND backup (Counter is automatically generated)
mount_nandtwl --console-id 5345445543454D45 nand_dsi.bin mountpoint

# DSi NAND backup with a Console ID hexstring and specified CID hexstring
mount_nandtwl --console-id 5345445543454D45 --cid 576879446F657344536945786973743F nand_dsi.bin mountpoint

# DSi NAND backup with a Console ID file and specified CID file
mount_nandtwl --console-id ConsoleID.bin --cid CID.bin nand_dsi.bin mountpoint

# iQue Player NAND backup
mount_nandbb nand.bin mountpoint

# Switch NAND backup
mount_nandhac --keys prod.keys rawnand.bin mountpoint

# Switch NAND backup in multiple parts
mount_nandhac --keys prod.keys -S rawnand.bin.00 mountpoint

# Switch NAND encrypted partition dump
mount_nandhac --keys prod.keys --partition SYSTEM SYSTEM.bin mountpoint

# NCCH container (.app, .cxi, .cfa, .ncch)
mount_ncch content.cxi mountpoint

# RomFS
mount_romfs romfs.bin mountpoint

# Nintendo 3DS directory from an SD card
mount_sd --movable movable.sed "/path/to/Nintendo 3DS" mountpoint

# Nintendo 3DS directory from an SD card with an SD key hexstring
mount_sd --sd-key 504C415900000000504F4B454D4F4E21 "/path/to/Nintendo 3DS" mountpoint

# Nintendo DS ROM image (NDS/SRL, mount_nds also works)
mount_srl game.nds mountpoint
 
# 3DSX homebrew application
mount_threedsx boot.3dsx mountpoint

Useful tools

  • wwylele's 3ds-save-tool can be used to extract game saves and extra data (DISA and DIFF, respectively).
  • wwylele's save3ds is a tool to interact with 3DS save files and extdata. Extracting and importing works on all platforms. The FUSE part only works on macOS and Linux.
  • OSFMount for Windows can mount FAT12/FAT16/FAT32 partitions in NAND backups.

Related tools

  • roothorick's BUSEHAC is a Linux driver for encrypted Nintendo Switch NANDs.
  • Maschell's fuse-wiiu can be used to mount Wii U contents.
  • koolkdev's wfslib has wfs-fuse to mount the Wii U mlc dumps and usb devices.

Screenshots

ninfs3.png

Media

fuse-3ds demonstration with Pokémon Ultra Moon (ihaveamac)

Credits

ninfs is under the MIT license. fuse.py is under the ISC license (taken from setup.py).

Special thanks to @Jhynjhiruu for adding support for iQue Player NAND backups.

Special thanks to @Stary2001 for help with NAND crypto (especially TWL), and @d0k3 for SD crypto.

OTP code is from Stary2001/3ds_tools, and is under the MIT license.

External links

Advertising: