Home Homebrew Rilasciato Stroopwafel v2.0: Controllo kernel avanzato con IPC e modchip de_Fuse

[Scena Wii U] Rilasciato Stroopwafel v2.0: Controllo kernel avanzato con IPC e modchip de_Fuse

79
0

Pubblicato un rapido 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.

La nuova versione 2.0, rilasciata recentemente, sfrutta appieno il modchip de_Fuse (o Pico de_Fuse), consentendo un controllo profondo sul kernel IOSU.

Stroopwafel permette di caricare direttamente firmware decriptati, accelerare il redNAND con cache ottimizzata, disabilitare il drive disco senza modifiche permanenti al SEEPROM e integrare plugin personalizzati per modificare il comportamento del sistema.

La novità più significativa della versione 2.0 è l’IPC Interface (/dev/stroopwafel), che abilita la comunicazione diretta tra applicazioni userland e kernel patchato, aprendo la strada a memory read/write, esecuzione di codice e interazioni avanzate tra software e hardware.

Sono stati inoltre migliorati il supporto al redNAND accelerato, il semihosting per log kernel via seriale, la gestione di partizioni multiple, il blocco permanente delle scritture su SEEPROM e il sistema di plugin, ora più flessibile e potente.

Stroopwafel si rivolge comunque a modder esperti e richiede la compilazione da sorgente tramite toolchain devkitPro. Grazie a queste funzionalità, la Wii U può eseguire overclock leggeri, debug avanzato, riparazioni hardware degradato e dual-boot, trasformandosi in una console estremamente personalizzabile e stabile.

Caratteristiche aggiuntive rilevanti

Nota: Vedere anche ios_process/source/config.h

  • Supporto de_Fuse: reindirizza tutte le letture OTP in RAM. Richiede minute_minute per patchare i dati.
  • Caricamento di fw.img decriptato in IOSU.
  • IOSU reload passa attraverso minute per semplificare le patch.
  • Scritture su SEEPROM disabilitate (per sicurezza).
  • Accelerazione redNAND MLC – sposta la cache MLC (SCFM) in SLCCMPT.
  • Hook semihosting – stampa kprintf e syslog sulla seriale del modchip Pico de_Fuse.
  • Disabilitazione del drive disco (senza scrittura su SEEPROM).
  • USB_SHRINKSHIFT – permette di avere sia il filesystem Wii U sia un filesystem normale su un drive, spostando la porzione Wii U dopo l’MBR.
  • USB_SEED_SWAP – sovrascrive la chiave USB SEEPROM per facilitare la migrazione del sistema.

Funzionalità sperimentali/instabili

  • Caricamento di kernel.img dalla scheda SD.

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.

Utilizzo dei plugin

I plugin consentono di applicare patch aggiuntive a IOSU. Per utilizzarli:

  1. Posizionare il plugin compilato (es. 00core.ipx) accanto a wafel_core.ipx nella directory sd:/wiiu/ios_plugins o /storage_slc/sys/hax/ios_plugins.
  2. All’avvio, minute caricherà automaticamente i plugin.
  3. 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.
  4. Entrambe le funzioni devono terminare (return), ma mcp_main() può avviare thread aggiuntivi.
  5. 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 a trampoline_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.

Interfaccia IPC

Stroopwafel fornisce un’interfaccia IPC personalizzata tramite il dispositivo /dev/stroopwafel, permettendo alle applicazioni userland di interagire con il kernel IOS. Questa interfaccia supporta operazioni di memoria, esecuzione di codice e molto altro.

Per un wrapper comodo per interagire con questa interfaccia, consulta libstroopwafel.

Informazioni tecniche dettagliate sui comandi e sulle strutture IPC sono disponibili in IPC.md.

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

Download: Stroopwafel v2.0 (00core.ipx)

Download: Stroopwafel v2.0 (5debug.ipx)

Download: Source code Stroopwafel v2.0

Alcune parti di questo articolo sono state generate con l’aiuto dell’intelligenza artificiale.

🔥 Prodotti in promozione e articoli più venduti: PC

Vedi altri prodotti PC

Questo articolo contiene link affiliati a Amazon. Se acquisti tramite questi link, potrei guadagnare una commissione senza costi aggiuntivi per te.

Ultimo aggiornamento 2026-03-12 / Link di affiliazione / Immagini da Amazon Product Advertising API