Pubblicato un nuovo aggiornamento per Stroopwafel, un framework e firmware personalizzato per console Wii U, successore di iosuhax e basato su SaltyNX, che introduce nuove funzionalità per la gestione avanzata del sistema operativo IOSU.
Stroopwafel è progettato per patchare il kernel IOSU e i suoi moduli, offrendo funzionalità avanzate rispetto a iosuhax. Funziona reindirizzando l’esecuzione del codice al componente principale wafel_core invece del reset handler standard a 0xFFFF0000
.
Dopo aver applicato le patch necessarie, wafel_core salta a 0xFFFF0000
per avviare il sistema. I plugin di Stroopwafel utilizzano la memoria alla fine del ramdisk da 128 MiB a 0x20000000
e sono mappati su tutti i moduli IOS per consentire patch di codice e sostituzioni di funzioni.
I plugin sono PIE (Position Independent Executable) e si auto-ricollocano all’avvio, con possibilità di risolvere simboli da altri plugin.
Funzionalità principali
Stroopwafel include tutte le funzionalità di iosuhax (come redNAND, wupserver, ecc..) e aggiunge le seguenti caratteristiche:
- Supporto per de_Fuse: Reindirizza le letture OTP alla RAM, richiede minute_minute per applicare i dati.
- Caricamento di fw.img decrittato in IOSU.
- Ricaricamenti IOSU attraverso minute per semplificare le patch.
- Disabilitazione delle scritture su SEEPROM per maggiore sicurezza.
- redNAND MLC acceleration: sposta la cache MLC (SCFM) su SLCCMPT per migliorare le prestazioni.
- Semihosting hooks: stampa kprintf e syslog su seriale pico de_Fuse.
- Disabilitazione del disco senza scrittura su SEEPROM.
- USB_SHRINKSHIFT: consente di avere sia il filesystem Wii U che un filesystem normale su un dispositivo USB, spostando la porzione Wii U dopo l’MBR.
- USB_SEED_SWAP: sovrascrive la chiave USB SEEPROM per semplificare la migrazione del sistema.
- Funzionalità sperimentali: caricamento di kernel.img da scheda SD (non stabile).
Avvertenze
- La formattazione redNAND di Stroopwafel è incompatibile con altre implementazioni; utilizzare minute per formattare.
- Mantenere USB_SHRINKSHIFT a 0 se si utilizza dispositivi USB esistenti.
- L’opzione PRINT_FSAOPEN è utile ma estremamente lenta.
- Testato solo su firmware 5.5.x (fw.img); non è stato portato su versioni precedenti.
- L’uso errato delle patch può causare il brick della console; leggere attentamente le istruzioni.
Utilizzo dei plugin
I plugin consentono di applicare patch aggiuntive a IOSU. Per utilizzarli:
- Posizionare il plugin compilato (es.
00core.ipx
) accanto awafel_core.ipx
nella directory sd:/wiiu/ios_plugins
o/storage_slc/sys/hax/ios_plugins
. - All’avvio, minute caricherà automaticamente i plugin.
- Ogni plugin può implementare due hook:
void kern_main()
: eseguito in modalità kernel prima di tutto il resto.void mcp_main()
: eseguito prima del thread principale di MCP; può generare nuovi thread.
- Entrambe le funzioni devono terminare (return), ma
mcp_main()
può avviare thread aggiuntivi. - Un esempio di plugin è disponibile in
wafel_plugin_example
.
Patch di IOSU con Stroopwafel
Stroopwafel fornisce macro definite in wafel/patch.h
per applicare patch a IOSU:
U32_PATCH_K(_addr, _val)
: Sovrascrive un indirizzo virtuale con un valore a 32 bit.ASM_PATCH_K(_addr, _str)
: Applica codice assembly specificato come stringa, assemblato al momento della compilazione e copiato in runtime all’indirizzo specificato (non supporta riferimenti relativi esterni).ASM_T_PATCH_K(_addr, _str)
: Come sopra, ma per codice Thumb.BL_TRAMPOLINE_K(_addr, _dst)
: Genera un’istruzione BL relativa all’indirizzo specificato; non può saltare al codice del plugin (distanza eccessiva).BL_T_TRAMPOLINE_K(_addr, _dst)
: Come sopra, ma per Thumb.BRANCH_PATCH_K(_addr, _dst)
: Genera un’istruzione B relativa; non può saltare al codice del plugin.
Hook di IOSU con Trampolini
Stroopwafel offre funzioni in wafel/trampoline.h
per agganciare codice C o assembly a IOSU:
trampoline_hook_before(uintptr_t addr, void *target)
: Crea un trampolino con un’istruzione BL per chiamare la funzione specificata, preservando i registri. Non supporta istruzioni con indirizzamento relativo al PC, tranne BL, che salta al target originale.trampoline_t_hook_before(uintptr_t addr, void *target)
: Come sopra, ma per Thumb; sovrascrive due istruzioni (perché BL occupa 4 byte).trampoline_blreplace(uintptr_t addr, void *target)
: Sostituisce una chiamata BL. La nuova funzione riceve i primi quattro argomenti (r0-r3), un puntatore al target originale e il LR salvato, seguiti dagli argomenti sullo stack.trampoline_t_blreplace(uintptr_t addr, void *target)
: Come sopra, ma per Thumb.trampoline_blreplace_with_regs(uintptr_t addr, void *target)
: Simile atrampoline_blreplace
, ma salva anche i registri r4-r12 per usarli come argomenti.trampoline_t_blreplace_with_regs(uintptr_t addr, void *target)
: Come sopra, ma per Thumb, salva r4-r7.
I trampolini supportano hook multipli sullo stesso indirizzo. Con blreplace
, la funzione sostitutiva deve chiamare quella originale tramite il puntatore fornito per non interrompere la catena. Un esempio di trampolini è disponibile in wafel_trampoline_demo/source/main.c
.
Configurazione di USB_SHRINKSHIFT
Per utilizzare la funzionalità USB_SHRINKSHIFT (che consente di avere sia il filesystem Wii U che un filesystem normale sullo stesso dispositivo USB):
- Formattare il dispositivo USB con una partizione FAT32 come prima partizione.
- Creare una seconda partizione NTFS per il filesystem Wii U.
- Assicuratevi che USB_SHRINKSHIFT sia abilitato (impostato a 1) nel file di configurazione (
ios_process/source/config.h
). - Collegare il dispositivo USB alla Wii U; la porzione Wii U sarà spostata dopo l’MBR per compatibilità.
Changelog
- Corretto il problema del gamepad che non si spegneva durante lo spegnimento della modalità vWii.
- Aggiunti trampoline per NSEC e BSP.
- Aggiunta un’opzione per consentire ai plugin di sovrascrivere haidev.
Download: Stroopwafel v1.3 (00core.ipx)
Download: Stroopwafel v1.3 (5debug.ipx)
Download: Source code Stroopwafel v1.3
Fonte: github.com