# Homebrew (informatica)

Homebrew (lett. "birra fatta in casa", pron. /ˌhəʊm ˈbruː/) in inglese è un prodotto fatto da sé in casa, piuttosto che acquistato o realizzato da professionisti. Solitamente il termine viene usato nel campo del software, principalmente dei videogiochi, per indicare quei programmi sviluppati amatorialmente per piattaforme normalmente non programmabili dagli utenti a causa di restrizioni interne, tipicamente le console. Spesso lo scopo dello sviluppo di homebrew è espandere le funzionalità di un hardware al di là di ciò che potrebbe normalmente fare, ad esempio una console pensata solo per i videogiochi viene resa capace di riprodurre film. L'homebrew è una forma di hacking, in quanto sistemi informatici chiusi vengono modificati e aperti per abilitare altre funzioni ed eseguire nuovi programmi non previsti.
Nella maggior parte dei casi, sono solo gli sviluppatori ufficiali ad avere a disposizione il kit di sviluppo fornito dalla casa produttrice, e quindi i programmatori amatoriali devono fare ricorso a kit alternativi. In modo variabile a seconda del sistema di destinazione, per poter eseguire materiale homebrew spesso è necessario particolare hardware esterno, come lettori di schede di memoria, o anche l'installazione di modchip.

## Storia

La pratica dell'homebrew fu iniziata da appassionati che volevano mettere alla prova le proprie abilità tecniche, hackerando e quindi sviluppando programmi per console di vecchie generazioni che non erano più supportate dai produttori, a cominciare da classici come Fairchild Channel F, Atari 2600 o NES.
L'espressione trovò più diffusione tra il grande pubblico quando uscì Homebrew Channel per la console Nintendo Wii. Il canale, non appartenente alla Nintendo, permette alla Wii di leggere generici DVD e di eseguire giochi da altri supporti come chiavi USB (favorendo tra l'altro la pirateria di giochi ufficiali; uno dei motivi per cui i produttori spesso osteggiano la pratica dell'homebrew).
Con la diffusione di sistemi aperti nativamente programmabili dall'utente, come Android, Raspberry Pi e Ouya, l'entusiasmo per l'homebrew su console più recenti, come quelle dell'ottava generazione, è diminuito.

## Piattaforme specifiche
### PlayStation Portable

