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

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

61
0

Stroopwafel, il framework e firmware personalizzato per console Wii U basato su SaltyNX e successore di iosuhax, ha ricevuto un nuovo aggiornamento rapido con la versione 2.1, necessaria principalmente per correggere il problema relativo a IOCTL_GET_PLUGIN_PATH.

La precedente release 2.0 aveva introdotto funzionalità avanzate che sfruttano appieno il modchip de_Fuse (o Pico de_Fuse), consentendo un controllo approfondito sul kernel IOSU e aprendo nuove possibilità per la gestione del sistema operativo della console.

Il firmware Stroopwafel permette il caricamento diretto di firmware decriptati, l’accelerazione del redNAND tramite cache ottimizzata, la disabilitazione del drive disco senza alterare permanentemente la SEEPROM e l’integrazione di plugin personalizzati per modificare il comportamento del sistema.

La versione 2.0 ha introdotto la novità più rilevante: l’IPC Interface (/dev/stroopwafel), che abilita la comunicazione diretta tra applicazioni userland e kernel patchato, permettendo operazioni di memory read/write, esecuzione di codice e interazioni avanzate tra software e hardware.

Oltre a ciò, sono stati migliorati il supporto al redNAND accelerato, il semihosting per log del 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 a modder esperti e richiede la compilazione dai sorgenti tramite la toolchain devkitPro, ma in cambio trasforma la Wii U in una console estremamente personalizzabile, stabile e capace di overclock leggeri, debug avanzato, riparazioni hardware degradato e dual-boot, ampliando enormemente le possibilità di sviluppo e modifica del sistema.

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

  • Correzione di IOCTL_GET_PLUGIN_PATH.

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

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

Download: Source code Stroopwafel v2.1

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

🔥 Prodotti in promozione e articoli più venduti: Informatica

Vedi altri prodotti Informatica

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