1
0
Fork 0
mirror of https://github.com/Scandal-UK/Incognito_RCM.git synced 2024-12-22 18:32:03 +00:00

update readme and add screenshots

This commit is contained in:
jimzrt 2019-10-06 21:05:50 +02:00
parent c62341b117
commit 8afd9a8693
8 changed files with 80 additions and 59 deletions

View file

@ -1,12 +1,13 @@
Incognito_RCM
=
Incognito_RCM is a bare metal Nintendo Switch payload that derives encryption keys for de- and encrypting PRODINFO partition (sysnand and emummc) and wiping personal information from your Nintendo Switch as to go online while worrying slightly less about a ban.
It has a builtin backup and restore functionality.
It is heavily based on [Lockpick_RCM](https://github.com/shchmue/Lockpick_RCM) and takes inspiration from [incognito](https://github.com/blawar/incognito).
Massive Thanks to CTCaer, shchmue and blawar!
This project is in early stage, so have a nand backup!! There is not much of error handling going on.
This project is in early stage, so have a nand backup!!
Usage
=
@ -15,7 +16,16 @@ Usage
* Choose either Incognito (sysNAND) or Incognito (emuMMC) to wipe personal information
* If you ever want to revert, choose restore menu points
Keep in mind that backups will be overwritten, so don't backup after applying Incognito!
Screenshots
=
Main | Incognito
:-------------------------:|:-------------------------:
![](/res/main.png) | ![](/res/incognito.png)
Backup | Restore
:-------------------------:|:-------------------------:
![](/res/backup.png) | ![](/res/restore.png)
Building
=

BIN
res/backup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
res/incognito.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
res/main.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
res/restore.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View file

@ -600,7 +600,7 @@ u8 *gfx_bmp_screenshot(u32 *size)
bih.planes = 1;
bih.bit_count = 24;
bih.compression = 0;
bih.image_size = file_size;
bih.image_size = 0;
bih.ppm_x = ppm;
bih.ppm_y = ppm;
bih.clr_used = 0;

View file

@ -273,7 +273,17 @@ bool dump_keys()
se_aes_key_set(8, bis_key[0] + 0x00, 0x10);
se_aes_key_set(9, bis_key[0] + 0x10, 0x10);
gfx_printf("%kGot keys!\n", COLOR_GREEN);
gfx_printf("%kGot keys!\n%kValidate...", COLOR_GREEN,COLOR_YELLOW);
const char magic[4] = "CAL0";
char buffer[4];
readData((u8 *)buffer, 0, 4, NULL);
if(memcmp(magic, buffer, 4) == 0){
gfx_printf("%kOK!\n", COLOR_GREEN);
} else {
gfx_printf("%kError!\n", COLOR_RED);
return false;
}
char serial[15];
readData((u8 *)serial, 0x250, 15, NULL);
@ -294,7 +304,7 @@ bool erase(u32 offset, u32 length)
bool writeSerial()
{
const char *junkSerial;
if (!emu_cfg.enabled || h_cfg.emummc_force_disable)
if (isSysNAND())
{
junkSerial = "XAW00000000000";
}
@ -311,7 +321,7 @@ bool incognito()
gfx_printf("%kChecking if backup exists...\n", COLOR_YELLOW);
if (!checkBackupExists())
{
gfx_printf("%kI'm sorry Dave, I'm afraid I can't do that...\n%kWill make a backup first...\n", COLOR_RED, COLOR_YELLOW);
gfx_printf("%kI'm sorry Dave, I'm afraid I can't do that..\n%kWill make a backup first...\n", COLOR_RED, COLOR_YELLOW);
if (!backupProdinfo())
return false;
}
@ -357,7 +367,7 @@ bool incognito()
return false;
gfx_printf("\n%kIncognito done!\n\n", COLOR_GREEN);
gfx_printf("\n%kIncognito done!\n", COLOR_GREEN);
return true;
}
@ -396,7 +406,6 @@ static inline u32 _read_le_u32(const void *buffer, u32 offset)
bool readData(u8 *buffer, u32 offset, u32 length, void (*progress_callback)(u32, u32))
{
if (progress_callback != NULL)
{
(*progress_callback)(0, length);
@ -583,26 +592,22 @@ out:
return result;
}
void test()
void screenshot(const char *filename)
{
// u32 size = 262144;
// gfx_printf("%kTest reading %d bytes\n", COLOR_ORANGE, size);
// u8 *buffer = (u8 *)malloc(NX_EMMC_BLOCKSIZE);
// u8* bigBuffer = (u8 *)malloc(size);
// u32 offset = 0;
// readData(bigBuffer, 0, size, ENCRYPTED);
// while(size > NX_EMMC_BLOCKSIZE){
// readData(buffer, offset, NX_EMMC_BLOCKSIZE, ENCRYPTED);
// if(memcmp(buffer, bigBuffer + offset, NX_EMMC_BLOCKSIZE) != 0){
// gfx_printf("arry mismatch on offset %d", offset);
sd_mount();
// }
// size -= NX_EMMC_BLOCKSIZE;
// offset += NX_EMMC_BLOCKSIZE;
// }
// free(buffer);
// free(bigBuffer);
// gfx_printf("%Reading Done!\n", COLOR_ORANGE, size);
FIL fp;
if (f_open(&fp, filename, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
{
gfx_printf("\n%kCannot write image!\n", COLOR_RED);
return;
}
u32 size;
u8 *buffer = gfx_bmp_screenshot(&size);
f_write(&fp, buffer, size, NULL);
f_close(&fp);
free(buffer);
}
bool verifyHash(u32 hashOffset, u32 offset, u32 sz)
@ -670,7 +675,6 @@ bool verifyClientCertHash()
bool verifyProdinfo()
{
gfx_printf("%kVerifying client cert hash and CAL0 hash...\n", COLOR_YELLOW);
if (verifyClientCertHash() && verifyCal0Hash())
@ -712,38 +716,43 @@ void print_progress(u32 count, u32 max)
gfx_con.y = cur_y;
}
bool getLastBackup()
// bool getLastBackup()
// {
// DIR dir;
// //char* path = "sd:/incognito";
// char path[255];
// strcpy(path, "sd:/incognito");
// FILINFO fno;
// FRESULT res;
// res = f_opendir(&dir, path); /* Open the directory */
// if (res == FR_OK)
// {
// for (;;)
// {
// res = f_readdir(&dir, &fno); /* Read a directory item */
// if (res != FR_OK || fno.fname[0] == 0)
// break; /* Break on error or end of dir */
// if ((fno.fattrib & AM_DIR) == 0)
// { /* It is not a directory */
// gfx_printf("%s/%s\n", path, fno.fname);
// }
// }
// f_closedir(&dir);
// }
// return res;
// }
bool isSysNAND()
{
DIR dir;
//char* path = "sd:/incognito";
char path[255];
strcpy(path, "sd:/incognito");
FILINFO fno;
FRESULT res;
res = f_opendir(&dir, path); /* Open the directory */
if (res == FR_OK)
{
for (;;)
{
res = f_readdir(&dir, &fno); /* Read a directory item */
if (res != FR_OK || fno.fname[0] == 0)
break; /* Break on error or end of dir */
if ((fno.fattrib & AM_DIR) == 0)
{ /* It is not a directory */
gfx_printf("%s/%s\n", path, fno.fname);
}
}
f_closedir(&dir);
}
return res;
return (!emu_cfg.enabled || h_cfg.emummc_force_disable);
}
bool checkBackupExists()
{
char *name;
if (!emu_cfg.enabled || h_cfg.emummc_force_disable)
if (isSysNAND())
{
name = BACKUP_NAME_SYSNAND;
}
@ -758,7 +767,7 @@ bool backupProdinfo()
{
bool result = false;
char *name;
if (!emu_cfg.enabled || h_cfg.emummc_force_disable)
if (isSysNAND())
{
name = BACKUP_NAME_SYSNAND;
}
@ -779,7 +788,7 @@ bool backupProdinfo()
filenameSuffix++;
} while (f_stat(newName, NULL) == FR_OK);
f_rename(name, newName);
gfx_printf("%kOld backup renamed to %s\n", COLOR_YELLOW, newName);
gfx_printf("%kOld backup renamed to:\n%s\n", COLOR_YELLOW, newName);
}
FIL fp;
@ -806,7 +815,7 @@ bool backupProdinfo()
f_sync(&fp);
result = true;
gfx_printf("\n%kBackup to %s done!\n\n", COLOR_GREEN, name);
gfx_printf("\n%kBackup to %s done!\n", COLOR_GREEN, name);
out:
f_close(&fp);
@ -821,7 +830,7 @@ bool restoreProdinfo()
sd_mount();
char *name;
if (!emu_cfg.enabled || h_cfg.emummc_force_disable)
if (isSysNAND())
{
name = BACKUP_NAME_SYSNAND;
}
@ -829,7 +838,7 @@ bool restoreProdinfo()
{
name = BACKUP_NAME_EMUNAND;
}
gfx_printf("%kRestoring from %s...\n", COLOR_YELLOW, name);
FIL fp;

View file

@ -19,10 +19,12 @@
#include "../utils/types.h"
//testing
void test();
void screenshot(const char* suffix);
//testing
bool isSysNAND();
bool dump_keys();
bool incognito();
void cleanUp();