Una versione modificata di GCC (e degli altri strumenti necessari) in grado di creare codice eseguibile sulla Sony PSP è stata realizzata verso la metà del 2005. Attraverso di essa, si ha la possibilità di sfruttare tutte le potenzialità della PSP, scrivendo codice C o C++. Tale versione del GCC, chiamata PSP-GCC, è inclusa in un pacchetto chiamato PSPSDK. Il PSP-GCC fornisce delle buone prestazioni, ma ignora completamente la presenza della VFPU: la conseguenza di questo è che i programmatori che volessero usare tale componente per accelerare i calcoli in virgola mobile devono obbligatoriamente inserire nel loro programma C delle routine in un particolare linguaggio assembly. L'assembly della PSP è una versione particolare del MIPS, detta Allegrex. Per arrivare alla creazione del PSPSDK è servito il contributo di molte persone, dato che Sony non ha diffuso alcuna documentazione sul formato degli eseguibili, ad esempio. Tutto è stato ottenuto mediante la tecnica del reverse engineering. Una complicazione possibile è data dal fatto che il formato degli eseguibili è diverso a seconda che la PSP monti un firmware 1.50 oppure un firmware personalizzato. Entrambi i formati di file usano l'estensione PBP, ma la struttura interna è totalmente differente. Nei PBP per fw 1.50, il PBP contiene un file eseguibile in formato .ELF, mentre nei PBP per custom firmware, il file PBP contiene un file in formato .PRX. Inoltre, nei custom firmware è stata eliminata la possibilità per i PBP di accedere direttamente a funzionalità in kernel mode.
Il linguaggio C utilizzato dalla PSP mostra alcune differenze rispetto al normale linguaggio C (nota l'impossibilità di usare direttamente il comando printf e l'obbligo di usare particolari macro di piattaforma per definire alcuni attributi dell'eseguibile, come il funzionamento in kernel o in user-mode), che rendono consigliabile, a chi volesse usare il PSPSDK, di consultare prima i vari forum specializzati su Internet. Infine, va osservato che Sony cambia ad ogni commercializzazione del nuovo firmware alcuni codici a 32 bit che corrispondono a funzioni del sistema operativo (detti NID), costringendo i programmatori ad aggiornare i propri programmi per supportare le nuove versioni dei firmware. Tutte queste difficoltà, unite ad una parziale incompatibilità del codice per PSP-SLIM e del codice per PSP-FAT, rendono alquanto complesso programmare per PSP. Malgrado questo, il numero di homebrew creati per questa piattaforma è notevole.
Alcuni team di sviluppo, allo scopo di semplificare il processo di sviluppo per la PSP, hanno sviluppato alcune tecnologie che, appoggiandosi al PSPSDK, eseguono automaticamente molte delle operazioni a basso livello necessarie per ottenere il PBP, coprono al programma chiamante le differenze di architettura, consentono l'uso di uno pseudoemulatore MIPS per testare i propri programmi prima di flasharli sulla PSP, forniscono routine ad alto livello per l'accesso alla grafica ed al suono, consentono l'uso di un C compatibile con gli standard ANSI, e permettono di scrivere codice portabile.
È con questi obiettivi che in Italia è stato sviluppato l'SDK Nanodesktop. Esso è stato sviluppato per fornire un ambiente a finestre e per facilitare il porting di software scientifico-universitari come le OpenCV. Altri team di sviluppo, pur mantenendo le peculiarità del C della PSP, hanno sviluppato propri engine che facilitano il processo di sviluppo degli homebrew. È questo il caso di LTE Engine che è una libreria C++ più orientata verso la programmazione di videogiochi (si basa su un motore IrrLitch) o del porting delle librerie SDL. Sony ha sempre contrastato la possibilità degli utenti di sviluppare propri homebrew. Nella versione 1.5 del firmware Sony, questa possibilità era contemplata, ma nelle versioni successive fu eliminata dalla casa madre.
Non sono note le ragioni: probabilmente il timore di Sony era che alcuni homebrew potessero essere usati per eseguire copie illegali di giochi commerciali, eludendo le protezioni anticopia previste dalla casa madre per proteggere il lavoro dei propri sviluppatori ufficiali. Tuttavia, la strategia di Sony avrebbe impedito anche l'esecuzione di homebrew scritti legittimamente dagli stessi utenti della console. Per tale ragione, alcuni hacker sono riusciti a produrre dei firmware modificati, detti custom firmware, che oltre ad aggiungere nuove funzioni, recuperano la possibilità per l'utente di eseguire propri homebrew sulla propria console (ovvero, la possibilità di eseguire codice digitale non firmato). Sony aggiorna periodicamente i propri firmwares ufficiali (in genere rimuovendo i bug delle versioni precedenti), e gli hacker distribuiscono dopo poco tempo le corrispondenti versioni "hackerate" che comprendono le nuove funzioni e che permettono l'esecuzione degli homebrew.

### Nintendo DS

Vasta è pure la scena homebrew della console portatile Nintendo DS. I tool Devkitpro e la scrittura dei libnds hanno ampliato la diffusione e la facilità di produzione degli homebrew. Gli homebrew sono solitamente scritti in C, utilizzando codice di basso livello come le libnds o librerie di alto livello (PAlib). Oggi sono centinaia le applicazioni homebrew, nelle quali spiccano porting di famosi giochi Id Software resi open source o emulatori, come quelli per Snes o Nes. La scena homebrew partì effettivamente quando un hacker noto come darkfader riuscì, tramite il PassMe, sviluppato in collaborazione con Natirum42 ad aggirare il controllo RSA inserito da Nintendo, atto a non fare eseguire codice non firmato sulla sua console. Un esempio di homebrew è MoonShell, un media player dedicato alla console.
I supporti utilizzati sono:
* SLOT 1: Le slot 1 sono le flashcard come R4, M3 o altre del genere.
* SLOT 2: Le slot 2 sono quelle card che si inseriscono nello slot 2 (GBA), dette anche super card, sono compatibili con la maggior parte degli homebrew perché non avevano le DLDI.

### Nintendo Wii

Prima del lancio della Nintendo Wii, WiiCade fu il primo sito a ospitare giochi homebrew in Adobe Flash progettati specificamente per la Wii e il suo telecomando, che potevano essere giocati senza l'uso di exploit tramite il browser Opera della console. Nel dicembre 2007, la Wii fu hackata tramite un'interfaccia seriale personalizzata. Lo scopo principale degli exploit sulla Wii era installare The Homebrew Channel, un canale personalizzato che consente agli utenti di eseguire software homebrew sulla console. La prima versione completa di The Homebrew Channel fu rilasciata nel dicembre 2008.
Anche se Nintendo riuscì a correggere diversi exploit più vecchi per l'installazione del canale, esistono ancora molti exploit che permettono di eseguire The Homebrew Channel su firmware più recenti. Il canale può essere installato sfruttando exploit in giochi come la versione NTSC di Super Smash Bros. Brawl, un exploit nel canale Internet, un exploit DNS con l'EULA, o tramite un exploit nel sistema di messaggistica della Wii. È importante notare che solo gli exploit che utilizzano giochi su disco sono compatibili con l'installazione di The Homebrew Channel in modalità vWii (Virtual Wii) su una Wii U, tranne "wuphax", un exploit che installa il canale tramite permessi di sistema specifici per Wii U.
Il kit di sviluppo Opera permetteva agli sviluppatori di creare giochi in JavaScript. Il controller della console era anche un obiettivo popolare per la modifica.
Nel 2008, il Team Twiizers (ora conosciuto come fail0verflow) rilasciò un exploit chiamato Twilight Hack, che sfrutta un file di salvataggio malformato (Buffer overflow) per caricare un file boot.elf nella memoria (se presente nella directory principale della scheda SD), che poi installa The Homebrew Channel eseguendo codice non firmato. Un altro metodo coinvolgeva l'exploit nel Wii Message Board (LetterBomb), un exploit molto popolare rilasciato nei primi anni 2010., esistono molti altri exploit che possono hackare la Wii per eseguire homebrew, oltre a quelli già menzionati. Questi includono (ma non si limitano a) BannerBomb (usando un Channel malformato; corretto nell'aggiornamento 4.3), FlashHax (usando il canale Internet), str2hax (usando l'EULA della Wii), BlueBomb (usando Bluetooth), WilBrand (alternativa a LetterBomb che supporta firmware più vecchi e supporta ancora la versione 4.3), e ModMii (exploit per utenti PC).