Hacking [Release] rxTools - Roxas75 3DS Toolkit [fw 2.0 - 9.2]

Status
Not open for further replies.

JoelLouviere

Well-Known Member
Newcomer
Joined
Apr 22, 2012
Messages
71
Trophies
0
XP
209
No. 9.9 long since patched arm9 exploits needed to launch rxTools. So you can't launch rxTools from Ninjhax on 9.9. 2.0 or not. It's not a matter of it being blocked by Ninjhax.

Instead, it's because the exploits that rxTools needs to boot has long been patched. What ever homebrew access you get in Ninjhax 2.0 is all you'll have for the foreseeable future.
Huh, I was mostly wondering if it was ninjhax's fault or rxTools'. That clears things up nicely, but I guess I'll have to wait for someone to get some new arm9 exploits out, whenever that might be (if it ever even happens)
 

VerseHell

Well-Known Member
Member
Joined
Jun 29, 2014
Messages
3,073
Trophies
1
Age
30
XP
1,672
Country
France
Alright! Time for rxTools 3.0b7!

Added: 6.x MSET Downgrade features from downgrade menu
Added: 6.x MSET Downgrade options to msetdg.py
Added: 6.x-modified rxinstaller.nds by @Apache Thunder

Enjoy!

Download: https://anonfiles.com/file/993ca626533f4fa4cb34db434b6438b4

Modified source:

Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-

from urllib2 import urlopen, URLError, HTTPError
import platform
import os

try:
    fileName = "msetdg.bin";
    tid = [0x00020000, 0x00020000, 0x00021000, 0x00021000, 0x00022000, 0x00022000, 0x00027000, 0x00027000, 0x00026000, 0x00028000] #JPN 4/6, USA 4/6, EUR 4/6, KOR 4/5, CHN 4, TWN 4
    tver = [0x1A, 0x22, 0x1F, 0x2D, 0x19, 0x23,  0x04, 0x08, 0x06, 0x05]
    choice = 0
    while choice not in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10):
        os.system('cls') if platform.system() == "Windows" else os.system('clear')
        print "Select your 3DS region :\n\n    [1] JPN (4.x MSET)\n    [2] JPN (6.x MSET)\n\n    [3] USA (4.x MSET)\n    [4] USA (6.x MSET)\n\n    [5] EUR (4.x MSET)\n    [6] EUR (6.x MSET)\n\n    [7] KOR (4.x MSET)\n    [8] KOR (5.x MSET)\n\n    [9] CHN (4.x MSET)\n\n   [10] TWN (4.x MSET)\n"
        choice = int(raw_input("Selection : "))
    url="http://nus.cdn.c.shop.nintendowifi.net/ccs/download/00040010%08X/%08X"%(tid[choice-1], tver[choice-1])
    print "Downloading MSET from the CDN..."
    f = urlopen(url)
    with open(fileName, "wb") as lf:
        lf.write(f.read())
    print "Downloaded!"
except HTTPError, e:
    print "HTTP Error:", e.code, url
except URLError, e:
    print "URL Error:", e.reason, url

Code:
#include "downgradeapp.h"
#include "common.h"
#include "screenshot.h"
#include "fs.h"
#include "ff.h"
#include "console.h"
#include "draw.h"
#include "hid.h"
#include "ncch.h"
#include "crypto.h"
#include "TitleKeyDecrypt.h"
#include "NandDumper.h"
#include "aes.h"
#include "polarssl/sha2.h"
#include "stdio.h"
#include "filepack.h"

#define bswap_16(a) ((((a) << 8) & 0xff00) | (((a) >> 8) & 0xff))
#define bswap_32(a) ((((a) << 24) & 0xff000000) | (((a) << 8) & 0xff0000) | (((a) >> 8) & 0xff00) | (((a) >> 24) & 0xff))

typedef struct {
    unsigned int id;
    unsigned short index;
    unsigned short type;
    unsigned int size;
    unsigned char signature[0x20];
} tmd_chunk_struct;

unsigned char region = 0;
char *regions[6] = { "Japan", "USA", "Europe", "China", "Korea", "Taiwan" };

char tmpstr[256];
FILINFO curInfo;
DIR myDir;

char cntpath[256]; // Contains the NAND content path
char tmdpath[256]; // Contains the NAND TMD path

