NSZ è un utilissimo script python sviluppato dal developer Nico Bosshard che ci permette di comprimere e decomprimere i file .nsz
da poter poi utilizzare sulla console Switch.
I file NSZ sono sostanzialmente identici ai file NSP, questo significa che non sono realmente un nuovo formato. Il loro unico scopo è quello di avvisare l’utente che contiene file NCZ compressi. I file NCZ possono essere miscelati con file NCA nello stesso contenitore.
NSC_Builder supporta la compressione di file NSP in NSZ e la decompressione di file NSZ in NSP. Gli script di esempio che si trovano qui sono solo esempi di come funziona il formato. NSC_Builder può essere scaricato da questo link.
XCZ
I file XCZ, come per i file NSZ sono sostanzialmente identici ai file XCI, questo significa che anche loro non sono realmente un nuovo formato. Il loro unico scopo è quello di avvisare l’utente che contiene file NCZ compressi. I file NCZ possono essere miscelati con file NCA nello stesso contenitore.
NCZ
Questi sono file NCA compressi. I file ANC vengono decodificati e quindi compressi mediante zstandard. Sono supportate solo le ANC con un’intestazione di 0x4000 byte
(le CNNT non sono supportate).
I primi 0x4000 byte
di un file NCZ sono esattamente gli stessi del file NCA originale (anche questa è ancora crittografata).
A 0x4000
, ci sarà una struttura di intestazione NCZ di dimensioni variabili. Questa intestazione contiene un elenco di sezioni che indicano al decompressore come ri-crittografare i dati NCA dopo la decompressione.
Tutte le informazioni nell’intestazione possono essere derivate dal Ticket NCA + originale, tuttavia vengono fornite pre-preparate per rendere la decompressione il più semplice possibile per terze parti.
Immediatamente dopo l’intestazione NCZ, il flusso zstandard inizia e termina in EOF. Il flusso viene decompresso per compensare 0x4000
.
class NczHeader
{
public:
class Section
{
public:
u64 offset;
u64 size;
u8 cryptoType;
u8 padding1[7];
u64 padding2;
integer<128> cryptoKey;
integer<128> cryptoCounter;
} PACKED;
const bool isValid()
{
return m_magic == MAGIC && m_sectionCount < 0xFFFF;
}
const u64 size() const
{
return sizeof(m_magic) + sizeof(m_sectionCount) + sizeof(Section) * m_sectionCount;
}
const Section& section(u64 i) const
{
return m_sections[i];
}
protected:
u64 m_magic;
u64 m_sectionCount;
Section m_sections[1];
static const u64 MAGIC = 0x4E544345535A434E;
} PACKED;
Installazione
- Inserire il file
prod.keys
scaricato in%userprofile%/.switch
, installare python, eseguire il comandopip install nsz
e utilizzarensz
come qualsiasi altro comando cmd.- Volendo è possibile utilizzare semplicemente la build portatile di Windows.
- Per installare manualmente le dipendenze utilizzare invece il comando:
pip install -r requirements.txt
Script del compressore
Lo script necessita delle chiavi keys.txt
compatibile con hactool che deve essere presente nella stessa directory del file nsz.py
. Attualmente funziona solo con giochi base, aggiornamenti e DLC.
Esempio di utilizzo: nsz.py --level 17 -C title1.nsp title2.nsp title3.nsp
Questo genererà i file title1.nsz
, title2.nsz
, title3.nsz
Requisiti Python
py -3 -m pip install -r requirements.txt
Guida
nsz.py --help
usage: nsz.py [-h] [-i INFO] [--depth DEPTH] [-N VERIFY_NCAS]
[-x EXTRACT [EXTRACT ...]] [-c CREATE] [-C] [-D] [-l LEVEL]
[-b BLOCK] [-s BS] [-t THREADS] [-o OUTPUT]
[file [file ...]]
positional arguments:
file
optional arguments:
-h, --help show this help message and exit
-i INFO, --info INFO show info about title or file
--depth DEPTH max depth for file info and extraction
-N VERIFY_NCAS, --verify-ncas VERIFY_NCAS
Verify NCAs in container
-x EXTRACT [EXTRACT ...], --extract EXTRACT [EXTRACT ...]
extract / unpack a NSP
-c CREATE, --create CREATE
create / pack a NSP
-C Compress NSP
-D Decompress NSZ
-l LEVEL, --level LEVEL
Compression Level
-b BLOCK, --block BLOCK
Uses highly multithreaded block compression with
random read access allowing compressed games to be
played without decompression in the future however
this comes with a low compression ratio cost. Current
title installers do not support this yet.
-s BS, --bs BS Block Size for random read access 2^x while x between
14 and 32. Default is 19 => 512 KB. Current title
installers do not support this yet.
-t THREADS, --threads THREADS
Number of threads to compress with. Usless without
enabeling block compression using -b. Negative
corresponds to the number of logical CPU cores.
-o OUTPUT, --output OUTPUT
Directory to save the output NSZ files
## Credits
SciresM for his hardware crypto functions; the blazing install speeds (50 MB/sec +) achieved here would not be possible without this.
Nicoboss for the original awesome idea. https://github.com/nicoboss/nsZip/
Changelog
- GUI:
- Contiene tutte le funzioni disponibili utilizzando gli argomenti della riga di comando.
- Supporto XCZ:
- Blocco compresso (impostazione predefinita).
- Compressione solida.
- Decompressione da XCZ a XCI.
- Implementata la compressione parallela solida. Vedi
--multi
- Implementata l’estrazione della chiave titlekey con
titlekeys.txt
e supporto titledb. Vedi--titlekeys
- Aggiunto supporto regex all’opzione di estrazione per consentire all’utente di specificare esattamente quali file devono essere estratti dal contenitore. Vedi
--extractregex
- Decompressione NCZ direttamente in nsz #38
- Aggiornato IndependentNczDecompressor all’ultima versione in nsz.
- Pienamente sostituito tqdm con enlighten.
- Implementato il sistema di comunicazione multithread con barre di processo multiple per una solida compressione e verifica evitando condizioni di gara stdout.
- Decompressione/verifica senza fine su alcuni giochi compressi a blocchi #25
- Corretto un bug che causava il riempimento dello spazio tra i file NCZ compressi a blocchi con 0x00 per adattarsi alle loro dimensioni non compresse.
- Pulizia degli script principali.
- Corretto il problema con l’indicatore di stato TQDM Decompressor NSZ.
- Corretto
--rm-old-version
. - Corretto un bug del percorso con decompressione.
- Rimossa la restrizione pycryptodome v3.9.0 poiché l’ultima v3.9.3 funziona correttamente.
- Migliorata la guida all’installazione.
- Corretto un problema che poteva verificarsi durante il tentativo di ricevere chiavi in circostanze speciali durante il debug.
- Risolto un bug importante all’interno del controllo esistente del file avanzato che portava alla sovrascrittura di file con lo stesso nome di un file già esistente nella directory di output senza specificare questo comportamento usando l’argomento della riga di comando
–overwrite
. Questo errore è stato causato confrontando il percorso del file di output anziché il nome del file di output con i nomi file esistenti. - Realizzato il pacchetto pip nsz con Kivy compatibile.
- Passato da Nuitka a PyInstaller grazie alla compatibilità Kivy.
- Modificato il modo in cui gli argomenti
--extract
e--verify
sono gestiti internamente. - Configura l’elemento della configurazione con pipeline di Azure utilizzando un server self-hosted.
- Passa completamente a pathlib. Questo corregge il bug #41 e molti altri problemi relativi al percorso del file.
- Corretto il controllo esistente del file avanzato. Adattandosi a pathlib e infine risolvendo
--overwrite
e--rm-old-version
. - Migliorata la gestione delle eccezioni relativa a
keys.txt
obsoleto che corregge i problemi#29
e#40
. - Miglioramenti generali della stabilità del sistema per migliorare l’esperienza dell’utente.
Download: NSZ v3.0.0 [Win64]
Download: Source code NSZ v3.0.0
Fonte: github.com