mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-22 11:56:42 +00:00
Implement broken™️ firmware dumping
This commit is contained in:
parent
9281e4bbbc
commit
d4eb56a35f
7 changed files with 118 additions and 31 deletions
|
@ -91,7 +91,7 @@ int launch_payload(char *path, bool update){
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dump_biskeys(u8 bis_key[4][32]){
|
int dump_biskeys(u8 bis_key[4][32]){
|
||||||
u8 temp_key[0x10], device_key[0x10] = {0};
|
u8 temp_key[0x10], device_key[0x10] = {0};
|
||||||
tsec_ctxt_t tsec_ctxt;
|
tsec_ctxt_t tsec_ctxt;
|
||||||
|
|
||||||
|
@ -106,7 +106,7 @@ void dump_biskeys(u8 bis_key[4][32]){
|
||||||
const pkg1_id_t *pkg1_id = pkg1_identify(pkg1);
|
const pkg1_id_t *pkg1_id = pkg1_identify(pkg1);
|
||||||
if (!pkg1_id) {
|
if (!pkg1_id) {
|
||||||
EPRINTF("Unknown pkg1 version.");
|
EPRINTF("Unknown pkg1 version.");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool found_tsec_fw = false;
|
bool found_tsec_fw = false;
|
||||||
|
@ -119,7 +119,7 @@ void dump_biskeys(u8 bis_key[4][32]){
|
||||||
}
|
}
|
||||||
if (!found_tsec_fw) {
|
if (!found_tsec_fw) {
|
||||||
EPRINTF("Failed to locate TSEC firmware.");
|
EPRINTF("Failed to locate TSEC firmware.");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 tsec_keys[0x10] = {0};
|
u8 tsec_keys[0x10] = {0};
|
||||||
|
@ -150,7 +150,7 @@ void dump_biskeys(u8 bis_key[4][32]){
|
||||||
|
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
gfx_printf("ERROR %x dumping TSEC.\n", res);
|
gfx_printf("ERROR %x dumping TSEC.\n", res);
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 sbk[4] = {FUSE(FUSE_PRIVATE_KEY0), FUSE(FUSE_PRIVATE_KEY1),
|
u32 sbk[4] = {FUSE(FUSE_PRIVATE_KEY0), FUSE(FUSE_PRIVATE_KEY1),
|
||||||
|
@ -209,15 +209,15 @@ void dump_biskeys(u8 bis_key[4][32]){
|
||||||
system_part = nx_emmc_part_find(&gpt, "SYSTEM");
|
system_part = nx_emmc_part_find(&gpt, "SYSTEM");
|
||||||
if (!system_part) {
|
if (!system_part) {
|
||||||
gfx_printf("Failed to locate SYSTEM partition.");
|
gfx_printf("Failed to locate SYSTEM partition.");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__ ((aligned (16))) FATFS emmc_fs;
|
__attribute__ ((aligned (16))) FATFS emmc_fs;
|
||||||
if (f_mount(&emmc_fs, "emmc:", 1)) {
|
if (f_mount(&emmc_fs, "emmc:", 1)) {
|
||||||
gfx_printf("Mount failed.");
|
gfx_printf("Mount failed.");
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
return;
|
return pkg1_id->kb;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _generate_kek(u32 ks, const void *key_source, void *master_key, const void *kek_seed, const void *key_seed) {
|
static void _generate_kek(u32 ks, const void *key_source, void *master_key, const void *kek_seed, const void *key_seed) {
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "../utils/types.h"
|
#include "../utils/types.h"
|
||||||
|
|
||||||
int launch_payload(char *path, int update);
|
int launch_payload(char *path, int update);
|
||||||
void dump_biskeys(u8 bis_key[4][32]);
|
int dump_biskeys(u8 bis_key[4][32]);
|
||||||
|
|
||||||
static const u8 zeros[0x10] = {0};
|
static const u8 zeros[0x10] = {0};
|
||||||
|
|
||||||
|
|
|
@ -7,21 +7,19 @@
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "mainfunctions.h"
|
#include "mainfunctions.h"
|
||||||
#include "../libs/fatfs/ff.h"
|
#include "../libs/fatfs/ff.h"
|
||||||
#include "../storage/sdmmc.h"
|
|
||||||
#include "../utils/util.h"
|
#include "../utils/util.h"
|
||||||
#include "../sec/se.h"
|
|
||||||
#include "graphics.h"
|
#include "graphics.h"
|
||||||
#include "external_utils.h"
|
#include "external_utils.h"
|
||||||
|
|
||||||
extern bool sd_mount();
|
extern bool sd_mount();
|
||||||
extern void sd_unmount();
|
extern void sd_unmount();
|
||||||
|
|
||||||
static u8 bis_keys[4][0x20];
|
static u32 bis_keys[4][8];
|
||||||
|
|
||||||
void meme_main(){
|
void meme_main(){
|
||||||
utils_gfx_init();
|
utils_gfx_init();
|
||||||
//dump_keys();
|
//dump_keys();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
sdmmc_storage_t storage;
|
sdmmc_storage_t storage;
|
||||||
sdmmc_t sdmmc;
|
sdmmc_t sdmmc;
|
||||||
|
@ -29,7 +27,8 @@ void meme_main(){
|
||||||
sdmmc_storage_init_mmc(&storage, &sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, 4);
|
sdmmc_storage_init_mmc(&storage, &sdmmc, SDMMC_4, SDMMC_BUS_WIDTH_8, 4);
|
||||||
sdmmc_storage_set_mmc_partition(&storage, 1); */
|
sdmmc_storage_set_mmc_partition(&storage, 1); */
|
||||||
|
|
||||||
dump_biskeys(bis_keys); // add succeed check
|
int firmver = -1;
|
||||||
|
firmver = dump_biskeys(bis_keys); // add succeed check
|
||||||
|
|
||||||
char *options[6];
|
char *options[6];
|
||||||
char *itemsinfolder[1000];
|
char *itemsinfolder[1000];
|
||||||
|
@ -77,8 +76,8 @@ void meme_main(){
|
||||||
meme_clearscreen();
|
meme_clearscreen();
|
||||||
addchartoarray("Back", options, 0);
|
addchartoarray("Back", options, 0);
|
||||||
addchartoarray("\nPrint BISKEYS", options, 1);
|
addchartoarray("\nPrint BISKEYS", options, 1);
|
||||||
if (!sd_mounted) addchartoarray("Mount SD", options, 2);
|
addchartoarray("Dump firmware", options, 2);
|
||||||
ret = gfx_menulist(32, options, 2);
|
ret = gfx_menulist(32, options, 3);
|
||||||
switch(ret){
|
switch(ret){
|
||||||
case 2:
|
case 2:
|
||||||
meme_clearscreen();
|
meme_clearscreen();
|
||||||
|
@ -90,6 +89,10 @@ void meme_main(){
|
||||||
gfx_hexdump(0, bis_keys[2], 0x20 * sizeof(u8));
|
gfx_hexdump(0, bis_keys[2], 0x20 * sizeof(u8));
|
||||||
btn_wait();
|
btn_wait();
|
||||||
break;
|
break;
|
||||||
|
case 3:
|
||||||
|
ret = messagebox("\nThis will dump your firmware to your sd!\nThis might take a while\n\nVol-/+ to cancel\nPower to continue...");
|
||||||
|
if (ret == 0) wtf(itemsinfolder, muhbits);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include "../gfx/di.h"
|
#include "../gfx/di.h"
|
||||||
#include "../gfx/gfx.h"
|
#include "../gfx/gfx.h"
|
||||||
#include "../utils/btn.h"
|
#include "../utils/btn.h"
|
||||||
|
@ -68,12 +69,81 @@ int _openfilemenu(char *path, char *clipboardpath){
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dumpfirmware(char *items[], unsigned int *muhbits){
|
||||||
|
DIR dir;
|
||||||
|
FILINFO fno;
|
||||||
|
char path[28] = "emmc:/Contents/registered";
|
||||||
|
char sdpath[28] = "sd:/tegraexplorer/firmware";
|
||||||
|
char tempnand[100] = "";
|
||||||
|
char tempsd[100] = "";
|
||||||
|
int ret = 0, i = 0, foldersize = 0;
|
||||||
|
|
||||||
|
meme_clearscreen();
|
||||||
|
gfx_printf("\nStarting copy of firmware\n\n");
|
||||||
|
|
||||||
|
f_mkdir("sd:/tegraexplorer");
|
||||||
|
f_mkdir("sd:/tegraexplorer/firmware");
|
||||||
|
|
||||||
|
readfolder(items, muhbits, path);
|
||||||
|
|
||||||
|
if (f_opendir(&dir, path)) {
|
||||||
|
messagebox("Failed to open directory!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!f_readdir(&dir, &fno) && fno.fname[0]){
|
||||||
|
addchartoarray(fno.fname, items, foldersize);
|
||||||
|
mallocandaddfolderbit(muhbits, foldersize, fno.fattrib & AM_DIR);
|
||||||
|
foldersize++;
|
||||||
|
}
|
||||||
|
|
||||||
|
f_closedir(&dir);
|
||||||
|
|
||||||
|
for (i = 0; i <= foldersize; i++){
|
||||||
|
if (muhbits[i] & AM_DIR){
|
||||||
|
sprintf(tempnand, "%s/%s", path, items[i]);
|
||||||
|
if(f_opendir(&dir, tempnand)){
|
||||||
|
messagebox("Failure opening folder");
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
sprintf(tempnand, "%s/%s/00", path, items[i]);
|
||||||
|
sprintf(tempsd, "%s/%s", sdpath, items[i]);
|
||||||
|
//messagebox(tempnand);
|
||||||
|
//dumptosd(tempnand);
|
||||||
|
//btn_wait();
|
||||||
|
//messagebox(tempsd);
|
||||||
|
ret = copy(tempnand, tempsd, 0);
|
||||||
|
if (ret != 0) {
|
||||||
|
messagebox("Copy failed! (infolder)");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
f_closedir(&dir);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sprintf(tempnand, "%s/%s", path, items[i]);
|
||||||
|
sprintf(tempsd, "%s/%s", sdpath, items[i]);
|
||||||
|
ret = copy(tempnand, tempsd, 0);
|
||||||
|
if (ret != 0) {
|
||||||
|
messagebox("Copy failed! (infile)");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gfx_printf("Copied %d / %d nca files\r", i + 1, foldersize + 1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void wtf(char *items[], unsigned int *muhbits){
|
||||||
|
dumpfirmware(items, muhbits); // DOESNT WORK
|
||||||
|
}
|
||||||
|
|
||||||
void sdexplorer(char *items[], unsigned int *muhbits, char *rootpath){
|
void sdexplorer(char *items[], unsigned int *muhbits, char *rootpath){
|
||||||
|
//dumpfirmware(items, muhbits); // WORKS ?!?!?!?!
|
||||||
int value = 1;
|
int value = 1;
|
||||||
int copymode = -1;
|
int copymode = -1;
|
||||||
int folderamount = 0;
|
int folderamount = 0;
|
||||||
char path[PATHSIZE] = "";
|
char path[PATHSIZE] = "";
|
||||||
char clipboard[PATHSIZE] = "";
|
static char clipboard[PATHSIZE + 1] = "";
|
||||||
strcpy(path, rootpath);
|
strcpy(path, rootpath);
|
||||||
char app[20], rpp[20];
|
char app[20], rpp[20];
|
||||||
int temp = -1;
|
int temp = -1;
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void sdexplorer(char *items[], unsigned int *muhbits, char *rootpath);
|
void sdexplorer(char *items[], unsigned int *muhbits, char *rootpath);
|
||||||
|
int dumpfirmware(char *items[], unsigned int *muhbits);
|
||||||
|
void wtf(char *items[], unsigned int *muhbits);
|
|
@ -9,6 +9,7 @@
|
||||||
#include "../libs/fatfs/ff.h"
|
#include "../libs/fatfs/ff.h"
|
||||||
#include "../storage/sdmmc.h"
|
#include "../storage/sdmmc.h"
|
||||||
#include "graphics.h"
|
#include "graphics.h"
|
||||||
|
#include "external_utils.h"
|
||||||
|
|
||||||
void utils_gfx_init(){
|
void utils_gfx_init(){
|
||||||
display_backlight_brightness(100, 1000);
|
display_backlight_brightness(100, 1000);
|
||||||
|
@ -40,7 +41,7 @@ int dumptosd(const char *path){
|
||||||
sprintf(pathname, "%s%s", "sd:/tegraexplorer/nanddump", foldername);
|
sprintf(pathname, "%s%s", "sd:/tegraexplorer/nanddump", foldername);
|
||||||
f_mkdir(pathname);
|
f_mkdir(pathname);
|
||||||
sprintf(pathname, "%s%s%s%s", "sd:/tegraexplorer/nanddump", foldername, "/", fno.fname);
|
sprintf(pathname, "%s%s%s%s", "sd:/tegraexplorer/nanddump", foldername, "/", fno.fname);
|
||||||
res = copy(path, pathname);
|
res = copy(path, pathname, 1);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,7 +91,7 @@ void addchartoarray(char *add, char *items[], int spot){
|
||||||
strlcpy(items[spot], add, size);
|
strlcpy(items[spot], add, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _mallocandaddfolderbit(unsigned int *muhbits, int spot, bool value){
|
void mallocandaddfolderbit(unsigned int *muhbits, int spot, bool value){
|
||||||
muhbits[spot] = (unsigned int) malloc (sizeof(int));
|
muhbits[spot] = (unsigned int) malloc (sizeof(int));
|
||||||
if (value) muhbits[spot] |= (OPTION1);
|
if (value) muhbits[spot] |= (OPTION1);
|
||||||
//ff.h line 368
|
//ff.h line 368
|
||||||
|
@ -102,8 +103,8 @@ int readfolder(char *items[], unsigned int *muhbits, const char *path){
|
||||||
int i = 2;
|
int i = 2;
|
||||||
addchartoarray("Current folder -> One folder up", items, 0);
|
addchartoarray("Current folder -> One folder up", items, 0);
|
||||||
addchartoarray("Clipboard -> Current folder", items, 1);
|
addchartoarray("Clipboard -> Current folder", items, 1);
|
||||||
_mallocandaddfolderbit(muhbits, 0, true);
|
mallocandaddfolderbit(muhbits, 0, true);
|
||||||
_mallocandaddfolderbit(muhbits, 1, true);
|
mallocandaddfolderbit(muhbits, 1, true);
|
||||||
|
|
||||||
|
|
||||||
if (f_opendir(&dir, path)) {
|
if (f_opendir(&dir, path)) {
|
||||||
|
@ -113,7 +114,7 @@ int readfolder(char *items[], unsigned int *muhbits, const char *path){
|
||||||
else {
|
else {
|
||||||
while (!f_readdir(&dir, &fno) && fno.fname[0]){
|
while (!f_readdir(&dir, &fno) && fno.fname[0]){
|
||||||
addchartoarray(fno.fname, items, i);
|
addchartoarray(fno.fname, items, i);
|
||||||
_mallocandaddfolderbit(muhbits, i, fno.fattrib & AM_DIR);
|
mallocandaddfolderbit(muhbits, i, fno.fattrib & AM_DIR);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,15 +122,21 @@ int readfolder(char *items[], unsigned int *muhbits, const char *path){
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
int copy(const char *src, const char *dst){
|
int copy(const char *src, const char *dst, int print){
|
||||||
FIL in;
|
FIL in;
|
||||||
FIL out;
|
FIL out;
|
||||||
|
unsigned int res = 0;
|
||||||
|
char temp[100];
|
||||||
if (strcmp(src, dst) == 0){
|
if (strcmp(src, dst) == 0){
|
||||||
//in and out are the same, aborting!
|
//in and out are the same, aborting!
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
if (f_open(&in, src, FA_READ) != FR_OK){
|
res = f_open(&in, src, FA_READ | FA_OPEN_EXISTING);
|
||||||
|
if (res != FR_OK){
|
||||||
//something has gone wrong
|
//something has gone wrong
|
||||||
|
//sprintf(temp, "%s %d", src, res);
|
||||||
|
//messagebox(temp);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (f_open(&out, dst, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK){
|
if (f_open(&out, dst, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK){
|
||||||
|
@ -143,8 +150,10 @@ int copy(const char *src, const char *dst){
|
||||||
void *buff = malloc(BUFFSIZ);
|
void *buff = malloc(BUFFSIZ);
|
||||||
int mbwritten = 0, percentage = 0;
|
int mbwritten = 0, percentage = 0;
|
||||||
bool abort = false;
|
bool abort = false;
|
||||||
meme_clearscreen();
|
if (print == 1) {
|
||||||
gfx_printf("press VOL- to abort the file transfer!\n\n");
|
meme_clearscreen();
|
||||||
|
gfx_printf("press VOL- to abort the file transfer!\n\n");
|
||||||
|
}
|
||||||
while(size > BUFFSIZ){
|
while(size > BUFFSIZ){
|
||||||
int res1, res2;
|
int res1, res2;
|
||||||
res1 = f_read(&in, buff, BUFFSIZ, NULL);
|
res1 = f_read(&in, buff, BUFFSIZ, NULL);
|
||||||
|
@ -154,9 +163,11 @@ int copy(const char *src, const char *dst){
|
||||||
mbwritten = kbwritten / 1024;
|
mbwritten = kbwritten / 1024;
|
||||||
percentage = (mbwritten * 100) / ((totalsize / 1024) / 1024);
|
percentage = (mbwritten * 100) / ((totalsize / 1024) / 1024);
|
||||||
|
|
||||||
gfx_printf("Written %dMB [%k%d%k%%]\r", mbwritten, COLOR_GREEN, percentage, COLOR_WHITE);
|
|
||||||
size = size - BUFFSIZ;
|
size = size - BUFFSIZ;
|
||||||
if (btn_read() & BTN_VOL_DOWN) size = 0, abort = true;
|
if (print == 1){
|
||||||
|
gfx_printf("Written %dMB [%k%d%k%%]\r", mbwritten, COLOR_GREEN, percentage, COLOR_WHITE);
|
||||||
|
if (btn_read() & BTN_VOL_DOWN) size = 0, abort = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(size != 0){
|
if(size != 0){
|
||||||
|
@ -184,7 +195,7 @@ int copywithpath(const char *src, const char *dstpath, int mode, char *app){
|
||||||
if (strcmp(dstpath, app) != 0) strcat(dst, "/");
|
if (strcmp(dstpath, app) != 0) strcat(dst, "/");
|
||||||
strcat(dst, fno.fname);
|
strcat(dst, fno.fname);
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
if (mode == 0) ret = copy(src, dst);
|
if (mode == 0) ret = copy(src, dst, 1);
|
||||||
if (mode == 1) f_rename(src, dst);
|
if (mode == 1) f_rename(src, dst);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
|
@ -11,9 +11,10 @@ void utils_gfx_init();
|
||||||
void removepartpath(char *path, char *root);
|
void removepartpath(char *path, char *root);
|
||||||
void addpartpath(char *path, char *add, char *root);
|
void addpartpath(char *path, char *add, char *root);
|
||||||
int readfolder(char *items[], unsigned int *muhbits, const char *path);
|
int readfolder(char *items[], unsigned int *muhbits, const char *path);
|
||||||
int copy(const char *src, const char *dst);
|
int copy(const char *src, const char *dst, int print);
|
||||||
void addchartoarray(char *add, char *items[], int spot);
|
void addchartoarray(char *add, char *items[], int spot);
|
||||||
int copywithpath(const char *src, const char *dstpath, int mode, char *app);
|
int copywithpath(const char *src, const char *dstpath, int mode, char *app);
|
||||||
void return_readable_byte_amounts(unsigned long int size, char *in);
|
void return_readable_byte_amounts(unsigned long int size, char *in);
|
||||||
int getfilesize(const char *path);
|
int getfilesize(const char *path);
|
||||||
int dumptosd(const char *path);
|
int dumptosd(const char *path);
|
||||||
|
void mallocandaddfolderbit(unsigned int *muhbits, int spot, bool value);
|
Loading…
Reference in a new issue