char* getContentAppPath(){
    return (char*)&cntpath;
}

char* getTMDAppPath(){
    return (char*)&tmdpath;
}

void print_sha256(unsigned char hash[32])
{
    int i;
    for (i = 0; i < 32; i++)
    {
        print("%02X", hash[i]);
     
        if (i == 16)
        {
            /* Continue printing the SHA-256 sum in a new line after 34 characters (17 bytes) */
            print("\n"); ConsoleShow();
        }
    }
 
    ConsoleShow();
}

int FindApp(unsigned int tid_low, unsigned int tid_high, int drive)
{
    char *folder = (char*)&tmpstr;
    memset(folder, 0, 256);
 
    DIR* curDir = &myDir;
    memset((unsigned char*)curDir, 0, sizeof(DIR));
 
    FILINFO *myInfo = &curInfo;
    memset((unsigned char*)myInfo, 0, sizeof(FILINFO));
    myInfo->fname[0] = 'A';
 
    sprintf(folder, "%d:title/%08x/%08x/content", drive, tid_low, tid_high);
 
    if (f_opendir(curDir, folder) != FR_OK) return 0;
 
    char path[256];
    unsigned short latest_ver = 0, cur_ver = 0;
    bool is_v0 = false;
 
    for (int i = 0; myInfo->fname[0] != 0; i++)
    {
        if (f_readdir(curDir, myInfo)) break;
        if (myInfo->fname[0] == '.') continue;
     
        if (strstr(myInfo->fname, ".tmd") || strstr(myInfo->fname, ".TMD"))
        {
            memset(&path, 0, 256);
            sprintf(path, "%s/%s", folder, myInfo->fname);
         
            File tmp;
            if (!FileOpen(&tmp, path, 0)) continue;
         
            unsigned int size = FileGetSize(&tmp);
            if (size < 0xB34)
            {
                FileClose(&tmp);
                continue;
            }
         
            /* Get the TMD version */
            /* There can be some instances in which more than one TMD/content file is available */
            /* Of course, we want to use the latest one */
            if (FileRead(&tmp, &cur_ver, 2, 0x1DC) != 2)
            {
                FileClose(&tmp);
                continue;
            }
         
            /* Change Endianness */
            cur_ver = bswap_16(cur_ver);
         
            /* Verify the version number */
            if ((latest_ver == 0 && !is_v0) || cur_ver > latest_ver)
            {
                tmd_chunk_struct tmd_entry;
                memset(&tmd_entry, 0xFF, 0x30);
             
                int cont = 0;
                unsigned int b_read = 0;
                while (tmd_entry.index != 0)
                {
                    cont++;
                    b_read = FileRead(&tmp, &tmd_entry, 0x30, size - (cont * 0x30));
                    if (b_read != 0x30) break;
                }
             
                FileClose(&tmp);
             
                if (b_read != 0x30) continue;
             
                memset(&path, 0, 256);
                sprintf(path, "%s/%08x.app", folder, bswap_32(tmd_entry.id)); // Change Endianness
             
                if (FileOpen(&tmp, path, 0))
                {
                    FileClose(&tmp);
                    latest_ver = cur_ver;
                    if (cur_ver == 0) is_v0 = true;
                 
                    /* Save TMD and content paths */
                    sprintf(tmdpath, "%s/%s", folder, myInfo->fname);
                    sprintf(cntpath, "%s/%08x.app", folder, bswap_32(tmd_entry.id));
                }
            } else {
                FileClose(&tmp);
            }
        } else {
            continue;
        }
    }
 
    f_closedir(curDir);
    if (latest_ver == 0 && !is_v0) return 0;
    return 1;
}

