Archivio di febbraio 2009

Star Ocean: First Departure Unpacker

Pubblicato il 17 febbraio 2009 alle 02:02 da Brisma

Star Ocean FD PSPUhuh, ma guarda un po’ cosa sono andato a ripescare dall’hard disk oggi :P
Non si tratta di nulla di particolare, semplicemente un paio di mesi fa (Ottobre) avevo iniziato ad analizzare questo gioco, giusto per vedere com’era strutturato (per giunta la versione USA, in quanto la PAL non era ancora uscita in commercio.
Per capire l’archivio ci è voluto ben poco, una delle tanti varianti di casa Square, nulla di nuovo insomma. Invece la cosa curiosa sono proprio i file contenuti in esso: si tratta niente di meno che… di file compressi!
Beh, anche qui non c’è nulla di nuovo penserete… ed invece c’è una piccola curiosità: utilizzano la stessa identica compressione di Valkyrie Profile PSX/PSP, difatti sono tranquillamente de/comprimibili utilizzando il decompressore di VP :)

Sfortunatamente, tale decompressore non è ad opera mia, ma bensì di Scorpio, indi per cui non posso pubblicarlo senza il suo consenso, ma tuttosommato nessuno mi vieta di pubblicare uno dei miei tanti dearchiviatore brutti, mal ottimizzati, senza nessun controllo etc etc ma che funzionano sempre, e perciò ecco il dearchiviatore, non si sa mai che a qualcuno può tornare utile :P

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
#include <stdio .h>
 
unsigned long int num_file, i, offset, dimensione, indice;
unsigned char buffer[209715200], stringa[32]; // 200Mb - > W lo spreco XD
FILE *input, *output;;
 
int main()
  {
  input=fopen("so1pack.bin", "rb");
  mkdir("SO1_UNPACK");
  fread(&num_file, 4, 1, input);
  fseek(input, 0x08, SEEK_SET);
  fread(&indice, 4, 1, input);
  fseek(input, 0x10, SEEK_SET);
  for(i = 0; i < num_file - 1; i++) // Esclude l'indice delle dimensioni
    {
    fseek(input, 0x10 + (i * 4), SEEK_SET);
    fread(&offset, 4, 1, input);
    fseek(input, indice + (i * 4), SEEK_SET);
    fread(&dimensione, 4, 1, input);
    fseek(input, offset, SEEK_SET);
    printf("File so1pack.%d Offset: %X Dimensione: %d byte\n", i, offset, dimensione);
    fread(&buffer, dimensione, 1, input);
    sprintf(stringa, "SO1_UNPACK\\so1pack.%d", i);
    output=fopen(stringa, "wb");
    fwrite(&buffer, dimensione, 1, output);
    fclose(output);
    }
  return 0;
  }

Download Star Ocean FD Unpacker 0.1 (Eseguibile Win32/Sorgenti C).

Aggiornamento a WordPress 2.7.1

Pubblicato il 12 febbraio 2009 alle 12:02 da Brisma

WordPress LogoPiccola comunicazione di servizio per informare che ho provveduto ad aggiornare il blog alla versione 2.7.1 di WordPress. Parecchio interessante la nuova funzione per l’auto aggiornamento… peccato però che mi abbia distrutto tutto il tema che mi ero modificato.

Sfortuna ha voluto che non avessi neanche un backup con gli ultimi ritocchi (una settimana fa) ma per fortuna ci ha pensato la cache di Google a salvarmi e con un paio di copia-incolla sono riuscito ad aggiustare il tutto :P

Zelda: Ocarina Of Time – VC Wii

Pubblicato il 9 febbraio 2009 alle 03:02 da Brisma

Logo Zelda OOTAvevo accennato qualche giorno fa di un certo Zelda: Ocarina Of Time e di come mi stessi occupando non della normale rom PAL/USA, ma bensì della versione emulata su Virtual Console del Wii. Dunque mi son detto: perché non mostrare cosa sto realmente facendo :P ?
Partiamo dalle basi: come prima cosa è bene precisare che i giochi per VC non sono altro che rom nude e crude “incapsulate” in un canale con apposito manuale/trailer relativo al gioco. Ne consegue che, una volta estratti i dati del canale, è stato facile estrarre la rom di OOT che funziona perfettamente su qualsiasi emulatore di Nintendo64. Per la precisione, quella proposta per VC è sostanzialmente un aggiornamento della stessa rom apparsa qualche anno fa su un Bonus Disc per GameCube. Per chi avesse avuto modo di provarla al tempo, saprà che si tratta semplicemente di una rom Multi3 (Inglese, Tedesco, Francese) con qualche censura e qualche testo rivisto qua e là. I più attenti alla scena del romhacking italiano sapranno anche che già da diversi anni esiste una traduzione per OOT ad opera di xxcentury che rappresenta un’ottima localizzazione del gioco, ma sfortunatamente è priva di ogni qual forma di hack grafico (al tempo era irrealizzabile) e sprovvista anche di un font accentato (sebbene il gioco USA contenesse comunque un font già accentato). Il mio lavoro è stato in primo luogo quello di cercare di importare la traduzione di OOT USA in OOT VC: è stato un processo non proprio facilissimo in quanto molti blocchi erano diversi, ma comunque è stato possibile attuarlo in una sola giornata. Tecnicamente ora il testo del gioco è tutto in italiano e funziona perfettamente ma… dato che i tempi ora sono maturi, perché fermarsi al semplice testo se è possibile de/comprimere la grafica e modificarla ad opera d’arte ed inserire un font accentato come si deve?
Per il font non è stato un problema, dovrò solamente revisionare un 200Kb di script alla ricerca di tutti gli accenti e modificarli con le rispettive corrispondenze secondo il font di OOT VC, ma è facilmente fattibile come nello screen seguente:

Zelda OOT M3 Beta02

Per quanto riguarda la grafica non è un’operazione così semplice: in primo luogo perché c’è comunque moltissimo testo grafico nel gioco (come ad esempio tutti i luoghi che si visitano, tutti i boss, tutti gli oggetti e via dicendo) ed in secondo luogo per via della compressione/palette utilizzata che richiedono una manualità un po’ particolare, ma tutto sommato fattibile:

Zelda OOT M3 Beta01

Come si nota in quest’ultimo screen in special modo sulla scritta “Seleziona la tua Lingua” c’è uno strano alternarsi di colori chiari e scuri, il tutto è normale, ho utilizzato il semplice Paint per tradurre la scritta con conseguenza “perdita” della palette originale nelle zone editate: ma il tutto è facilmente risolvibile con qualche click di Photoshop :)

Beh, per ora è tutto, alla prossima!

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).