Ultimamente, passando gli ultimi giorni di vacanza a giochicchiare con l’hacking dei fantomatici file WAD, che per chi non lo sapesse non sono altro che il dump dei canali del Wii, mi sono imbattuto in un simpatico argomento: può esistere un modo alternativo per sapere cosa contiene un WAD senza passare per l’ID, e di conseguenza la relativa ricerca in rete di cosa corrisponda? Ebbene, anche questa volta, la mia curiosità ha trovato la sua risposta, ovvero Sì. Il tutto andando ad analizzare l’header (non poi troppo diverso da quello dei classici giochi NDS/PSP) ho scoperto che è possibile arrivare con pochi calcoli all’offset assoluto del file certificato, dove è presente niente popò di meno che il titolo che compare sotto l’icona del canale nella dashboard del Wii quando ci si passa sopra con il Wiimote ![]()
Ed ecco dunque che ho scritto al volo un semplice programmino che dandogli in pasto un file Wad, restituisce il suo titolo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | /* Ottenere il titolo di un WAD dal certificato :P 06/02/2009 - by Brisma - - - Inutile spiegare tutta la struttura dell'header dei file WAD, scriverò giusto come arrivare al certificato da cui ottenere il titolo del WAD (ovvero l'offset assoluto del file .cert). Si ottiene con: DimensioneWAD - (64 - (DimensioneCERT % 64)) - DimesnioneCERT | --> solo se (DimensioneCERT % 64) > 0 Arrivati fin qua facciamo un semplice controllo se effettivamente il certificato può in linea teorica contenere il titolo dell'app con il semplice calcolo di 240 + (84 * 6) = 744 byte, quindi se è più piccolo di questa dimensione (che dovrebbe esser la minima teorica) il file .cert non contiere nulla :P A questo punto si aggiunge il valore 240 che ci porterà all'inizio esatto del titolo del WAD e leggiamo 84 byte che sono codificati a 16bit, quindi in realtà vi sarà una stringa di 42 lettere (caratteri nulli inclusi). Ovviamente nella parte della disinstallazione non è necessario andare a ricalcolare l'offset etc etc, basterà aprire il file .cert (con un semplice strstr() per controllarne il nome), e spostarsi nuovamente di 240 byte qual'ora la dimensione sia superiore a 744. */ #include <stdio .h> unsigned long int dimensionewad, dimensionecert, offsetcert; char nomeApp[84]; FILE *filewad; // Conversione da Little Endian a Big Endian int litte2big(int i) { return((i&0xff)< <24)+((i&0xff00)<<8)+((i&0xff0000)>>8)+((i>>24)&0xff); } int main(int argc, char *argv[]){ filewad=fopen(argv[1], "rb"); fseek(filewad, 0, SEEK_END); dimensionewad = ftell(filewad); fseek(filewad, 0x1C, SEEK_SET); fread(&dimensionecert, 4, 1, filewad); dimensionecert = litte2big(dimensionecert); if (dimensionecert < 744) { printf("Il file .cert non contiene informazioni.\n"); getch(); // Cancellare return 0; } if ((dimensionecert % 64) != 0) offsetcert = dimensionewad - (64 - (dimensionecert % 64)) - dimensionecert; else offsetcert = dimensionewad - dimensionecert; // // offsetcert contiene l'offset del wad dov'e' presente il file .cert // Ora non resta che aggiungere 240, leggere 84 byte, e mostrare il titolo // alternando i byte (è a 16bit) :P // offsetcert+=240; fseek(filewad, offsetcert, SEEK_SET); fread(&nomeApp, 84, 1, filewad); int i = 0; for(i = 1 ; i < 42; i+=2) if(nomeApp[i] != 0x00) printf("%c", nomeApp[i]); getch(); // Cancellare return 0; fclose(filewad); } |
Download WAD_Title (Eseguibile Win32/Sorgenti C).
Pubblicato il 7 febbraio 2009 alle 01:02 da Brisma