int CheckRegion(int drive)
{
    File secureinfo;
    print("Opening SecureInfo_A... "); ConsoleShow();
    sprintf(tmpstr, "%d:rw/sys/SecureInfo_A", drive);
    if (!FileOpen(&secureinfo, tmpstr, 0))
    {
        print("Error.\nTrying with SecureInfo_B... "); ConsoleShow();
        memset(&tmpstr, 0, 256);
        sprintf(tmpstr, "%d:rw/sys/SecureInfo_B", drive);
        if (!FileOpen(&secureinfo, tmpstr, 0))
        {
            print("Error.\nProcess failed!\n"); ConsoleShow();
            return -1;
        }
    }
 
    print("OK!\n"); ConsoleShow();
    FileRead(&secureinfo, &region, 1, 0x100);
    FileClose(&secureinfo);
 
    if (region > 0x06)
    {
        print("Error: unsupported region.\nProcess failed!\n"); ConsoleShow();
        return -1;
    } else {
        /* Avoid problems with the unused "AUS" region code */
        if (region >= 3) region--;
        print("Region: %s\n", regions[region]); ConsoleShow();
    }
 
    return 0;
}

int CheckRegionSilent(int drive)
{
    File secureinfo;
    sprintf(tmpstr, "%d:rw/sys/SecureInfo_A", drive);
    if (!FileOpen(&secureinfo, tmpstr, 0))
    {
        memset(&tmpstr, 0, 256);
        sprintf(tmpstr, "%d:rw/sys/SecureInfo_B", drive);
        if (!FileOpen(&secureinfo, tmpstr, 0))
        {
            print("Error.\nProcess failed!\n"); ConsoleShow();
            return -1;
        }
    }
 
    FileRead(&secureinfo, &region, 1, 0x100);
    FileClose(&secureinfo);
 
    if (region > 0x06)
    {
        print("Error: unsupported region.\nProcess failed!\n"); ConsoleShow();
        return -1;
    } else {
        /* Avoid problems with the unused "AUS" region code */
        if (region >= 3) region--;
    }
 
    return 0;
}

int checkDgFile(char* path, unsigned int hash)
{
    unsigned char* buf = (unsigned char*)0x21000000;
    unsigned int rb, fixedsize = 0x00400000;

    File fp;
    if (FileOpen(&fp, path, 0))
    {
        rb = FileRead(&fp, buf, fixedsize, 0);
        FileClose(&fp);
        if (!CheckHash(buf, rb, hash)) return 0;
    } else {
        return 0;
    }

    return 1;
}

