Stroopwafel rappresenta l’evoluzione di iosuhax, basandosi sul codice di SALT iosuhax ma introducendo una serie di funzionalità avanzate e miglioramenti significativi per gli sviluppatori Wii U. Questo progetto open source offre un potente framework per la modifica e l’estensione delle funzionalità dell’IOSU, il sistema operativo che gestisce l’hardware della Wii U.
Caratteristiche Principali
Funzionalità Avanzate Integrate
-
de_Fuse support: Reindirizza tutte le letture OTP alla RAM, richiedendo minute_minute per l’inserimento dei dati
-
Caricamento di fw.img decriptato in IOSU
-
IOSU reloads gestiti tramite minute per semplificare il patching
-
Disabilitazione scritture SEEPROM (per maggiore sicurezza)
-
Accelerazione redNAND MLC: Sposta la cache MLC (SCFM) a SLCCMPT
-
Semihosting hooks: Invia kprintf e syslogs alla seriale pico de_Fuse
-
Disabilitazione disk drive (senza scrittura SEEPROM)
-
USB_SHRINKSHIFT: Permette di avere sia il filesystem Wii U che un filesystem normale sullo stesso drive, spostando la parte Wii U dopo l’MBR
-
USB_SEED_SWAP: Sostituisce la chiave USB SEEPROM per facilitare la migrazione del sistema
Funzionalità Sperimentali
-
Caricamento di kernel.img da sdcard (instabile)
Avvertenze Importanti
⚠️ Il formato redNAND è incompatibile con altre implementazioni! Usare minute per formattare.
⚠️ Se avete drive USB esistenti, mantenere USB_SHRINKSHIFT impostato a 0
⚠️ PRINT_FSAOPEN è utile ma estremamente lento
⚠️ Testato solo su fw.imgs 5.5.x, non portato per versioni precedenti
Compilazione e Installazione
Per compilare Stroopwafel:
# Necessario per i plugin export STROOPWAFEL_ROOT=$(pwd) # wafel_core make 00core.ipx # esempio plugin make -C wafel_plugin_example
Sistema di Plugin
Stroopwafel introduce un potente sistema di plugin che permette di aggiungere patch personalizzate all’IOSU. Un plugin compilato può essere posizionato accanto a wafel_core.ipx e verrà caricato da minute.
I plugin offrono due hook principali:
-
void kern_main()
– eseguito prima di tutto in modalità kernel -
void mcp_main()
– eseguito prima del thread principale di MCP sotto MCP
Un esempio di struttura plugin è disponibile in wafel_plugin_example
.
Patching dell’IOSU
Stroopwafel fornisce diverse macro per applicare patch all’IOSU tramite plugin (definite in wafel/patch.h
):
-
U32_PATCH_K(_addr, _val)
: Sovrascrive l’indirizzo virtuale con un valore a 32bit -
ASM_PATCH_K(_addr, _str)
: Inserisce codice assembly all’indirizzo specificato -
ASM_T_PATCH_K(_addr, _str)
: Come sopra ma per codice Thumb -
BL_TRAMPOLINE_K(_addr, _dst)
: Genera un branch relativo BL -
Varianti Thumb e altre opzioni avanzate
Hooking con Trampoline
Stroopwafel offre due metodi avanzati per hooking nell’IOSU:
-
Hook Before: Crea un trampoline che chiama la tua funzione prima di eseguire l’istruzione originale
-
BL Replace: Sostituisce una chiamata BL esistente con la tua funzione
Sono disponibili varianti per codice ARM e Thumb, con diverse opzioni per la gestione dei registri.
Dettagli Tecnici
Stroopwafel opera in modo simile a SaltyNX: invece di saltare all’handler di reset a 0xFFFF0000, reindirizza l’esecuzione a wafel_core, che si occupa di patching del kernel IOS, moduli e segmenti prima di passare il controllo.
I plugin sono mappati su tutti i moduli IOS per permettere patching e sostituzione di funzioni. wafel_core fornisce API di base per patching e ricerca di simboli.
Aggiornamenti Recenti (v1.3)
-
Risolto problema con gamepad che non si spegneva durante lo shutdown del vWii
-
Aggiunti trampoline per NSEC e BSP
-
Opzione per i plugin di sovrascrivere haidev
Per il download e ulteriori informazioni: GitHub StroopwafelCFW
Stroopwafel rappresenta uno strumento potente per la comunità di sviluppo Wii U, offrendo flessibilità e controllo senza precedenti sull’IOSU. Con la sua architettura modulare e il sistema di plugin, apre nuove possibilità per la sperimentazione e lo sviluppo di funzionalità avanzate.