20 Commits

Author SHA1 Message Date
0f96dc75a2 Merge remote-tracking branch 'upstream/main' 2025-02-23 19:33:48 -05:00
e96d8932d0 Generate WAD name from title name rather than requiring dedicated key 2025-02-23 19:31:12 -05:00
dcb1cdebca (db) Fixed name for "Everybody Votes Channel" and added missing version 2025-02-23 18:50:31 -05:00
220fcc5e91 Merge remote-tracking branch 'upstream/main' 2025-02-18 21:31:54 -05:00
ab28a7bf1a Merge remote-tracking branch 'origin/main' 2025-02-18 21:31:06 -05:00
33bea6a560 UPDATE VERSION 2025-02-18 21:29:42 -05:00
0bb87bf75f Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	README.md
#	modules/download_wii.py
2025-02-18 21:27:16 -05:00
92bfeb2374 Merge remote-tracking branch 'upstream/main' 2025-01-13 14:24:38 -05:00
86da2d62b0 Merge remote-tracking branch 'upstream/main' 2025-01-05 01:31:20 -05:00
1e88c22f7c Merge remote-tracking branch 'upstream/main' 2024-12-23 18:04:18 -05:00
c4ed6e6ee6 Merge remote-tracking branch 'origin/main' 2024-12-23 12:56:45 -05:00
b337be8c08 Merge remote-tracking branch 'upstream/main' 2024-12-23 12:56:27 -05:00
76911db12d Merge remote-tracking branch 'upstream/main' 2024-12-22 21:53:12 -05:00
a361a45314 Merge remote-tracking branch 'upstream/main' 2024-12-22 17:16:37 -05:00
724c7e554b Merge remote-tracking branch 'upstream/main' 2024-12-21 20:08:03 -05:00
469cd96392 Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	README.md
2024-12-19 20:34:19 -05:00
398654609b Merge changes from upstream 2024-12-18 16:43:35 -05:00
78f98b2c73 Fix minor issue with Ticket forging 2024-12-13 23:17:20 -05:00
5872ca4676 Merge major improvements from upstream 2024-12-13 23:09:23 -05:00
147e72c8c9 Added Title Key generation code 2024-12-13 16:56:15 -05:00
11 changed files with 225 additions and 272 deletions

View File

@@ -38,7 +38,7 @@ from modules.download_batch import run_nus_download_batch
from modules.download_wii import run_nus_download_wii from modules.download_wii import run_nus_download_wii
from modules.download_dsi import run_nus_download_dsi from modules.download_dsi import run_nus_download_dsi
nusget_version = "1.3.0" nusget_version = "1.3.2"
regions = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": ["4A"], "Korea": ["4B"], "China": ["43"], regions = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": ["4A"], "Korea": ["4B"], "China": ["43"],
"Australia/NZ": ["55"]} "Australia/NZ": ["55"]}
@@ -147,7 +147,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
title = source_index.internalPointer().metadata title = source_index.internalPointer().metadata
if title is not None: if title is not None:
self.ui.console_select_dropdown.setCurrentIndex(self.ui.platform_tabs.currentIndex()) self.ui.console_select_dropdown.setCurrentIndex(self.ui.platform_tabs.currentIndex())
selected_title = TitleData(title.tid, title.name, title.archive_name, title.version, title.ticket, selected_title = TitleData(title.tid, title.name, title.version, title.ticket,
title.region, title.category, title.danger) title.region, title.category, title.danger)
self.load_title_data(selected_title) self.load_title_data(selected_title)
@@ -212,20 +212,19 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# Load the TID and version into the entry boxes. # Load the TID and version into the entry boxes.
self.ui.tid_entry.setText(tid) self.ui.tid_entry.setText(tid)
self.ui.version_entry.setText(str(selected_title.version)) self.ui.version_entry.setText(str(selected_title.version))
# Load the WAD name, assuming it exists. This shouldn't ever be able to fail as the database has a WAD name # Create the WAD name by deriving it from the title name (basically just replace " " with "-").
# for every single title, regardless of whether it can be packed or not. archive_name = selected_title.name.replace(" ", "-")
archive_name = selected_title.archive_name if selected_title.category not in ["System", "IOS"]:
if selected_title.category != "System" and selected_title.category != "IOS":
archive_name += f"-{str(bytes.fromhex(tid).decode())[-4:]}" archive_name += f"-{str(bytes.fromhex(tid).decode())[-4:]}"
archive_name += f"-v{selected_title.version}" archive_name += f"-v{selected_title.version}"
if selected_title.region != "World": if selected_title.region != "World":
archive_name += f"-{selected_title.region.split('/')[0]}" archive_name += f"-{selected_title.region.split('/')[0]}"
if self.ui.console_select_dropdown.currentText() == "DSi": if self.ui.console_select_dropdown.currentText() == "DSi":
archive_name += ".tad" archive_name += ".tad"
elif self.ui.console_select_dropdown.currentText() == "vWii": else:
if self.ui.console_select_dropdown.currentText() == "vWii":
if selected_title.category.find("System") != -1 or selected_title.category == "IOS": if selected_title.category.find("System") != -1 or selected_title.category == "IOS":
archive_name += "-vWii" archive_name += "-vWii"
archive_name += ".wad"
else: else:
if selected_title.category.find("System") != -1 or selected_title.category == "IOS": if selected_title.category.find("System") != -1 or selected_title.category == "IOS":
archive_name += "-Wii" archive_name += "-Wii"
@@ -449,7 +448,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
for r in regions: for r in regions:
if f"{t['TID'][:-2]}{regions[r][0]}" == tid: if f"{t['TID'][:-2]}{regions[r][0]}" == tid:
try: try:
archive_name = t["Archive Name"] archive_name = t["Name"].replace(" ", "-")
break break
except KeyError: except KeyError:
archive_name = "" archive_name = ""
@@ -457,7 +456,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
else: else:
if t["TID"] == tid: if t["TID"] == tid:
try: try:
archive_name = t["Archive Name"] archive_name = t["Name"].replace(" ", "-")
break break
except KeyError: except KeyError:
archive_name = "" archive_name = ""

View File

@@ -1,3 +1,5 @@
# NUSGet After Dark
A modern and supercharged NUS downloader built with Python and Qt6. Powered by libWiiPy and libTWLPy. Fork with features not acceptable for prod.
<div align="center"> <div align="center">
<img src="https://github.com/user-attachments/assets/156eb949-93aa-4453-b7a0-99b784ec0c8c" alt="The icon for NUSGet" width=256 height=256> <img src="https://github.com/user-attachments/assets/156eb949-93aa-4453-b7a0-99b784ec0c8c" alt="The icon for NUSGet" width=256 height=256>
<h1>NUSGet</h1> <h1>NUSGet</h1>
@@ -17,11 +19,12 @@ NUSGet also offers the ability to create vWii WADs that can be installed from wi
The following features are available for all supported consoles: The following features are available for all supported consoles:
- Downloading encrypted contents (files like `00000000`, `00000001`, etc.) directly from the update servers for any title. - Downloading encrypted contents (files like `00000000`, `00000001`, etc.) directly from the update servers for any title.
- Creating decrypted contents (*.app files) from the encrypted contents on the servers. Only supported for free titles. - Creating decrypted contents (*.app files) from the encrypted contents on the servers.
- Scripting support, allowing you to perform batch downloads of any titles for the Wii, vWii, or DSi in one script. (See `example-script.json` for an example of the scripting format.) - Scripting support, allowing you to perform batch downloads of any titles for the Wii, vWii, or DSi in one script. (See `example-script.json` for an example of the scripting format.)
**For Wii and vWii titles only:** **For Wii and vWii titles only:**
- "Pack installable archive (WAD/TAD)": Pack the encrypted contents, TMD, and Ticket into a WAD file that can be installed on a Wii or in Dolphin Emulator. Only supported for free titles. - "Pack installable archive (WAD/TAD)": Pack the encrypted contents, TMD, and Ticket into a WAD file that can be installed on a Wii or in Dolphin Emulator.
- Forging Tickets for titles without a common Ticket available on the NUS by using the Title Key algorithm to derive the key needed to decrypt the title.
**For vWii titles only:** **For vWii titles only:**
- "Re-encrypt title using the Wii Common Key": Re-encrypt the Title Key in a vWii title's Ticket before packing the WAD, so that the WAD can be installed via a normal WAD manager on the vWii, and can be extracted with legacy tools. **This also creates WADs that can be installed directly in Dolphin, allowing for running the vWii System Menu in Dolphin without a vWii NAND dump!** - "Re-encrypt title using the Wii Common Key": Re-encrypt the Title Key in a vWii title's Ticket before packing the WAD, so that the WAD can be installed via a normal WAD manager on the vWii, and can be extracted with legacy tools. **This also creates WADs that can be installed directly in Dolphin, allowing for running the vWii System Menu in Dolphin without a vWii NAND dump!**

View File

@@ -6,11 +6,10 @@
"Versions": { "Versions": {
"World": [256, 512] "World": [256, 512]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Nintendo-DS-Cartridge-Whitelist"
}, },
{ {
"Name": "Launcher (System Menu)", "Name": "Launcher",
"TID": "00030017484E41XX", "TID": "00030017484E41XX",
"Versions": { "Versions": {
"USA/NTSC": [512, 768, 1024, 1280, 1536, 1792], "USA/NTSC": [512, 768, 1024, 1280, 1536, 1792],
@@ -21,7 +20,6 @@
"Australia/NZ": [512, 768, 1024, 1280, 1536, 1792] "Australia/NZ": [512, 768, 1024, 1280, 1536, 1792]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "Launcher",
"Danger": "The Launcher (DSi Menu) is a critical part of the DSi's operation, and should not be modified unless you have Unlaunch installed." "Danger": "The Launcher (DSi Menu) is a critical part of the DSi's operation, and should not be modified unless you have Unlaunch installed."
}, },
{ {
@@ -35,8 +33,7 @@
"China": [4, 5, 6, 7, 8, 9], "China": [4, 5, 6, 7, 8, 9],
"Australia/NZ": [3, 4, 5, 6, 7, 8, 9] "Australia/NZ": [3, 4, 5, 6, 7, 8, 9]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Version-Data"
}, },
{ {
"Name": "WiFi Firmware", "Name": "WiFi Firmware",
@@ -45,7 +42,6 @@
"World": [256, 512] "World": [256, 512]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "WiFi-Firmware",
"Danger": "The WiFi Firmware is the firmware that runs on the DSi's WiFi chip, and should not be modified. Your console WILL be bricked if this title is damaged or missing." "Danger": "The WiFi Firmware is the firmware that runs on the DSi's WiFi chip, and should not be modified. Your console WILL be bricked if this title is damaged or missing."
} }
], ],
@@ -56,8 +52,7 @@
"Versions": { "Versions": {
"World": [256] "World": [256]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "DS-Download-Play"
}, },
{ {
"Name": "Flipnote Studio", "Name": "Flipnote Studio",
@@ -67,8 +62,7 @@
"Europe/PAL": [0], "Europe/PAL": [0],
"Japan": [512] "Japan": [512]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Flipnote-Studio"
}, },
{ {
"Name": "Nintendo 3DS Transfer Tool", "Name": "Nintendo 3DS Transfer Tool",
@@ -80,8 +74,7 @@
"Korea": [256], "Korea": [256],
"Australia/NZ": [512, 768] "Australia/NZ": [512, 768]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Nintendo-3DS-Transfer-Tool"
}, },
{ {
"Name": "Nintendo DSi Browser", "Name": "Nintendo DSi Browser",
@@ -91,8 +84,7 @@
"Europe/PAL": [768], "Europe/PAL": [768],
"Japan": [768] "Japan": [768]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Nintendo-DSi-Browser"
}, },
{ {
"Name": "Nintendo DSi Camera", "Name": "Nintendo DSi Camera",
@@ -103,8 +95,7 @@
"Japan": [256, 768, 1024], "Japan": [256, 768, 1024],
"Australia/NZ": [768, 1024] "Australia/NZ": [768, 1024]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Nintendo-DSi-Camera"
}, },
{ {
"Name": "Nintendo DSi Shop", "Name": "Nintendo DSi Shop",
@@ -117,8 +108,7 @@
"China": [768], "China": [768],
"Australia/NZ": [1536, 1792, 2048, 2304, 2560, 2816, 3072] "Australia/NZ": [1536, 1792, 2048, 2304, 2560, 2816, 3072]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Nintendo-DSi-Shop"
}, },
{ {
"Name": "Nintendo DSi Sound", "Name": "Nintendo DSi Sound",
@@ -129,8 +119,7 @@
"Japan": [256, 512], "Japan": [256, 512],
"Australia/NZ": [256, 512] "Australia/NZ": [256, 512]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Nintendo-DSi-Sound"
}, },
{ {
"Name": "Nintendo Zone", "Name": "Nintendo Zone",
@@ -141,8 +130,7 @@
"Japan": [512, 768], "Japan": [512, 768],
"Australia/NZ": [512, 768] "Australia/NZ": [512, 768]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Nintendo-DSi-Sound"
}, },
{ {
"Name": "System Settings", "Name": "System Settings",
@@ -155,8 +143,7 @@
"China": [768], "China": [768],
"Australia/NZ": [512, 768] "Australia/NZ": [512, 768]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "System-Settings"
} }
], ],
"DSiWare": [ "DSiWare": [

View File

@@ -7,7 +7,6 @@
"World": [6, 7] "World": [6, 7]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "BC-NAND",
"Danger": "BC-NAND is required for the Wii U to boot Wii titles. DO NOT modify it, or your Wii U will no longer be able to enter Wii mode." "Danger": "BC-NAND is required for the Wii U to boot Wii titles. DO NOT modify it, or your Wii U will no longer be able to enter Wii mode."
}, },
{ {
@@ -17,7 +16,6 @@
"World": [1] "World": [1]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "BC-WFS",
"Danger": "BC-WFS is required for the Wii U to be able to boot Dragon Quest X Online. Do NOT modify it, or your Wii U may experience issues with Wii mode." "Danger": "BC-WFS is required for the Wii U to be able to boot Dragon Quest X Online. Do NOT modify it, or your Wii U may experience issues with Wii mode."
}, },
{ {
@@ -29,7 +27,6 @@
"Japan": [512, 544, 608] "Japan": [512, 544, 608]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "System-Menu",
"Danger": "The System Menu is a critical part of the vWii's operation, and should not be modified. If you intend to modify it, you should have Preloader installed, or else you may not be able to use the vWii.", "Danger": "The System Menu is a critical part of the vWii's operation, and should not be modified. If you intend to modify it, you should have Preloader installed, or else you may not be able to use the vWii.",
"Public Versions": { "Public Versions": {
"512": "4.3J - Wii U v1.0.0J", "512": "4.3J - Wii U v1.0.0J",
@@ -51,8 +48,7 @@
"Versions": { "Versions": {
"World": [6] "World": [6]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Mii-Channel"
}, },
{ {
"Name": "Shopping Channel", "Name": "Shopping Channel",
@@ -60,8 +56,7 @@
"Versions": { "Versions": {
"World": [21] "World": [21]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Shopping-Channel"
}, },
{ {
"Name": "Return to Wii U Menu", "Name": "Return to Wii U Menu",
@@ -70,7 +65,6 @@
"World": [0] "World": [0]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "Return-to-Wii-U-Menu",
"Danger": "\"Return to Wii U Menu\" is the channel launched from the vWii menu to reboot your console back into Wii U mode. While it generally should not be modified, modifying or removing it will not prevent the vWii from working." "Danger": "\"Return to Wii U Menu\" is the channel launched from the vWii menu to reboot your console back into Wii U mode. While it generally should not be modified, modifying or removing it will not prevent the vWii from working."
}, },
{ {
@@ -81,8 +75,7 @@
"Europe/PAL": [0, 1, 2, 3, 4, 5], "Europe/PAL": [0, 1, 2, 3, 4, 5],
"Japan": [0, 1, 2, 3, 5] "Japan": [0, 1, 2, 3, 5]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Wii-Electronic-Manual"
} }
], ],
"Hidden Channels": [ "Hidden Channels": [
@@ -95,7 +88,6 @@
"Japan": [2] "Japan": [2]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "Region-Select",
"Danger": "\"Region Select\" is a hidden channel used during the Wii's initial setup. If this title is damaged or missing, you will not be able to set up your Wii again after a factory reset." "Danger": "\"Region Select\" is a hidden channel used during the Wii's initial setup. If this title is damaged or missing, you will not be able to set up your Wii again after a factory reset."
}, },
{ {
@@ -107,7 +99,6 @@
"Japan": [29, 31] "Japan": [29, 31]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "Wii-System-Transfer-WC",
"Danger": "Note: It is currently unknown how this channel works, but it is involved somehow in the Wii to vWii transfer process. It is recommended to not modify it. Also note that this is separate from the normal, non-hidden channel \"Wii System Transfer Tool\" that works alongside \"Wii U Transfer Tool\" on a source Wii." "Danger": "Note: It is currently unknown how this channel works, but it is involved somehow in the Wii to vWii transfer process. It is recommended to not modify it. Also note that this is separate from the normal, non-hidden channel \"Wii System Transfer Tool\" that works alongside \"Wii U Transfer Tool\" on a source Wii."
} }
], ],
@@ -120,8 +111,7 @@
"Europe/PAL": [516], "Europe/PAL": [516],
"Japan": [516] "Japan": [516]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Wii-System-Transfer-Tool-WNP"
} }
], ],
"IOS": [ "IOS": [
@@ -131,8 +121,7 @@
"Versions": { "Versions": {
"World": [1290] "World": [1290]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS9"
}, },
{ {
"Name": "IOS 12", "Name": "IOS 12",
@@ -140,8 +129,7 @@
"Versions": { "Versions": {
"World": [782] "World": [782]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS12"
}, },
{ {
"Name": "IOS 13", "Name": "IOS 13",
@@ -149,8 +137,7 @@
"Versions": { "Versions": {
"World": [1288] "World": [1288]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS13"
}, },
{ {
"Name": "IOS 14", "Name": "IOS 14",
@@ -158,8 +145,7 @@
"Versions": { "Versions": {
"World": [1288] "World": [1288]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS14"
}, },
{ {
"Name": "IOS 15", "Name": "IOS 15",
@@ -167,8 +153,7 @@
"Versions": { "Versions": {
"World": [1288] "World": [1288]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS15"
}, },
{ {
"Name": "IOS 17", "Name": "IOS 17",
@@ -176,8 +161,7 @@
"Versions": { "Versions": {
"World": [1288] "World": [1288]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS17"
}, },
{ {
"Name": "IOS 21", "Name": "IOS 21",
@@ -185,8 +169,7 @@
"Versions": { "Versions": {
"World": [1295] "World": [1295]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS21"
}, },
{ {
"Name": "IOS 22", "Name": "IOS 22",
@@ -194,8 +177,7 @@
"Versions": { "Versions": {
"World": [1550] "World": [1550]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS22"
}, },
{ {
"Name": "IOS 28", "Name": "IOS 28",
@@ -203,8 +185,7 @@
"Versions": { "Versions": {
"World": [2063] "World": [2063]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS28"
}, },
{ {
"Name": "IOS 31", "Name": "IOS 31",
@@ -212,8 +193,7 @@
"Versions": { "Versions": {
"World": [3864] "World": [3864]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS31"
}, },
{ {
"Name": "IOS 33", "Name": "IOS 33",
@@ -221,8 +201,7 @@
"Versions": { "Versions": {
"World": [3864] "World": [3864]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS33"
}, },
{ {
"Name": "IOS 34", "Name": "IOS 34",
@@ -230,8 +209,7 @@
"Versions": { "Versions": {
"World": [3864] "World": [3864]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS34"
}, },
{ {
"Name": "IOS 35", "Name": "IOS 35",
@@ -239,8 +217,7 @@
"Versions": { "Versions": {
"World": [3864] "World": [3864]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS35"
}, },
{ {
"Name": "IOS 36", "Name": "IOS 36",
@@ -248,8 +225,7 @@
"Versions": { "Versions": {
"World": [3864] "World": [3864]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS36"
}, },
{ {
"Name": "IOS 37", "Name": "IOS 37",
@@ -257,8 +233,7 @@
"Versions": { "Versions": {
"World": [5919] "World": [5919]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS37"
}, },
{ {
"Name": "IOS 38", "Name": "IOS 38",
@@ -266,8 +241,7 @@
"Versions": { "Versions": {
"World": [4380] "World": [4380]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS38"
}, },
{ {
"Name": "IOS 41", "Name": "IOS 41",
@@ -275,8 +249,7 @@
"Versions": { "Versions": {
"World": [3863] "World": [3863]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS41"
}, },
{ {
"Name": "IOS 43", "Name": "IOS 43",
@@ -284,8 +257,7 @@
"Versions": { "Versions": {
"World": [3863] "World": [3863]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS43"
}, },
{ {
"Name": "IOS 45", "Name": "IOS 45",
@@ -293,8 +265,7 @@
"Versions": { "Versions": {
"World": [3863] "World": [3863]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS45"
}, },
{ {
"Name": "IOS 46", "Name": "IOS 46",
@@ -302,8 +273,7 @@
"Versions": { "Versions": {
"World": [3863] "World": [3863]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS46"
}, },
{ {
"Name": "IOS 48", "Name": "IOS 48",
@@ -311,8 +281,7 @@
"Versions": { "Versions": {
"World": [4380] "World": [4380]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS48"
}, },
{ {
"Name": "IOS 53", "Name": "IOS 53",
@@ -320,8 +289,7 @@
"Versions": { "Versions": {
"World": [5919] "World": [5919]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS53"
}, },
{ {
"Name": "IOS 55", "Name": "IOS 55",
@@ -329,8 +297,7 @@
"Versions": { "Versions": {
"World": [5919] "World": [5919]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS55"
}, },
{ {
"Name": "IOS 56", "Name": "IOS 56",
@@ -338,8 +305,7 @@
"Versions": { "Versions": {
"World": [5918] "World": [5918]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS56"
}, },
{ {
"Name": "IOS 57", "Name": "IOS 57",
@@ -347,8 +313,7 @@
"Versions": { "Versions": {
"World": [6175] "World": [6175]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS57"
}, },
{ {
"Name": "IOS 58", "Name": "IOS 58",
@@ -356,8 +321,7 @@
"Versions": { "Versions": {
"World": [6432] "World": [6432]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS58"
}, },
{ {
"Name": "IOS 59", "Name": "IOS 59",
@@ -365,8 +329,7 @@
"Versions": { "Versions": {
"World": [7201, 8737, 9249] "World": [7201, 8737, 9249]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS59"
}, },
{ {
"Name": "IOS 62", "Name": "IOS 62",
@@ -374,8 +337,7 @@
"Versions": { "Versions": {
"World": [6430, 6686, 6942] "World": [6430, 6686, 6942]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS62"
}, },
{ {
"Name": "IOS 80", "Name": "IOS 80",
@@ -383,8 +345,7 @@
"Versions": { "Versions": {
"World": [7200] "World": [7200]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS80"
} }
] ]
} }

View File

@@ -7,7 +7,6 @@
"World": [2, 4, 5, 6] "World": [2, 4, 5, 6]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "BC",
"Danger": "BC is required for the Wii's backwards compatibility with the GameCube. GameCube games will not run properly if BC is damaged or missing." "Danger": "BC is required for the Wii's backwards compatibility with the GameCube. GameCube games will not run properly if BC is damaged or missing."
}, },
{ {
@@ -17,7 +16,6 @@
"World": [4] "World": [4]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "boot2",
"Danger": "boot2 is a critical part of the Wii's boot process, and should not be modified. Most updated Wiis will already be running boot2v4, which is the only version of boot2 available on the NUS." "Danger": "boot2 is a critical part of the Wii's boot process, and should not be modified. Most updated Wiis will already be running boot2v4, which is the only version of boot2 available on the NUS."
}, },
{ {
@@ -27,7 +25,6 @@
"World": [4, 5, 8, 9, 10] "World": [4, 5, 8, 9, 10]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "MIOS",
"Danger": "MIOS is required for the Wii's backwards compatibility with the GameCube. GameCube games will not run properly if MIOS is damaged or missing." "Danger": "MIOS is required for the Wii's backwards compatibility with the GameCube. GameCube games will not run properly if MIOS is damaged or missing."
}, },
{ {
@@ -80,7 +77,6 @@
"518": "4.3K" "518": "4.3K"
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "System-Menu",
"Danger": "The System Menu is a critical part of the Wii's operation, and should not be modified without proper brick prevention in place. You should have BootMii installed as boot2 if possible, and if not, Priiloader installed before making changes to the System Menu." "Danger": "The System Menu is a critical part of the Wii's operation, and should not be modified without proper brick prevention in place. You should have BootMii installed as boot2 if possible, and if not, Priiloader installed before making changes to the System Menu."
} }
], ],
@@ -94,8 +90,7 @@
"Europe/PAL": [6, 7], "Europe/PAL": [6, 7],
"Japan": [6, 7] "Japan": [6, 7]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Forecast-Channel"
}, },
{ {
"Name": "Mii Channel", "Name": "Mii Channel",
@@ -103,8 +98,7 @@
"Versions": { "Versions": {
"World": [2, 3, 4, 5, 6] "World": [2, 3, 4, 5, 6]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Mii-Channel"
}, },
{ {
"Name": "News Channel", "Name": "News Channel",
@@ -115,8 +109,7 @@
"Europe/PAL": [6, 7], "Europe/PAL": [6, 7],
"Japan": [6, 7] "Japan": [6, 7]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "News-Channel"
}, },
{ {
"Name": "Photo Channel", "Name": "Photo Channel",
@@ -124,8 +117,7 @@
"Versions": { "Versions": {
"World": [1, 2] "World": [1, 2]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Photo-Channel"
}, },
{ {
"Name": "Photo Channel 1.1", "Name": "Photo Channel 1.1",
@@ -134,8 +126,7 @@
"World": [1, 2, 3], "World": [1, 2, 3],
"Korea": [3] "Korea": [3]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Photo-Channel-1.1"
}, },
{ {
"Name": "Shopping Channel", "Name": "Shopping Channel",
@@ -144,8 +135,7 @@
"World": [3, 4, 5, 6, 7, 8, 10, 13, 16, 17, 18, 19, 20, 21], "World": [3, 4, 5, 6, 7, 8, 10, 13, 16, 17, 18, 19, 20, 21],
"Korea": [3, 4, 5, 6, 7, 8, 10, 13, 14, 16, 17, 18, 19, 20, 21] "Korea": [3, 4, 5, 6, 7, 8, 10, 13, 14, 16, 17, 18, 19, 20, 21]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Shopping-Channel"
} }
], ],
"Hidden Channels": [ "Hidden Channels": [
@@ -159,7 +149,6 @@
"Korea": [1, 2, 3] "Korea": [1, 2, 3]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "EULA",
"Danger": "\"EULA\" is a hidden channel used to display the End User License Agreement that must be accepted to connect to WiiConnect24. Online services may not work correctly if this channel is damaged or missing." "Danger": "\"EULA\" is a hidden channel used to display the End User License Agreement that must be accepted to connect to WiiConnect24. Online services may not work correctly if this channel is damaged or missing."
}, },
{ {
@@ -172,7 +161,6 @@
"Korea": [2] "Korea": [2]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "Region-Select",
"Danger": "\"Region Select\" is a hidden channel used during the Wii's initial setup. If this title is damaged or missing, you will not be able to set up your Wii again after a factory reset. This title will need to be reinstalled to fix your console." "Danger": "\"Region Select\" is a hidden channel used during the Wii's initial setup. If this title is damaged or missing, you will not be able to set up your Wii again after a factory reset. This title will need to be reinstalled to fix your console."
}, },
{ {
@@ -181,8 +169,7 @@
"Versions": { "Versions": {
"Japan": [0, 1, 2] "Japan": [0, 1, 2]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Set-Personal-Data-Channel"
} }
], ],
"Downloadable Channels": [ "Downloadable Channels": [
@@ -192,8 +179,7 @@
"Versions": { "Versions": {
"USA/NTSC": [1280] "USA/NTSC": [1280]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Amazon-Instant-Video"
}, },
{ {
"Name": "BBC iPlayer Channel", "Name": "BBC iPlayer Channel",
@@ -201,8 +187,7 @@
"Versions": { "Versions": {
"Europe/PAL": [768] "Europe/PAL": [768]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "BBC-iPlayer-Channel"
}, },
{ {
"Name": "Check Mii Out Channel", "Name": "Check Mii Out Channel",
@@ -212,8 +197,7 @@
"Europe/PAL": [1, 3, 512], "Europe/PAL": [1, 3, 512],
"Japan": [1, 3, 512] "Japan": [1, 3, 512]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Check-Mii-Out-Channel"
}, },
{ {
"Name": "Demae Channel", "Name": "Demae Channel",
@@ -221,8 +205,7 @@
"Versions": { "Versions": {
"Japan": [512] "Japan": [512]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Demae-Channel"
}, },
{ {
"Name": "Digicam Print Channel", "Name": "Digicam Print Channel",
@@ -230,19 +213,17 @@
"Versions": { "Versions": {
"Japan": [1024] "Japan": [1024]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Digicam-Print-Channel"
}, },
{ {
"Name": "Everyone Votes Channel", "Name": "Everybody Votes Channel",
"TID": "0001000148414AXX", "TID": "0001000148414AXX",
"Versions": { "Versions": {
"USA/NTSC": [1, 2, 3], "USA/NTSC": [1, 2, 3, 512],
"Europe/PAL": [1, 2, 3], "Europe/PAL": [1, 2, 3, 512],
"Japan": [1, 2, 3] "Japan": [1, 2, 3, 512]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Everyone-Votes-Channel"
}, },
{ {
"Name": "Hulu Plus", "Name": "Hulu Plus",
@@ -251,8 +232,7 @@
"USA/NTSC": [1283], "USA/NTSC": [1283],
"Japan": [1024] "Japan": [1024]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Hulu-Plus"
}, },
{ {
"Name": "Internet Channel", "Name": "Internet Channel",
@@ -262,8 +242,7 @@
"Europe/PAL": [1, 3, 257, 512, 1024], "Europe/PAL": [1, 3, 257, 512, 1024],
"Japan": [1, 3, 257, 512, 1024] "Japan": [1, 3, 257, 512, 1024]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Internet-Channel"
}, },
{ {
"Name": "Jam With The Band Live Channel", "Name": "Jam With The Band Live Channel",
@@ -272,8 +251,7 @@
"Europe/PAL": [2], "Europe/PAL": [2],
"Japan": [2] "Japan": [2]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Jam-With-The-Band-Live-Channel"
}, },
{ {
"Name": "Kirby TV Channel", "Name": "Kirby TV Channel",
@@ -281,8 +259,7 @@
"Versions": { "Versions": {
"Europe/PAL": [257] "Europe/PAL": [257]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Kirby-TV-Channel"
}, },
{ {
"Name": "Metroid Prime 3 Preview", "Name": "Metroid Prime 3 Preview",
@@ -291,8 +268,7 @@
"Europe/PAL": [1, 2], "Europe/PAL": [1, 2],
"Japan": [1, 2] "Japan": [1, 2]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Metroid-Prime-3-Preview"
}, },
{ {
"Name": "Netflix Channel", "Name": "Netflix Channel",
@@ -301,8 +277,7 @@
"USA/NTSC": [2049], "USA/NTSC": [2049],
"Europe/PAL": [2049] "Europe/PAL": [2049]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Netflix-Channel"
}, },
{ {
"Name": "Nintendo Channel", "Name": "Nintendo Channel",
@@ -312,8 +287,7 @@
"Europe/PAL": [1792], "Europe/PAL": [1792],
"Japan": [1792] "Japan": [1792]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Nintendo-Channel"
}, },
{ {
"Name": "Photo Channel 1.0 Restore Program", "Name": "Photo Channel 1.0 Restore Program",
@@ -321,8 +295,7 @@
"Versions": { "Versions": {
"Japan": [0] "Japan": [0]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Photo-Channel-1.0-Restore-Program"
}, },
{ {
"Name": "The Legend of Zelda: Skyward Sword Save Data Update Channel", "Name": "The Legend of Zelda: Skyward Sword Save Data Update Channel",
@@ -332,8 +305,7 @@
"Europe/PAL": [0], "Europe/PAL": [0],
"Japan": [1] "Japan": [1]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Skyward-Sword-Save-Data-Update-Channel"
}, },
{ {
"Name": "Today and Tomorrow Channel", "Name": "Today and Tomorrow Channel",
@@ -342,8 +314,7 @@
"Europe/PAL": [1], "Europe/PAL": [1],
"Japan": [1] "Japan": [1]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Today-and-Tomorrow-Channel"
}, },
{ {
"Name": "TV Friend Channel/G-Guide for Wii", "Name": "TV Friend Channel/G-Guide for Wii",
@@ -351,8 +322,7 @@
"Versions": { "Versions": {
"Japan": [1] "Japan": [1]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "TV-Friend-Channel"
}, },
{ {
"Name": "USB Memory Repair Program", "Name": "USB Memory Repair Program",
@@ -360,17 +330,15 @@
"Versions": { "Versions": {
"Japan": [12] "Japan": [12]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "USB-Repair-Program"
}, },
{ {
"Name": "Wii no Ma Channel", "Name": "Wii Room",
"TID": "00010001484349XX", "TID": "00010001484349XX",
"Versions": { "Versions": {
"Japan": [0] "Japan": [0, 512, 770, 1025]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Wii-no-Ma-Channel"
}, },
{ {
"Name": "Wii Speak Channel", "Name": "Wii Speak Channel",
@@ -381,8 +349,7 @@
"Japan": [1, 256, 512], "Japan": [1, 256, 512],
"Korea": [512] "Korea": [512]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "Wii-Speak-Channel"
}, },
{ {
"Name": "Wii U Transfer Tool", "Name": "Wii U Transfer Tool",
@@ -392,8 +359,7 @@
"Europe/PAL": [516], "Europe/PAL": [516],
"Japan": [516] "Japan": [516]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "Wii-U-Transfer-Tool"
}, },
{ {
"Name": "YouTube", "Name": "YouTube",
@@ -402,8 +368,7 @@
"USA/NTSC": [1536], "USA/NTSC": [1536],
"Japan": [768] "Japan": [768]
}, },
"Ticket": false, "Ticket": false
"Archive Name": "YouTube"
} }
], ],
"IOS": [ "IOS": [
@@ -414,7 +379,6 @@
"World": [65280] "World": [65280]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS4",
"Danger": "This IOS is a stub, and no longer offers any functionality. It cannot be used to run any code." "Danger": "This IOS is a stub, and no longer offers any functionality. It cannot be used to run any code."
}, },
{ {
@@ -423,8 +387,7 @@
"Versions": { "Versions": {
"World": [520, 521, 778, 1034] "World": [520, 521, 778, 1034]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS9"
}, },
{ {
"Name": "IOS 10", "Name": "IOS 10",
@@ -432,8 +395,7 @@
"Versions": { "Versions": {
"World": [768] "World": [768]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS10"
}, },
{ {
"Name": "IOS 11", "Name": "IOS 11",
@@ -442,7 +404,6 @@
"World": [10, 256] "World": [10, 256]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS11",
"Danger": "Version 256 of IOS 11 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 2.0-2.1, DO NOT install version 256, as the System Menu relies on IOS 11." "Danger": "Version 256 of IOS 11 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 2.0-2.1, DO NOT install version 256, as the System Menu relies on IOS 11."
}, },
{ {
@@ -451,8 +412,7 @@
"Versions": { "Versions": {
"World": [6, 11, 12, 269, 525, 526] "World": [6, 11, 12, 269, 525, 526]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS12"
}, },
{ {
"Name": "IOS 13", "Name": "IOS 13",
@@ -460,8 +420,7 @@
"Versions": { "Versions": {
"World": [10, 15, 16, 273, 1031, 1032] "World": [10, 15, 16, 273, 1031, 1032]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS13"
}, },
{ {
"Name": "IOS 14", "Name": "IOS 14",
@@ -469,8 +428,7 @@
"Versions": { "Versions": {
"World": [262, 263, 520, 1031, 1032] "World": [262, 263, 520, 1031, 1032]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS14"
}, },
{ {
"Name": "IOS 15", "Name": "IOS 15",
@@ -478,8 +436,7 @@
"Versions": { "Versions": {
"World": [257, 258, 259, 260, 265, 266, 523, 1031, 1032] "World": [257, 258, 259, 260, 265, 266, 523, 1031, 1032]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS15"
}, },
{ {
"Name": "IOS 16", "Name": "IOS 16",
@@ -488,7 +445,6 @@
"World": [512] "World": [512]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS16",
"Danger": "This IOS is a stub, and no longer offers any functionality. It cannot be used to run any code." "Danger": "This IOS is a stub, and no longer offers any functionality. It cannot be used to run any code."
}, },
{ {
@@ -497,8 +453,7 @@
"Versions": { "Versions": {
"World": [512, 517, 518, 775, 1031, 1032] "World": [512, 517, 518, 775, 1031, 1032]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS17"
}, },
{ {
"Name": "IOS 20", "Name": "IOS 20",
@@ -507,7 +462,6 @@
"World": [12, 256] "World": [12, 256]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS20",
"Danger": "Version 256 of IOS 20 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 2.2, DO NOT install version 256, as the System Menu relies on IOS 20." "Danger": "Version 256 of IOS 20 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 2.2, DO NOT install version 256, as the System Menu relies on IOS 20."
}, },
{ {
@@ -516,8 +470,7 @@
"Versions": { "Versions": {
"World": [514, 515, 516, 517, 522, 525, 782, 1038, 1039] "World": [514, 515, 516, 517, 522, 525, 782, 1038, 1039]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS21"
}, },
{ {
"Name": "IOS 22", "Name": "IOS 22",
@@ -525,8 +478,7 @@
"Versions": { "Versions": {
"World": [777, 780, 1037, 1293, 1294] "World": [777, 780, 1037, 1293, 1294]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS22"
}, },
{ {
"Name": "IOS 28", "Name": "IOS 28",
@@ -534,8 +486,7 @@
"Versions": { "Versions": {
"World": [1292, 1293, 1550, 1806, 1807] "World": [1292, 1293, 1550, 1806, 1807]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS28"
}, },
{ {
"Name": "IOS 30", "Name": "IOS 30",
@@ -544,7 +495,6 @@
"World": [1037, 1039, 1040, 2576, 2816] "World": [1037, 1039, 1040, 2576, 2816]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS30",
"Danger": "Version 2816 of IOS 30 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.0-3.3, DO NOT install version 2816, as the System Menu relies on IOS 30." "Danger": "Version 2816 of IOS 30 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.0-3.3, DO NOT install version 2816, as the System Menu relies on IOS 30."
}, },
{ {
@@ -553,8 +503,7 @@
"Versions": { "Versions": {
"World": [1037, 1039, 1040, 2576, 3088, 3092, 3349, 3607, 3608] "World": [1037, 1039, 1040, 2576, 3088, 3092, 3349, 3607, 3608]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS31"
}, },
{ {
"Name": "IOS 33", "Name": "IOS 33",
@@ -562,8 +511,7 @@
"Versions": { "Versions": {
"World": [1040, 2832, 2834, 3091, 3607, 3608] "World": [1040, 2832, 2834, 3091, 3607, 3608]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS33"
}, },
{ {
"Name": "IOS 34", "Name": "IOS 34",
@@ -571,8 +519,7 @@
"Versions": { "Versions": {
"World": [1039, 3087, 3091, 3348, 3607, 3608] "World": [1039, 3087, 3091, 3348, 3607, 3608]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS34"
}, },
{ {
"Name": "IOS 35", "Name": "IOS 35",
@@ -580,8 +527,7 @@
"Versions": { "Versions": {
"World": [1040, 3088, 3092, 3349, 3607, 3608] "World": [1040, 3088, 3092, 3349, 3607, 3608]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS35"
}, },
{ {
"Name": "IOS 36", "Name": "IOS 36",
@@ -589,8 +535,7 @@
"Versions": { "Versions": {
"World": [1042, 3090, 3094, 3351, 3607, 3608] "World": [1042, 3090, 3094, 3351, 3607, 3608]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS36"
}, },
{ {
"Name": "IOS 37", "Name": "IOS 37",
@@ -598,8 +543,7 @@
"Versions": { "Versions": {
"World": [2070, 3609, 3612, 3869, 5662, 5663] "World": [2070, 3609, 3612, 3869, 5662, 5663]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS37"
}, },
{ {
"Name": "IOS 38", "Name": "IOS 38",
@@ -607,8 +551,7 @@
"Versions": { "Versions": {
"World": [3610, 3867, 4123, 4124] "World": [3610, 3867, 4123, 4124]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS38"
}, },
{ {
"Name": "IOS 40", "Name": "IOS 40",
@@ -617,7 +560,6 @@
"World": [3072] "World": [3072]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS40",
"Danger": "Version 3072 of IOS 40 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.3K, DO NOT install version 3072, as the System Menu relies on IOS 40." "Danger": "Version 3072 of IOS 40 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.3K, DO NOT install version 3072, as the System Menu relies on IOS 40."
}, },
{ {
@@ -626,8 +568,7 @@
"Versions": { "Versions": {
"World": [2835, 3091, 3348, 3606, 3607] "World": [2835, 3091, 3348, 3606, 3607]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS41"
}, },
{ {
"Name": "IOS 43", "Name": "IOS 43",
@@ -635,8 +576,7 @@
"Versions": { "Versions": {
"World": [2835, 3091, 3348, 3606, 3607] "World": [2835, 3091, 3348, 3606, 3607]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS43"
}, },
{ {
"Name": "IOS 45", "Name": "IOS 45",
@@ -644,8 +584,7 @@
"Versions": { "Versions": {
"World": [2835, 3091, 3348, 3606, 3607] "World": [2835, 3091, 3348, 3606, 3607]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS45"
}, },
{ {
"Name": "IOS 46", "Name": "IOS 46",
@@ -653,8 +592,7 @@
"Versions": { "Versions": {
"World": [2837, 3093, 3350, 3606, 3607] "World": [2837, 3093, 3350, 3606, 3607]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS46"
}, },
{ {
"Name": "IOS 48", "Name": "IOS 48",
@@ -662,8 +600,7 @@
"Versions": { "Versions": {
"World": [4123, 4124] "World": [4123, 4124]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS48"
}, },
{ {
"Name": "IOS 50", "Name": "IOS 50",
@@ -672,7 +609,6 @@
"World": [4889, 5120] "World": [4889, 5120]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS50",
"Danger": "Version 5120 of IOS 50 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.3K, DO NOT install version 5120, as the System Menu relies on IOS 50." "Danger": "Version 5120 of IOS 50 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.3K, DO NOT install version 5120, as the System Menu relies on IOS 50."
}, },
{ {
@@ -682,7 +618,6 @@
"World": [4633, 4864] "World": [4633, 4864]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS51",
"Danger": "Version 4864 of IOS 51 is a stub, and no longer offers any functionality. It cannot be used to run any code." "Danger": "Version 4864 of IOS 51 is a stub, and no longer offers any functionality. It cannot be used to run any code."
}, },
{ {
@@ -692,7 +627,6 @@
"World": [5661, 5888] "World": [5661, 5888]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS52",
"Danger": "Version 5888 of IOS 50 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.5, DO NOT install version 5888, as the System Menu relies on IOS 50." "Danger": "Version 5888 of IOS 50 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 3.5, DO NOT install version 5888, as the System Menu relies on IOS 50."
}, },
{ {
@@ -701,8 +635,7 @@
"Versions": { "Versions": {
"World": [4113, 5149, 5406, 5662, 5663] "World": [4113, 5149, 5406, 5662, 5663]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS53"
}, },
{ {
"Name": "IOS 55", "Name": "IOS 55",
@@ -710,8 +643,7 @@
"Versions": { "Versions": {
"World": [4633, 5149, 5406, 5662, 5663] "World": [4633, 5149, 5406, 5662, 5663]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS55"
}, },
{ {
"Name": "IOS 56", "Name": "IOS 56",
@@ -719,8 +651,7 @@
"Versions": { "Versions": {
"World": [4890, 5405, 5661, 5662] "World": [4890, 5405, 5661, 5662]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS56"
}, },
{ {
"Name": "IOS 57", "Name": "IOS 57",
@@ -728,8 +659,7 @@
"Versions": { "Versions": {
"World": [5404, 5661, 5918, 5919] "World": [5404, 5661, 5918, 5919]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS57"
}, },
{ {
"Name": "IOS 58", "Name": "IOS 58",
@@ -737,8 +667,7 @@
"Versions": { "Versions": {
"World": [6175, 6176] "World": [6175, 6176]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS58"
}, },
{ {
"Name": "IOS 59", "Name": "IOS 59",
@@ -746,8 +675,7 @@
"Versions": { "Versions": {
"World": [8737, 9249] "World": [8737, 9249]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS59"
}, },
{ {
"Name": "IOS 60", "Name": "IOS 60",
@@ -756,7 +684,6 @@
"World": [6174, 6400] "World": [6174, 6400]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS60",
"Danger": "Version 6400 of IOS 60 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 4.0 or 4.1, DO NOT install version 6400, as the System Menu relies on IOS 60." "Danger": "Version 6400 of IOS 60 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 4.0 or 4.1, DO NOT install version 6400, as the System Menu relies on IOS 60."
}, },
{ {
@@ -765,8 +692,7 @@
"Versions": { "Versions": {
"World": [4890, 5405, 5661, 5662] "World": [4890, 5405, 5661, 5662]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS61"
}, },
{ {
"Name": "IOS 62", "Name": "IOS 62",
@@ -774,8 +700,7 @@
"Versions": { "Versions": {
"World": [6430] "World": [6430]
}, },
"Ticket": true, "Ticket": true
"Archive Name": "IOS62"
}, },
{ {
"Name": "IOS 70", "Name": "IOS 70",
@@ -784,7 +709,6 @@
"World": [6687,6912] "World": [6687,6912]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS70",
"Danger": "Version 6912 of IOS 70 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 4.2, DO NOT install version 6912, as the System Menu relies on IOS 70." "Danger": "Version 6912 of IOS 70 is a stub, and no longer offers any functionality. It cannot be used to run any code. If you're using System Menu 4.2, DO NOT install version 6912, as the System Menu relies on IOS 70."
}, },
{ {
@@ -794,7 +718,6 @@
"World": [6943, 6944] "World": [6943, 6944]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS80",
"Danger": "IOS 80 is the IOS that the final System Menu, 4.3, relies on, and is required to load the System Menu. Do not modify or remove this IOS unless you have BootMii installed as boot2 to recover from a brick." "Danger": "IOS 80 is the IOS that the final System Menu, 4.3, relies on, and is required to load the System Menu. Do not modify or remove this IOS unless you have BootMii installed as boot2 to recover from a brick."
}, },
{ {
@@ -804,7 +727,6 @@
"World": [65280] "World": [65280]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS222",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code." "Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
}, },
{ {
@@ -814,7 +736,6 @@
"World": [65280] "World": [65280]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS223",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code." "Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
}, },
{ {
@@ -824,7 +745,6 @@
"World": [65280] "World": [65280]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS249",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code." "Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
}, },
{ {
@@ -834,7 +754,6 @@
"World": [65280] "World": [65280]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS250",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code." "Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
}, },
{ {
@@ -844,7 +763,6 @@
"World": [2, 3, 260, 65280] "World": [2, 3, 260, 65280]
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "IOS254",
"Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code." "Danger": "This IOS is a stub, and offers no functionality. It cannot be used to run any code."
} }
], ],

View File

@@ -13,7 +13,6 @@ class TitleData:
# Class to store all data for a Title. # Class to store all data for a Title.
tid: str tid: str
name: str name: str
archive_name: str
version: str version: str
ticket: bool ticket: bool
region: str region: str

View File

@@ -2,8 +2,10 @@
# Copyright 2024-2025 NinjaCheetah # Copyright 2024-2025 NinjaCheetah
import pathlib import pathlib
from typing import List, Tuple
from .tkey import find_tkey
import libWiiPy import libWiiPy
from libWiiPy.title.ticket import _TitleLimit
def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_wad_chkbox: bool, keep_enc_chkbox: bool, def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_wad_chkbox: bool, keep_enc_chkbox: bool,
@@ -51,6 +53,7 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
# Write out the TMD to a file. # Write out the TMD to a file.
version_dir.joinpath(f"tmd.{title_version}").write_bytes(title.tmd.dump()) version_dir.joinpath(f"tmd.{title_version}").write_bytes(title.tmd.dump())
# Use a local ticket, if one exists and "use local files" is enabled. # Use a local ticket, if one exists and "use local files" is enabled.
forge_ticket = False
if use_local_chkbox and version_dir.joinpath("tik").exists(): if use_local_chkbox and version_dir.joinpath("tik").exists():
progress_callback.emit(" - Parsing local copy of Ticket...") progress_callback.emit(" - Parsing local copy of Ticket...")
title.load_ticket(version_dir.joinpath("tik").read_bytes()) title.load_ticket(version_dir.joinpath("tik").read_bytes())
@@ -60,11 +63,10 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
title.load_ticket(libWiiPy.title.download_ticket(tid, wiiu_endpoint=wiiu_nus_enabled)) title.load_ticket(libWiiPy.title.download_ticket(tid, wiiu_endpoint=wiiu_nus_enabled))
version_dir.joinpath("tik").write_bytes(title.ticket.dump()) version_dir.joinpath("tik").write_bytes(title.ticket.dump())
except ValueError: except ValueError:
# If libWiiPy returns an error, then no ticket is available. Log this, and disable options requiring a # If libWiiPy returns an error, then no ticket is available. Try to forge a ticket after we download the
# ticket so that they aren't attempted later. # content.
progress_callback.emit(" - No Ticket is available!") progress_callback.emit(" - No Ticket is available! Will try forging a Ticket.")
pack_wad_enabled = False forge_ticket = True
decrypt_contents_enabled = False
# Load the content records from the TMD, and begin iterating over the records. # Load the content records from the TMD, and begin iterating over the records.
title.load_content_records() title.load_content_records()
content_list = [] content_list = []
@@ -86,6 +88,39 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
if keep_enc_chkbox is True: if keep_enc_chkbox is True:
version_dir.joinpath(content_file_name).write_bytes(content_list[content]) version_dir.joinpath(content_file_name).write_bytes(content_list[content])
title.content.content_list = content_list title.content.content_list = content_list
# Try to forge a Ticket, if a common one wasn't available.
if forge_ticket is True:
progress_callback.emit(" - Attempting to forge Ticket...")
try:
title_key = find_tkey(tid, title.content.content_list[0], title.tmd.content_records[0])
title_key_enc = libWiiPy.title.encrypt_title_key(title_key, 0, tid)
ticket = libWiiPy.title.Ticket()
ticket.common_key_index = 0
ticket.console_id = 0
ticket.content_access_permissions = b'\xff' * 64
ticket.ecdh_data = b'\x00' * 60
ticket.permit_mask = b'\x00' * 4
ticket.permitted_titles = b'\x00' * 4
ticket.signature = b'\x00' * 256
ticket.signature_issuer = "Root-CA00000001-XS00000003" + ("\x00" * 38)
ticket.signature_type = b'\x00\x01' * 2
ticket.ticket_id = b'\x00' * 8
ticket.ticket_version = 0
ticket.title_export_allowed = 0
ticket.title_id = tid.encode()
ticket.title_key_enc = title_key_enc
ticket.title_limits_list = [_TitleLimit(0, 0) for _ in range(0, 8)]
ticket.title_version = 0
ticket.unknown1 = b'\xff' * 2
ticket.unknown2 = b'\x00' * 48
ticket.fakesign()
title.ticket = ticket
version_dir.joinpath("tik").write_bytes(title.ticket.dump())
progress_callback.emit(" - Successfully forged Ticket!")
except Exception:
progress_callback.emit(" - Ticket could not be forged!")
pack_wad_enabled = False
decrypt_contents_enabled = False
# If decrypt local contents is still true, decrypt each content and write out the decrypted file. # If decrypt local contents is still true, decrypt each content and write out the decrypted file.
if decrypt_contents_enabled is True: if decrypt_contents_enabled is True:
try: try:

53
modules/tkey.py Normal file
View File

@@ -0,0 +1,53 @@
# "tkey-gen.py", licensed under the MIT license
# Copyright 2024 NinjaCheetah
import binascii
import hashlib
import libWiiPy
from libWiiPy.types import _ContentRecord
def _secret(start, length):
ret = b''
add = start + length
for _ in range(length):
unsigned_start = start & 0xFF # Compensates for how Python handles negative values vs PHP.
ret += bytes.fromhex(f"{unsigned_start:02x}"[-2:])
nxt = start + add
add = start
start = nxt
return ret
def _mungetid(tid):
# Remove leading zeroes from the TID.
while tid.startswith("00"):
tid = tid[2:]
if tid == "":
tid = "00"
# In PHP, the last character just gets dropped if you make a hex string from an odd-length input, so this
# replicates that functionality.
if len(tid) % 2 != 0:
tid = tid[:-1]
return bytes.fromhex(tid)
def _derive_key(tid, passwd):
key_secret = _secret(-3, 10)
salt = hashlib.md5(key_secret + _mungetid(tid)).digest()
# Had to reduce the length here from 32 to 16 when converting to get the same length keys.
return hashlib.pbkdf2_hmac("sha1", passwd.encode(), salt, 20, 16).hex()
def find_tkey(tid: str, banner_enc: bytes, content_record: _ContentRecord) -> bytes:
# Find a working Title Key by generating a key with a password, then decrypting content 0 and comparing it to the
# expected hash. If the hash matches, then we generated the correct key.
passwds = ["nintendo", "mypass"]
for passwd in passwds:
key = binascii.unhexlify(_derive_key(tid, passwd).encode())
banner_dec = libWiiPy.title.decrypt_content(banner_enc, key, content_record.index, content_record.content_size)
banner_dec_hash = hashlib.sha1(banner_dec).hexdigest()
content_record_hash = content_record.content_hash.decode()
if banner_dec_hash == content_record_hash:
return key
raise Exception("Valid Title Key could not be generated")

View File

@@ -60,10 +60,8 @@ class NUSGetTreeModel(QAbstractItemModel):
tid_item.add_child(region_item) tid_item.add_child(region_item)
for version in version_list: for version in version_list:
danger = entry.get("Danger") if entry.get("Danger") is not None else "" danger = entry.get("Danger") if entry.get("Danger") is not None else ""
archive_name = (entry.get("Archive Name") if entry.get("Archive Name") is not None metadata = TitleData(entry.get("TID"), entry.get("Name"), version,
else entry.get("Name").replace(" ", "-")) entry.get("Ticket"), region, key, danger)
metadata = TitleData(entry.get("TID"), entry.get("Name"), archive_name,
version, entry.get("Ticket"), region, key, danger)
public_versions = entry.get("Public Versions") public_versions = entry.get("Public Versions")
if public_versions is not None: if public_versions is not None:
try: try:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 41 KiB