void downgradeMSET()
{
    File dg;
    char *dgpath = "0:msetdg.bin";
    unsigned int titleid_low = 0x00040010;
    unsigned int titleid_high[6] = { 0x00020000, 0x00021000, 0x00022000, 0x00026000, 0x00027000, 0x00028000 }; //JPN, USA, EUR, CHN, KOR, TWN
    unsigned int mset_hash[10] = { 0x96AEC379, 0xED315608, 0x3387F2CD, 0xEDAC05D7, 0xACC1BE62, 0xF0FF9F08, 0x565BCF20, 0xA04654C6, 0xAFD07166, 0xD40B12F4 }; //JPN, USA, EUR, CHN, KOR, TWN
    unsigned short mset_ver[10] = { 3074, 5127, 3078, 5128, 3075, 5127, 8, 1026, 2049, 8 };
    unsigned short mset_dg_ver = 0;

    ConsoleInit();
    ConsoleSetTitle("         MSET DOWNGRADER");

    int checkLoop = 0;

    CheckRegionSilent(SYS_NAND);

    print("What would you like to\nDowngrade to?\n\n"); ConsoleShow();
    print("[A] 4.x MSET\n[B] 5.x/6.x MSET\n"); ConsoleShow();

    InputWait();

    while( checkLoop < 1 )
    {
        InputWait();

        char buttonInput = GetInput();

        if (buttonInput == 1)
        {
            if (region == 0)
            {
                mset_dg_ver = 0;
            }
            else if (region == 1)
            {
                mset_dg_ver = 2;
            }
            else if (region == 2)
            {
                mset_dg_ver = 4;
            }
            else if (region == 3)
            {
                mset_dg_ver = 6;
            }
            else if (region == 4)
            {
                mset_dg_ver = 7;
            }
            else if (region == 5)
            {
                mset_dg_ver = 9;
            }
            else
            {
                print("region is:  %u\n", region); ConsoleShow();
                print("Unsupported Region!\n"); ConsoleShow();
                mset_dg_ver = 0;
            }
            checkLoop = 1;
        }
        else if (buttonInput == 2)
        {
            if (region == 0)
            {
                mset_dg_ver = 1;
            }
            else if (region == 1)
            {
                mset_dg_ver = 3;
            }
            else if (region == 2)
            {
                mset_dg_ver = 5;
            }
            else if (region == 3)
            {
                mset_dg_ver = 6;
                print("CHN Region Detected!\nFalling back to 4.x MSET\n"); ConsoleShow();
            }
            else if (region == 4)
            {
                mset_dg_ver = 8;
            }
            else if (region == 5)
            {
                mset_dg_ver = 9;
                print("TWN Region Detected!\nFalling back to 4.x MSET\n"); ConsoleShow();
            }
            else
            {
                print("Unsupported Region!\n"); ConsoleShow();
                mset_dg_ver = 0;
            }
            checkLoop = 1;
        }

        buttonInput = '\0';
    }

    print("Opening MSET app...\n"); ConsoleShow();
 
    if (CheckRegion(SYS_NAND) == 0)
    {
        if (FindApp(titleid_low, titleid_high[region], SYS_NAND)) // SysNAND only
        {
            if (FileOpen(&dg, tmdpath, 0))
            {
                /* Get the MSET TMD version */
                unsigned short tmd_ver;
                FileRead(&dg, &tmd_ver, 2, 0x1DC);
                tmd_ver = bswap_16(tmd_ver);
                FileClose(&dg);
             
                /* Verify version number */
                if (tmd_ver > mset_ver[mset_dg_ver])
                {
                    /* Open MSET content file */
                    if (FileOpen(&dg, cntpath, 0))
                    {
                        unsigned int check_val;
                        FileRead(&dg, &check_val, 4, 0x130);
                        FileClose(&dg);
                     
                        if (check_val != 0)
                        {
                            if (checkDgFile(dgpath, mset_hash[mset_dg_ver]))
                            {
                                print("Opening downgrade pack... "); ConsoleShow();
                                if (FileOpen(&dg, dgpath, 0))
                                {
                                    print("OK!\n"); ConsoleShow();
                                 
                                    unsigned int dgsize = FileGetSize(&dg);
                                    unsigned char *buf = (unsigned char*)0x21000000;
                                    FileRead(&dg, buf, dgsize, 0);
                                 
                                    /* Downgrade pack decryption */
                                    u8 iv[0x10] = {0};
                                    u8 Key[0x10] = {0};
                                 
                                    GetTitleKey(&Key[0], titleid_low, titleid_high[region], SYS_NAND);
                                 
                                    aes_context aes_ctxt;
                                    aes_setkey_dec(&aes_ctxt, Key, 0x80);
                                    aes_crypt_cbc(&aes_ctxt, AES_DECRYPT, dgsize, iv, buf, buf);
                                 
                                    FileWrite(&dg, buf, dgsize, 0);
                                    FileClose(&dg);
                                 
                                    if (*((unsigned int*)(buf + 0x100)) == 0x4843434E) // "NCCH" magic word
                                    {
                                        print("Downgrading... "); ConsoleShow();
                                        if (FSFileCopy(cntpath, dgpath) == 0)
                                        {
                                            print("done!\nRemoving downgrade pack... "); ConsoleShow();
                                            f_unlink(dgpath);
                                            print("done.\n"); ConsoleShow();
                                        } else {
                                            print("\nError downgrading MSET content.\nRemoving downgrade pack... "); ConsoleShow();
                                            f_unlink(dgpath);
                                            print("done.\n"); ConsoleShow();
                                        }
                                    } else {
                                        print("Error: bad downgrade pack.\n"); ConsoleShow();
                                    }
                                } else {
                                    print("Error.\n"); ConsoleShow();
                                }
                            } else {
                                print("Error: bad downgrade pack.\n"); ConsoleShow();
                            }
                        } else {
                            print("Your MSET version is exploitable.\nDowngrade isn't necessary.\n"); ConsoleShow();
                        }
                    } else {
                        print("Error opening MSET content file.\n"); ConsoleShow();
                    }
                } else {
                    print("Your MSET version is exploitable.\nDowngrade isn't necessary.\n"); ConsoleShow();
                }
            } else {
                print("Error opening MSET TMD.\n"); ConsoleShow();
            }
        } else {
            print("Error: couldn't find MSET data.\n"); ConsoleShow();
        }
    }
 
    print("\nPress A to exit\n");
    ConsoleShow();
    WaitForButton(BUTTON_A);
}

