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
m (Text replacement - "↵Category:Support the author" to "")
 
(32 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Infobox 3DS Homebrews
{{Infobox 3DS Homebrews
|title=Ninfs
|title=Ninfs
|image=Ninfs.png
|image=ninfs02.png
|description=FUSE filesystem Python scripts for Nintendo console files.
|description=FUSE filesystem Python scripts for Nintendo console files. Formerly named fuse-3ds.
|author=ihaveamac
|author=ihaveamac
|lastupdated=2021/06/22
|lastupdated=2024/02/25
|type=PC Utilities
|type=File Operation
|version=2.0a6
|version=2.0
|license=Mixed
|license=MIT
|download=https://dlhb.gamebrew.org/3dshomebrews/ninfs.7z
|download=https://dlhb.gamebrew.org/3dshomebrews/ninfs.7z
|website=https://github.com/ihaveamac/ninfs
|website=https://github.com/ihaveamac/ninfs
|source=https://github.com/ihaveamac/ninfs
|source=https://github.com/ihaveamac/ninfs
|donation=https://ihaveahax.net/view/Donations
}}
}}
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.
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.
Requires Python 3.8.0+. Supports Windows (recommended 10 or later), macOS, and Linux.


==Features==
==Features==
Line 21: Line 22:
* 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 [https://citra-emu.org/ Citra] right away.
* 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 [https://citra-emu.org/ Citra] right away.


===Installation===
==Installation==
bootROM:
===Initial setup===
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 3DS|boot9strap]] (hold Start+Select+X on boot), which can be set up by [https://3ds.hacks.guide 3DS Hacks Guide]. It is checked in order of:
* <code>--boot9</code> argument (if set)
* <code>--boot9</code> argument (if set)
* <code>BOOT9_PATH</code> environment variable (if set)
* <code>BOOT9_PATH</code> environment variable (if set)
Line 31: Line 32:
* <code>~/3ds/boot9.bin</code>
* <code>~/3ds/boot9.bin</code>


<code>boot9_prot.bin</code> can also be used in all of these locations.
Notes:
* <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>~</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:
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:
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>--seeddb</code> argument (if set)
* <code>--seeddb</code> argument (if set)
Line 44: Line 45:
* <code>~/3ds/seeddb.bin</code>
* <code>~/3ds/seeddb.bin</code>


===Windows===
===How to install===
'''Using Installer:'''
* [https://github.com/ihaveamac/ninfs?tab=readme-ov-file#windows Windows]
* An installer is provided in releases. It includes both ninfs and WinFsp, which is installed if required.
* [https://github.com/ihaveamac/ninfs?tab=readme-ov-file#macos macOS]
* [https://github.com/ihaveamac/ninfs?tab=readme-ov-file#linux Linux]


'''Using Standalone release:'''
==User guide==
* A standalone zip is also provided in releases. [http://www.secfs.net/winfsp/rel/ WinFsp] must be installed separately.
===Supported  file types===
 
Nintendo 3DS:
'''Installing with existing Python:'''
* CTR Cart Image - .3ds, .cci.
* Install the latest version of [https://www.python.org/downloads/ Python 3]. The x86-64 version is preferred on 64-bit Windows.
* CDN contents - cetk, tmd, and contents.
** Python from the Microsoft Store can also be used. If this is used, python3 must be used instead of py -3.  
* CTR Importable Archive - .cia.
** This version has some limitations however, such as not being able to mount to directories.
* Executable Filesystem - .exefs, exefs.bin.
* Install the latest version of [http://www.secfs.net/winfsp/rel/ WinFsp].
* Nintendo 3DS NAND backup - nand.bin.
* Install ninfs with <code>py -3 -m pip install --upgrade <nowiki>https://github.com/ihaveamac/ninfs/archive/2.0.zip</nowiki></code>
* NCCH - .cxi, .cfa, .ncch, .app.
* Read-only Filesystem - .romfs, romfs.bin.
* SD Card Contents - Nintendo 3DS from SD.
* Installed SD Title Contents - *.tmd and *.app files.
* 3DSX Homebrew - .3dsx.  


===macOS===
Nintendo DS/DSi:
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.
* Nintendo DSi NAND backup - nand_dsi.bin.
* Nintendo DS ROM image - .nds, .srl.


'''Installing with existing Python:'''
iQue Player:
* 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].
* iQue Player NAND backup (read-only) - nand.bin.
* Install the latest version of [https://github.com/osxfuse/osxfuse/releases/latest FUSE for macOS].
* Install ninfs with <code>python3 -m pip install --upgrade <nowiki>https://github.com/ihaveamac/ninfs/archive/2.0.zip</nowiki></code>


===Linux===
Nintendo Switch:
'''Arch Linux:'''
* Nintendo Switch NAND backup - rawnand.bin.
* (Note: git versions out of date while build process stabilizes.)
* ninfs is available in the AUR: [https://aur.archlinux.org/packages/ninfs/ normal], [https://aur.archlinux.org/packages/ninfs-gui/ 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. [https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa deadsnakes's PPA] for Ubuntu), [https://www.python.org/downloads/source/ build from source], or use a tool like [https://github.com/pyenv/pyenv pyenv].
* Most distributions should have libfuse enabled/installed by default. Use your package manager if it isn't.
* Install ninfs with <code>python3 -m pip install --upgrade --user <nowiki>https://github.com/ihaveamac/ninfs/archive/2.0.zip</nowiki></code>
** <code>--user</code> is not needed if you are using a virtual environment.
* You can add a desktop entry with <code>python3 -m ninfs --install-desktop-entry</code>. If you want to install to a location other than the default (<code>$XDG_DATA_HOME</code>), you can add another argument with a path like <code>/usr/local/share</code>.
* To use the GUI, tkinter needs to be installed. On Debian-/Ubuntu-based systems this is <code>python3-tk</code>. On Fedora this is <code>python3-tkinter</code>.
 
==User guide==
===Supported types===
{| class="wikitable" style="width: 480px;"
|-
! colspan="2"| Nintendo 3DS:
|-
|style="width: 45%;"| 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 from SD
|-
| Installed SD Title Contents || *.tmd and *.app files
|-
| 3DSX Homebrew || .3dsx
|-
! colspan="2"|Nintendo DS / DSi
|-
| DSi NAND backup || nand_dsi.bin
|-
| Nintendo DS ROM image || .nds, .srl
|-
! colspan="2"|iQue Player
|-
| NAND backup
| (read-only) nand.bin
|-
! colspan="2"|Nintendo Switch
|-
| NAND backup
| rawnand.bin
|-
|}


===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>. It controls mounting and unmounting. Examples:
** Windows: <code>py -3 -mninfs gui</code>
* Windows - <code>py -3 -mninfs gui</code>
** *nix: <code>python3 -mninfs gui</code>.  
* *nix - <code>python3 -mninfs gui</code>.


===Command line===
===Command line===
'''Mounting:'''
Mounting:
* Run a mount script by using "<code>mount_<type></code>" (e.g. <code>mount_cci game.3ds mountpoint</code>).  
* Run a mount script by using "<code>mount_<type></code>" (e.g. <code>mount_cci game.3ds mountpoint</code>).  
* Use <code>-h</code> to view arguments for a script.
* Use <code>-h</code> to view arguments for a script.
* If it doesn't work, the other way is to use <code><python-cmd> -mninfs <type></code>. Examples:
* If it doesn't work, the other way is to use <code><python-cmd> -mninfs <type></code>. Examples:
** 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:
* Windows: Press Ctrl+C in the command prompt/PowerShell window.
* Windows - Press Ctrl+C in the command prompt/PowerShell window.
* Linux - Run from terminal <code>fusermount -u /path/to/mount</code>
* macOS (two methods):
* macOS (two methods):
** Right-click on the mount and choose "Eject "drive name"".
** Right-click on the mount and choose "Eject "drive name"".
** Run from terminal: <code>diskutil unmount /path/to/mount</code>
** Run from terminal <code>diskutil unmount /path/to/mount</code>
* Linux: Run from terminal: <code>fusermount -u /path/to/mount</code>


===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>
* 3DS NAND backup with an OTP file (Counter is automatically generated):
# ExeFS.
<code>mount_nandctr --otp otp.bin nand.bin mountpoint</code>
mount_exefs exefs.bin mountpoint
* 3DS NAND backup with OTP and CID files:
<code>mount_nandctr --otp otp.bin --cid nand_cid.bin nand.bin mountpoint</code>
# 3DS NAND backup with essential.exefs embedded.
* 3DS NAND backup with OTP file and a CID hexstring:
mount_nandctr nand.bin mountpoint
<code>mount_nandctr --otp otp.bin --cid 7468616E6B7334636865636B696E6721 nand.bin mountpoint</code>
* DSi NAND backup (Counter is automatically generated):
# 3DS NAND backup with an OTP file (Counter is automatically generated).
<code>mount_nandtwl --console-id 5345445543454D45 nand_dsi.bin mountpoint</code>
mount_nandctr --otp otp.bin nand.bin mountpoint
* DSi NAND backup with a Console ID hexstring and specified CID hexstring:
<code>mount_nandtwl --console-id 5345445543454D45 --cid 576879446F657344536945786973743F nand_dsi.bin mountpoint</code>
# 3DS NAND backup with OTP and CID files.
* DSi NAND backup with a Console ID file and specified CID file:
mount_nandctr --otp otp.bin --cid nand_cid.bin nand.bin mountpoint
<code>mount_nandtwl --console-id ConsoleID.bin --cid CID.bin nand_dsi.bin mountpoint</code>
* iQue Player NAND backup:
# 3DS NAND backup with OTP file and a CID hexstring.
<code>mount_nandbb nand.bin mountpoint</code>
mount_nandctr --otp otp.bin --cid 7468616E6B7334636865636B696E6721 nand.bin mountpoint
* Switch NAND backup:
<code>mount_nandhac --keys prod.keys rawnand.bin mountpoint</code>
# DSi NAND backup (Counter is automatically generated).
* Switch NAND backup in multiple parts:
mount_nandtwl --console-id 5345445543454D45 nand_dsi.bin mountpoint
<code>mount_nandhac --keys prod.keys -S rawnand.bin.00 mountpoint</code>
* Switch NAND encrypted partition dump:
# DSi NAND backup with a Console ID hexstring and specified CID hexstring.
<code>mount_nandhac --keys prod.keys --partition SYSTEM SYSTEM.bin mountpoint</code>
mount_nandtwl --console-id 5345445543454D45 --cid 576879446F657344536945786973743F nand_dsi.bin mountpoint
* NCCH container (.app, .cxi, .cfa, .ncch):
<code>mount_ncch content.cxi mountpoint</code>
# DSi NAND backup with a Console ID file and specified CID file.
* RomFS:
mount_nandtwl --console-id ConsoleID.bin --cid CID.bin nand_dsi.bin mountpoint
<code>mount_romfs romfs.bin mountpoint</code>
* Nintendo 3DS directory from an SD card:
# iQue Player NAND backup.
<code>mount_sd --movable movable.sed "/path/to/Nintendo 3DS" mountpoint</code>
mount_nandbb nand.bin mountpoint
* Nintendo 3DS directory from an SD card with an SD key hexstring:
<code>mount_sd --sd-key 504C415900000000504F4B454D4F4E21 "/path/to/Nintendo 3DS" mountpoint</code>
# Switch NAND backup.
* Nintendo DS ROM image (NDS/SRL, mount_nds also works):
mount_nandhac --keys prod.keys rawnand.bin mountpoint
<code>mount_srl game.nds mountpoint</code>
* 3DSX homebrew application:
# Switch NAND backup in multiple parts.
<code>mount_threedsx boot.3dsx mountpoint</code>
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===
===Useful tools===
* wwylele's [[3DS_Save_File_Extraction_Tools|3ds-save-tool]] can be used to extract game saves and extra data (DISA and DIFF, respectively).
* wwylele's [[3DS_Save_File_Extraction_Tools|3ds-save-tool]] can be used to extract game saves and extra data (DISA and DIFF, respectively).
* wwylele's [https://github.com/wwylele/save3ds 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.
* wwylele's [[Save3DS|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.
* [https://www.osforensics.com/tools/mount-disk-images.html OSFMount] for Windows can mount FAT12/FAT16/FAT32 partitions in NAND backups.
* [https://www.osforensics.com/tools/mount-disk-images.html OSFMount] for Windows can mount FAT12/FAT16/FAT32 partitions in NAND backups.


Line 204: Line 172:
* Maschell's [https://github.com/Maschell/fuse-wiiu fuse-wiiu] can be used to mount Wii U contents.
* Maschell's [https://github.com/Maschell/fuse-wiiu fuse-wiiu] can be used to mount Wii U contents.
* koolkdev's [https://github.com/koolkdev/wfslib wfslib] has wfs-fuse to mount the Wii U mlc dumps and usb devices.
* koolkdev's [https://github.com/koolkdev/wfslib wfslib] has wfs-fuse to mount the Wii U mlc dumps and usb devices.
==Screenshots==
https://dlhb.gamebrew.org/3dshomebrews/ninfs3.png


==Media==
==Media==
'''fuse-3ds demonstration with Pokémon Ultra Moon''' ([https://www.youtube.com/watch?v=d6KZdaAcpO0 ihaveamac]) <br>
'''fuse-3ds demonstration with Pokémon Ultra Moon''' ([https://www.youtube.com/watch?v=d6KZdaAcpO0 ihaveamac]) <br>
<youtube>d6KZdaAcpO0</youtube>
<youtube>d6KZdaAcpO0</youtube>
==Changelog==
'''v2.0'''
* Fix corruption with New 3DS CTRNAND.
** This mainly affected standalone builds. Other installation methods that didn't use pyctr 0.7.3 were not affected.
'''v2.0a11'''
* Accept non-ASCII game titles for SRL/NDS (some homebrew applications do this).
* Windows Installer: update pre-included WinFsp.
** The installer does not update WinFsp for you, if you want to update it, you must do it separately.
* Linux: creating desktop entry now includes the full path to the python3 executable.
* Python 3.8 or later is required, this does not affect standalone builds.
* Update pyctr requirement to 0.7.x (standalone builds use 0.7.3).
** RomFS performance is improved, especially for titles that contain a large amount of files or directories.
** Fix setting TWLNAND keys for devunit NANDs.
** For other changes related to pyctr 0.7.x: https://github.com/ihaveamac/pyctr/blob/0.7/CHANGELOG.md
* Other various internal changes.
'''v2.0a10'''
* Windows/GUI: Fix tkinter failing to find tcl/tk when installed in paths that contain non-Latin characters.
* nandhac: Fix problems loading multipart images on Linux when the mount process is not in the foreground.
* macOS: Try to load fuse-t if macFUSE can't be found ([https://github.com/ihaveamac/ninfs/issues/103 #103]).
* fuse-t is an alternative to macFUSE that doesn't depend on a kernel extension, making it easier to install on modern macOS. It should work just as well but please file issues.
* macOS: Only display filename in volume name and not the containing directory for mounts that do this.
'''v2.0a9'''
* Mac application is now signed and notarized by Apple.
* Fix not showing all drive letters in the Windows GUI mount, only A and B.
* Always set write bit in mounts (except SD).
* This makes it easier to deal with files that have been copied out of the mount, since chmod won't be required to set the write bit.
* Include Internet Access Policy for Little Snitch.
* Fix DMG build not properly copying the application.
* Update WinFSP url.


==Credits==
==Credits==
Line 220: Line 224:
==External links==
==External links==
* GitHub - https://github.com/ihaveamac/ninfs
* GitHub - https://github.com/ihaveamac/ninfs
 
* GBAtemp - https://gbatemp.net/threads/extract-and-decrypt-games-nand-backups-and-sd-contents-with-ninfs.499994
[[Category:3DS homebrew applications]]
[[Category:PC utilities for 3DS homebrew]]

Latest revision as of 04:33, 17 Mayıs 2024

Ninfs
Ninfs02.png
General
Authorihaveamac
TypeFile Operation
Version2.0
LicenseMIT License
Last Updated2024/02/25
Links
Download
Website
Source
Support Author

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.8.0+. Supports Windows (recommended 10 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

Initial setup

For 3DS types, the ARM9 bootROM is required. You can dump it using boot9strap (hold Start+Select+X on boot), which can be set up by 3DS Hacks Guide. 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

Notes:

  • 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.

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

How to install

User guide

Supported file types

Nintendo 3DS:

  • CTR Cart Image - .3ds, .cci.
  • CDN contents - cetk, tmd, and contents.
  • CTR Importable Archive - .cia.
  • Executable Filesystem - .exefs, exefs.bin.
  • Nintendo 3DS NAND backup - nand.bin.
  • NCCH - .cxi, .cfa, .ncch, .app.
  • Read-only Filesystem - .romfs, romfs.bin.
  • SD Card Contents - Nintendo 3DS from SD.
  • Installed SD Title Contents - *.tmd and *.app files.
  • 3DSX Homebrew - .3dsx.

Nintendo DS/DSi:

  • Nintendo DSi NAND backup - nand_dsi.bin.
  • Nintendo DS ROM image - .nds, .srl.

iQue Player:

  • iQue Player NAND backup (read-only) - nand.bin.

Nintendo Switch:

  • 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.
  • Linux - Run from terminal fusermount -u /path/to/mount
  • macOS (two methods):
    • Right-click on the mount and choose "Eject "drive name"".
    • Run from terminal diskutil unmount /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)

Changelog

v2.0

  • Fix corruption with New 3DS CTRNAND.
    • This mainly affected standalone builds. Other installation methods that didn't use pyctr 0.7.3 were not affected.

v2.0a11

  • Accept non-ASCII game titles for SRL/NDS (some homebrew applications do this).
  • Windows Installer: update pre-included WinFsp.
    • The installer does not update WinFsp for you, if you want to update it, you must do it separately.
  • Linux: creating desktop entry now includes the full path to the python3 executable.
  • Python 3.8 or later is required, this does not affect standalone builds.
  • Update pyctr requirement to 0.7.x (standalone builds use 0.7.3).
  • Other various internal changes.

v2.0a10

  • Windows/GUI: Fix tkinter failing to find tcl/tk when installed in paths that contain non-Latin characters.
  • nandhac: Fix problems loading multipart images on Linux when the mount process is not in the foreground.
  • macOS: Try to load fuse-t if macFUSE can't be found (#103).
  • fuse-t is an alternative to macFUSE that doesn't depend on a kernel extension, making it easier to install on modern macOS. It should work just as well but please file issues.
  • macOS: Only display filename in volume name and not the containing directory for mounts that do this.

v2.0a9

  • Mac application is now signed and notarized by Apple.
  • Fix not showing all drive letters in the Windows GUI mount, only A and B.
  • Always set write bit in mounts (except SD).
  • This makes it easier to deal with files that have been copied out of the mount, since chmod won't be required to set the write bit.
  • Include Internet Access Policy for Little Snitch.
  • Fix DMG build not properly copying the application.
  • Update WinFSP url.

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: