WAD, certificati e Wii

Pubblicato il 7 febbraio 2009 alle 01:02 da Brisma

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 :P
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)< &lt;24)+((i&0xff00)<&lt;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).

Lascia un Commento