void manageFBI(bool restore)
{
    int drive;
    unsigned int titleid_low = 0x00040010;
    unsigned int titleid_high[6] = { 0x00020300, 0x00021300, 0x00022300, 0x00026300, 0x00027300, 0x00028300 }; //JPN, USA, EUR, CHN, KOR, TWN
    char *backup_path = "rxTools/h&s_backup";
 
    File tmp;
    char path[256] = {0};
    char path2[256] = {0};
    unsigned char *buf = (unsigned char *)0x21000000;
 
    unsigned int size;
    unsigned short tmd_ver;
    unsigned int sd_cntsize;
    unsigned short sd_tmd_ver;
 
    unsigned char TmdCntInfoRecSum[32] = {0};
    unsigned char CntInfoRecSum[32] = {0};
    unsigned char TmdCntChnkRecSum[32] = {0};
    unsigned char CntChnkRecSum[32] = {0};
    unsigned char TmdCntDataSum[32] = {0};
    unsigned char CntDataSum[32] = {0};
 
    if ((drive = NandSwitch()) == UNK_NAND) return;
 
    ConsoleInit();
    ConsoleSetTitle(restore ? "     RESTORE HEALTH & SAFETY" : "         FBI INSTALLATION");
 
    if (CheckRegion(drive) == 0)
    {
        if (FindApp(titleid_low, titleid_high[region], drive))
        {
            /* Open the NAND H&S TMD */
            FileOpen(&tmp, tmdpath, 0);
            FileRead(&tmp, buf, 0xB34, 0);
            FileClose(&tmp);
         
            /* Get the title version from the TMD */
            tmd_ver = (unsigned short)((buf[0x1DC] << 8) | buf[0x1DD]);
            print("TMD Version: v%u.\n", tmd_ver);
         
            if (!restore)
            {
                /* Get the stored content size from the TMD */
                unsigned int cntsize = (unsigned int)((buf[0xB10] << 24) | (buf[0xB11] << 16) | (buf[0xB12] << 8) | buf[0xB13]);
             
                /* Open the NAND H&S content file and read it to the memory buffer */
                FileOpen(&tmp, cntpath, 0);
                FileRead(&tmp, buf + 0x1000, cntsize, 0);
                FileClose(&tmp);
             
                /* Create the Health & Safety data backup directory */
                f_mkdir(backup_path);
             
                memset(&tmpstr, 0, 256);
                sprintf(tmpstr, "%s/%s", backup_path, regions[region]);
                f_mkdir(tmpstr);
             
                memset(&tmpstr, 0, 256);
                sprintf(tmpstr, "%s/%s/v%u", backup_path, regions[region], tmd_ver);
                f_mkdir(tmpstr);
             
                /* Backup the H&S TMD */
                sprintf(path, "0:%s/%.12s", tmpstr, tmdpath+34);
                if (FileOpen(&tmp, path, 1))
                {
                    size = FileWrite(&tmp, buf, 0xB34, 0);
                    FileClose(&tmp);
                    if (size == 0xB34)
                    {
                        print("NAND H&S TMD backup created.\n"); ConsoleShow();
                     
                        /* Backup the H&S content file */
                        memset(&path, 0, 256);
                        sprintf(path, "0:%s/%.12s", tmpstr, cntpath+34);
                        if (FileOpen(&tmp, path, 1))
                        {
                            size = FileWrite(&tmp, buf + 0x1000, cntsize, 0);
                            FileClose(&tmp);
                            if (size == cntsize)
                            {
                                print("NAND H&S content backup created.\n"); ConsoleShow();
                            } else {
                                print("Error writing H&S content backup.\n"); ConsoleShow();
                                goto out;
                            }
                        } else {
                            print("Error creating H&S content backup.\n"); ConsoleShow();
                            goto out;
                        }
                    } else {
                        print("Error writing H&S TMD backup.\n"); ConsoleShow();
                        goto out;
                    }
                } else {
                    print("Error creating H&S TMD backup.\n"); ConsoleShow();
                    goto out;
                }
             
                /* Generate the FBI data paths */
                sprintf(path, "0:fbi_inject.tmd");
                sprintf(path2, "0:fbi_inject.app");
             
                print("Editing H&S Information... "); ConsoleShow();
            } else {
                /* Generate the H&S backup data paths */
                memset(&tmpstr, 0, 256);
                sprintf(tmpstr, "%s/%s/v%u", backup_path, regions[region], tmd_ver);
                sprintf(path, "0:%s/%.12s", tmpstr, tmdpath+34);
                sprintf(path2, "0:%s/%.12s", tmpstr, cntpath+34);
             
                print("Restoring H&S Information... "); ConsoleShow();
            }
         
            /* Open the SD TMD */
            if (FileOpen(&tmp, path, 0))
            {
                size = FileGetSize(&tmp);
                if (size == 0xB34)
                {
                    FileRead(&tmp, buf, 0xB34, 0);
                    FileClose(&tmp);
                 
                    /* Get the SD TMD version and stored content size */
                    sd_tmd_ver = (unsigned short)((buf[0x1DC] << 8) | buf[0x1DD]);
                    sd_cntsize = (unsigned int)((buf[0xB10] << 24) | (buf[0xB11] << 16) | (buf[0xB12] << 8) | buf[0xB13]);
                 
                    if (sd_tmd_ver == tmd_ver)
                    {
                        /* Get the SHA-256 hashes */
                        memcpy(TmdCntInfoRecSum, buf + 0x1E4, 32);
                        memcpy(TmdCntChnkRecSum, buf + 0x208, 32);
                        memcpy(TmdCntDataSum, buf + 0xB14, 32);
                     
                        /* Verify the Content Info Record hash */
                        sha2(buf + 0x204, 0x900, CntInfoRecSum, 0);
                        if (memcmp(CntInfoRecSum, TmdCntInfoRecSum, 32) == 0)
                        {
                            /* Verify the Content Chunk Record hash */
                            sha2(buf + 0xB04, 0x30, CntChnkRecSum, 0);
                            if (memcmp(CntChnkRecSum, TmdCntChnkRecSum, 32) == 0)
                            {
                                /* Open the SD content file */
                                if (FileOpen(&tmp, path2, 0))
                                {
                                    size = FileGetSize(&tmp);
                                    if (size == sd_cntsize)
                                    {
                                        FileRead(&tmp, buf + 0x1000, sd_cntsize, 0);
                                        FileClose(&tmp);
                                     
                                        /* Verify the Content Data hash */
                                        sha2(buf + 0x1000, sd_cntsize, CntDataSum, 0);
                                        if (memcmp(CntDataSum, TmdCntDataSum, 32) == 0)
                                        {
                                            /* Now we are ready to rock 'n roll */
                                            if (FSFileCopy(tmdpath, path) == 0)
                                            {
                                                if (FSFileCopy(cntpath, path2) == 0)
                                                {
                                                    print("OK!\nDeleting %s data... ", restore ? "backup" : "FBI injection"); ConsoleShow();
                                                    f_unlink(path);
                                                    f_unlink(path2);
                                                    print("OK!\n"); ConsoleShow();
                                                } else {
                                                    print("\nError %s content file.\n", restore ? "restoring H&S" : "injecting FBI"); ConsoleShow();
                                                }
                                            } else {
                                                print("\nError %s TMD.\n", restore ? "restoring H&S" : "injecting FBI"); ConsoleShow();
                                            }
                                        } else {
                                            print("\nError: invalid Content Data hash.\nGot:\n"); ConsoleShow();
                                            print_sha256(CntDataSum);
                                            print("\nExpected:\n"); ConsoleShow();
                                            print_sha256(TmdCntDataSum);
                                        }
                                    } else {
                                        FileClose(&tmp);
                                        print("\nInvalid %s content size.\nGot: v%u / Expected: v%u\n", restore ? "backup" : "FBI", size, sd_cntsize); ConsoleShow();
                                    }
                                } else {
                                    print("\nError opening %s content.\n", restore ? "backup" : "FBI");
                                }
                            } else {
                                print("\nError: invalid Content Chunk hash.\nGot:\n"); ConsoleShow();
                                print_sha256(CntChnkRecSum);
                                print("\nExpected:\n"); ConsoleShow();
                                print_sha256(TmdCntChnkRecSum);
                            }
                        } else {
                            print("\nError: invalid Content Info hash.\nGot:\n"); ConsoleShow();
                            print_sha256(CntInfoRecSum);
                            print("\nExpected:\n"); ConsoleShow();
                            print_sha256(TmdCntInfoRecSum);
                        }
                    } else {
                        print("\nError: invalid %s TMD version.\nGot: v%u / Expected: v%u\n", restore ? "backup" : "FBI", sd_tmd_ver, tmd_ver); ConsoleShow();
                    }
                } else {
                    FileClose(&tmp);
                    print("\nError: invalid %s TMD size.\nGot: %u / Expected: %u\n", restore ? "backup" : "FBI", size, 0xB34); ConsoleShow();
                }
            } else {
                print("\nError opening %s TMD.\n", restore ? "backup" : "FBI"); ConsoleShow();
            }
        } else {
            print("Error: couldn't find H&S data.\n"); ConsoleShow();
        }
    }
 
out:
    print("\nPress A to exit.");
    ConsoleShow();
    WaitForButton(BUTTON_A);
}

void installFBI()
{
    /* Injects FBI TMD and content file to the Health & Safety App */
    manageFBI(false);
}

void restoreHS()
{
    /* Restores original Health & Safety TMD and content file to the NAND */
    manageFBI(true);
}
Nice, but could you do something like this for the mset downgrade part
X - 4.X MSET
Y - 6.X MSET
B - Back
?
Because right now there is no back button. :/
 

OctopusRift

GBATemp's Local Octopus, Open 9am-2am. "Not Yet"
Member
Joined
Nov 19, 2014
Messages
1,460
Trophies
0
XP
947
Country
Saint Kitts and Nevis
No. 9.9 long since patched arm9 exploits needed to launch rxTools. So you can't launch rxTools from Ninjhax on 9.9. 2.0 or not. It's not a matter of it being blocked by Ninjhax.

Instead, it's because the exploits that rxTools needs to boot has long been patched. What ever homebrew access you get in Ninjhax 2.0 is all you'll have for the foreseeable future.
What benefits does 6.x over 4.x?
 

Columbo2811

Well-Known Member
Member
Joined
Jul 19, 2015
Messages
1,399
Trophies
0
XP
1,064
Country
I've downgraded my 2ds to 4.x and works fine with mset. Was unaware of soft brick if I system format. What's the safest way to upgrade it again to 6.x
Is a soft brick having to force update the console
 

PlayGameTom

Well-Known Member
Newcomer
Joined
Jul 19, 2015
Messages
58
Trophies
0
Age
24
XP
148
Country
Swaziland
Everytime I launch rxmode, it gives me a black screen, except when i formatted the SD Card, then it works once and then no more. Am I doing anything wrong? I'm playing on a 2DS, SysNAND FW is 6.0.0
 

tivu100

Well-Known Member
Member
Joined
Jun 6, 2015
Messages
2,260
Trophies
0
Age
34
XP
1,136
Country
United States
I've downgraded my 2ds to 4.x and works fine with mset. Was unaware of soft brick if I system format. What's the safest way to upgrade it again to 6.x
Is a soft brick having to force update the console
Not sure if serious. I always thought the lowest 2DS can be downgraded is 6.x? How did you downgrade to 4.x?
 

Columbo2811

Well-Known Member
Member
Joined
Jul 19, 2015
Messages
1,399
Trophies
0
XP
1,064
Country
Not sure if serious. I always thought the lowest 2DS can be downgraded is 6.x? How did you downgrade to 4.x?
I've no idea I was messing about with it for ages to get it to work. Until I tried the lastest beta release the only mset I could use was cakes which was ok for most things but I wanted rxtools mset because of using ninjhax cia on dev mode. If I remember right I used the first downgrade issued on the rxtools then used the lastest build. I just click on 4.x dg on rop installer and it works great. Can use ninjhax now without any internet and cart which now opens all the possibilities of pasta, cakes and reinand through ninjhax. As well as rxtools.

--------------------- MERGED ---------------------------

I think he means his mset, not his whole firmware.

Anyway, use this to replace your mset with the 6.X one : https://gbatemp.net/threads/release...olkit-fw-2-0-9-2.382782/page-345#post-5575120
Thanks I'll keep this until I need it, maybe just on the sd card so I'll not forget it should I do a system format or sell it. Everything's working great and don't want to mess anything up.
 

EmceeKerser

Well-Known Member
Member
Joined
Jun 3, 2014
Messages
1,374
Trophies
0
Age
34
Location
The fuckin' Blue Mountains brah
XP
658
Country
I need a hint not stricly related to RX.

I'm on FW 4.5 and I'm going to update sysnand to 9.2.0-20 EUR with sysupdater (I know how to do) and then I'll need to downgrade MSET back to 4.x version.

Is it the same if I remove the MSET CIA from the updtaes folder (so I don't nedd to downgrade MSET after FW update), or it's needed for the first configuration of the new FW?

Let me know please.
Yes
 
Status
Not open for further replies.

Site & Scene News

Popular threads in this forum

General chit-chat
Help Users
  • No one is chatting at the moment.
  • Quincy @ Quincy:
    Usually when such a big title leaks the Temp will be the first to report about it (going off of historical reports here, Pokemon SV being the latest one I can recall seeing pop up here)
  • K3Nv2 @ K3Nv2:
    I still like how a freaking mp3 file hacks webos all that security defeated by text yet again
  • BigOnYa @ BigOnYa:
    They have simulators for everything nowdays, cray cray. How about a sim that shows you playing the Switch.
  • K3Nv2 @ K3Nv2:
    That's called yuzu
    +1
  • BigOnYa @ BigOnYa:
    I want a 120hz 4k tv but crazy how more expensive the 120hz over the 60hz are. Or even more crazy is the price of 8k's.
  • K3Nv2 @ K3Nv2:
    No real point since movies are 30fps
  • BigOnYa @ BigOnYa:
    Not a big movie buff, more of a gamer tbh. And Series X is 120hz 8k ready, but yea only 120hz 4k games out right now, but thinking of in the future.
  • K3Nv2 @ K3Nv2:
    Mostly why you never see TV manufacturers going post 60hz
  • BigOnYa @ BigOnYa:
    I only watch tv when i goto bed, it puts me to sleep, and I have a nas drive filled w my fav shows so i can watch them in order, commercial free. I usually watch Married w Children, or South Park
  • K3Nv2 @ K3Nv2:
    Stremio ruined my need for nas
  • BigOnYa @ BigOnYa:
    I stream from Nas to firestick, one on every tv, and use Kodi. I'm happy w it, plays everything. (I pirate/torrent shows/movies on pc, and put on nas)
  • K3Nv2 @ K3Nv2:
    Kodi repost are still pretty popular
  • BigOnYa @ BigOnYa:
    What the hell is Kodi reposts? what do you mean, or "Wut?" -xdqwerty
  • K3Nv2 @ K3Nv2:
    Google them basically web crawlers to movie sites
  • BigOnYa @ BigOnYa:
    oh you mean the 3rd party apps on Kodi, yea i know what you mean, yea there are still a few cool ones, in fact watched the new planet of the apes movie other night w wifey thru one, was good pic surprisingly, not a cam
  • BigOnYa @ BigOnYa:
    Damn, only $2.06 and free shipping. Gotta cost more for them to ship than $2.06
    +1
  • BigOnYa @ BigOnYa:
    I got my Dad a firestick for Xmas and showed him those 3rd party sites on Kodi, he loves it, all he watches anymore. He said he has got 3 letters from AT&T already about pirating, but he says f them, let them shut my internet off (He wants out of his AT&T contract anyways)
  • K3Nv2 @ K3Nv2:
    That's where stremio comes to play never got a letter about it
  • BigOnYa @ BigOnYa:
    I just use a VPN, even give him my login and password so can use it also, and he refuses, he's funny.
  • BigOnYa @ BigOnYa:
    I had to find and get him an old style flip phone even without text, cause thats what he wanted. No text, no internet, only phone calls. Old, old school.
  • Psionic Roshambo @ Psionic Roshambo:
    @BigOnYa, Lol I bought a new USB card reader thing on AliExpress last month for I think like 87 cents. Free shipping from China... It arrived it works and honestly I don't understand how it was so cheap.
    +1
    Psionic Roshambo @ Psionic Roshambo: @BigOnYa, Lol I bought a new USB card reader thing on AliExpress last month for I think like 87... +1