Archivi per la categoria ‘Hacking’

Crimson Gem Saga Unpacker

Pubblicato il 16 febbraio 2010 alle 01:02 da Vash

Un altro rapido articoletto.

Tempo fa scrissi questo estrattore per l’archivione di Crimson Gem Saga e già che ci sono perché non piazzarlo qui?

Da notare che in giro per la rete trovai già degli altri programmi per questo archivio ma, non so per quale motivo, sono tutti incompleti. Il sistema di archiviazione è semplice e i file sono compressi con Zlib a chunk per cui basta decomprimere ogni chunk e poi rinuire il tutto nel file unico finale…indi per cui se avete un estrattore che vi fa crea dei file xxx.001 xxx.002 xxx.003 etc sapiate che è errato e che sono semplicemente pezzi di un unico file.

Ad ogni modo, l’utilizzo è molto semplice, estraete la iso, posizionate il tool insieme al file Asto2.dat e doppiocliccate il programmino.

Per il download cliccate qui

Alla prossima.

Kingdom Hearts Chain Of Memories Uncomplete Toolset

Pubblicato il 16 febbraio 2010 alle 11:02 da Vash

Cover Buongiorno a tutti, ecco come promesso un altro rapido aggiornamento a questo blog.

Qualche tempo fa (credo ormai un anno) mi misi a giochicchiare con la versione NTSC/US di Kingdom Hearts Chain Of Memories e si rivelò più tosto del previsto. I maledetti alla square non si smentiscono mai e qui hanno usato una custom TOC (ovvero, se si apre la iso normalmente non si vede nulla a parte l’eseguibile e un altro paio di file inutili ai nostri scopi) ma fortunatamente quella non è stata particolarmente un problema quanto invece il formato degli archivi che contenevano il testo.

Beh, a farla breve dopo una settimana riuscii a scrivere 4 programmi che ora vi lascerò:

-isoextr

Vi permette di estrarre i file veri dalla iso

isoextr file.iso

- datextr

Vi permette di estrarre i file dat

datextr file.dat

-bindumper & ctddumper

Vi permettono di estrarre il testo in formato intelleggibile. Consiglio Notepad++

bindumper file.bin

ctddumper file.ctd

Detto questo, passo e chiudo, alla prossima.

Per il download cliccate qui

Shiren The Wanderer Unpacker

Pubblicato il 15 febbraio 2010 alle 02:02 da Vash

Dopo quasi un anno preciso, torno a ripopolare un po’ questo Blog (ripromettendomi di farlo più spesso) con un programmino che ho scritto questa mattina in un’oretta di libertà. Questo gioco per WII  è una specie di RPG…credo..ok, non ho la minima idea di cosa sia sto gioco ma mi piaceva la copertina. Fatto sta che dando una rapida occhiata al formato dell’archivio l’ho trovato abbastanza semplice e ispirante perciò, ecco a voi un simpatico unpacker.

Da notare che dentro ci sono dei file…come dire…curiosi come enckey.key da 16 byte e signkey.pub da 256 byte. Adoro quando crittano tutto e forniscono la chiave :D

Dubito seriamente di continuare l’hacking di questo gioco, se servissero altre informazioni però, potete contattarmi senza problemi.

Per il download, cliccate qui

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

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

Tales Of Vesperia Hacking Parte 1

Pubblicato il 15 settembre 2008 alle 12:09 da Vash

Nonostante non sia ancora chiaro quando uscirà una versione PAL (europea) del gioco e se verrà localizzato ufficialmente in italiano, ho deciso di studiarne lo stesso la struttura.

Appena estratta la iso si nota subito la presenza di archivi in quanto, oltre ad audio e filmati, sono presenti solo file SVO. Da lì a capirne la struttura il passo fortunatamente è stato breve, e ancora più breve è stata la stesura del codice che ha portato alla creazione di un estrattore che potete scaricare qui.

A presto per un nuovo aggiornamento :)

Penny Arcade: On the Rain-Slick Precipice of Darkness Episode 1

Pubblicato il 20 giugno 2008 alle 02:06 da Vash

Titolo infinito per un giochetto di nicchia da poco uscito che certo farà scalpore solo fra gli afecionados del noto(?) fumetto Penny Arcade.

Ieri sera, finito di studiare per uno schifossimo esame di Database ho acceso Steam per fare una partitina a Audiosurf e ho visto nelle news questo giochetto di cui avevo letto su GMC qualche tempo prima, così ho scaricato la demo e ho visto che era il gioco intero solo a tempo, così, dopo essermi assicurato che non esistesse in italiano, mi sono dedicato un po’ all’hacking e in poco ne sono venuto a capo. Il testo è dentro degli archivi hha che non sto a descrivere troppo in quanto non li ho hackati io ma per fortuna ho trovato un de/compressore già pronto in questo forum (versione 0.3 per Win32 o Linux). Estratti quei file ho subito individuato il file incriminato (English.lso dentro la cartella Language :P) ma ho visto che non era un semplice txt ma un formato, fortunatamente, semplicissimo:

1 byte = Totale lunghezza frase
x byte = Frase

e così fino alle fine..

in pochi minuti era pronto un bel tool per l’estrazione e il reinserimento del testo. La versione 1.0 la trovate qui completa di codice sorgente.

Un problema un po’ più gravoso sono i filmati che sono in SWF, cioè in flash, ma armati di un decompilatore e di molta pazienza volendo si possono tradurre pure quelli.

Saluti, alla prossima

Patch Final Fantasy IX [Pal-Ita]

Pubblicato il 3 maggio 2008 alle 04:05 da Brisma

Se qualcuno se lo fosse perso, quasi un anno fa, rilasciai una patch per Final Fantasy IX per inalibire la protezione che affliggeva la versione Pal del gioco, rendendolo di sorta inemulabile (se non tramite particolare plugin/sub) su pc o su altre console. Basandomi sul lavoro svolto dagli altri team, in special modo tedeschi/francesi, ed armato di tanta pazienza e pochissime nozioni di assembly, mi sono messo al lavoro su questo gioco e nel giro di una settimana circa sono riuscito ad ottenere i risultati prefissati :P

Infatti, applicando le dovute patch, è possibile emulare il gioco in versione italiana anche su PSP e su Xbox senza nessun problema :D

Dato che la rete a volte è un po’ infame, ho deciso di pubblicare la patch anche sul mio sito, prima che scompaia e diventi introvabile :P

Download Patch Final Fantasy IX [Pal-Ita] (PPF/PSX).

Nuovo Hacker, Nuove Inutilità

Pubblicato il 29 aprile 2008 alle 02:04 da Vash

Salve a tutti, sono Vash.

Il buon Brusba mi ha gentilmente concesso questo spazio (graaaaaaaazie brusba) per poter dare in pasto al web le mie inutilità che, come lui, programmo o studio nel tempo libero.

La mia prima inutilità riguarda un j-rpg (Japanese Role Play Game per i profani) per PSX, Hoshigami.
Potrei scopiazzarvi un breve riassunto da qualche sito per farvi capire di cosa parla questo gioco e per farvene un’idea, ma la verità è che non ne ho la minima idea manco io per cui se non lo so io, che vi frega a voi? Qualcuno dirà:”Ma perché ti metti a sfacchinare su un gioco che manco conosci?” e io risponderò:”Bella domanda, ogni tanto me la pongo anche io”.

Vabbè… chiudiamo l’angolo dell’ilarità e torniamo alle cose serie. Ho programmato un bel Dumper (sempre per i profani, estrattore di testo) per i dialoghi (NB SOLO i dialoghi) di, appunto, Hoshigami. Prima che chiediate il codice sorgente per analizzarlo e capacitarvi del mio genio sappiate che questo programma merita il premio di Dumper più vago del secolo. Mi spiego meglio. Il testo del gioco sta tutto in un file chiamato Demo.DAT (emo scriviamolo in minuscolo, va..) che, presumo, è un archivio. Non trovando i puntatori di questo archivio dopo una rapida ricerca stavo per abbandonare tutto quando ho visto che il testo era in un formato molto strano e aveva delle costanti alla fine e all’inizio del testo, così basandomi su una intuizione e affidandomi alla fortuna ho scritto questo bel dumper.

Qualcuno schifato dirà:”Bhè bravo, ma ora non si può nemmeno espandere…” e io, facendomi grasse risate dirò:”Buah buah buah (le grasse risate ndV), il mio culo non ha limiti, in questi dump metà spazio è occupato da commenti in giapponese (quindi unicode ndV) assolutamente inutili, per cui una volta tradotto il testo basterà riportare il file al suo peso originale e reinserirlo.”

Ora un esempio pratico su come, eventualmente, tradurre.
Ecco un Dump:

(! =============================================
ƒfƒBƒ\[ƒ‹Š×—Ž
=============================================
—- MAP —-
‚È‚µ:ƒAƒhƒxƒ“ƒ`ƒƒƒp[ƒg
—- Character ID —-
1:ƒtƒ@ƒY
4:ƒVƒ‹ƒtƒ@ƒgƒX
7:ƒŒƒCƒ}ƒŠ[
—- Global Flags —-
nothing
—- Temporary Flags —-
nothing
—- Special Animation —-
nothing
—- Face in Window —-
0:04ƒtƒ@ƒY ‹Á‚«
1:32ƒVƒ‹ƒtƒ@ƒgƒX ‰ö‚µ‚Þ
============================================= )

(!–BGM–)(ply -1)
(!–”wŒi–)(%bp 0)

(wtm 60)

(%fp 1)(wtm 20)(win 2)
(say “Silphatos\n\”I have some disturbing news…\”")(wfg 127)
(win 0)(wtm 5)

(%fp 0)(wtm 10)(win 2)
(say “\h\n\”What’s wrong?\”")(wfg 127)
(win 0)(wtm 5)

(%fp 1)(wtm 10)(win 2)
(say “Silphatos\n\”I just received word that the town of\n Dissoal was attacked by the Valaimian\n army.\”")(wfg 127)
(win 0)(wtm 5)

(end)

Le parti da tradurre sono tutte quelle precedute da (say ” e, la prima parola (a meno che non sia la continuazione delle frasi precedenti) è il nome di chi parla, Silphatos in questo caso. Quel /n vuol dire che la frase va a capo per cui usatelo saggiamente (non avrete spazio infinito a schermo). Se vorrete aggiungere una finestra potrete farlo ma dovrete stare attenti a rispettare certi parametri, prendiamo come esempio questa frase, presa da un altro dump:

((win 1)
(say “\f01Zelstan\n\”If you knew that much…”)(wfg 127)
(say “\f01 If you knew that Vugtis is\n intent on destroying\n everything, why do you still”)(wfg 127)
(say “\f01 want him to return to\n Mardias?\”")(wfg 127)
(win 0)

potrete aggiungere una frase così:

(win 1)
(say “\f01Zelstan\n\”If you knew that much…”)(wfg 127)
(say “\f01 If you knew that Vugtis is\n intent on destroying\n everything, why do you still”)(wfg 127)

(say “\f01 want him to return to\n Mardias?\”)(wfg 127)

(say “\f01 frase nuova\”")(wfg 127)

(win 0)

Come vedete ho aggiunto una frase finale, rispettando la sintassi comune del gruppo di frasi, togliendo le doppie virgolette alla ex-ultima frase e aggiungendole all’ultima creata da me. Superfluo dire che questa cosa è inutile perché volendo basta continuare a scrivere sulla stessa riga aggiungendo /n vari, ma sta a voi decidere. Passiamo alla fase di pulizia. I commenti da, eventualmente, cancellare…quali sono? Facile, è tutto ciò che è compreso fra (! e ) ovvero se per esempio trovate:

(! =============================================
ƒfƒBƒ\[ƒ‹Š×—Ž
=============================================
—- MAP —-
‚È‚µ:ƒAƒhƒxƒ“ƒ`ƒƒƒp[ƒg
—- Character ID —-
1:ƒtƒ@ƒY
4:ƒVƒ‹ƒtƒ@ƒgƒX
7:ƒŒƒCƒ}ƒŠ[
—- Global Flags —-
nothing
—- Temporary Flags —-
nothing
—- Special Animation —-
nothing
—- Face in Window —-
0:04ƒtƒ@ƒY ‹Á‚«
1:32ƒVƒ‹ƒtƒ@ƒgƒX ‰ö‚µ‚Þ
=============================================)

Questo è tutto un commento e potrete usarlo. Occhio a non cancellare l’apertura o la chiusura del commento altrimenti mandate tutto in vacca… Per ora questo è tutto, se mi verrà in mente altro o ci saranno domande scriverò qualcosa di nuovo.

Download Hoshigami Dumper 0.9 (Eseguibile Win32).

A presto per il reinseritore!

Hacking Crisis Core: Final Fantasy VII (PSP) – Parte 3

Pubblicato il 5 aprile 2008 alle 01:04 da Brisma

E per concludere questo capitolo temporaneamente mi sembrava d’obbligo pubblicare anche il rearchiviatore. In pratica si tratta sempre dello stesso programma di prima, soltanto che a questo giro al posto di estrarre dal discimg.pkg non farà altro che reinserire i file precedentemente estratti dal dearchiviatore pubblicato qualche giorno fa. Insomma, quanto di più facile si potesse fare :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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
 
Crisis Core: Final Fantasy VII Archiviatore 1.0beta
               05/04/2008 - Brisma
 
*/
 
#include <stdio.h>
 
long int offset, dimensione, padding, num_file, num_dummy, i, z = 1;
int buffer[160978944]; // 160978944 è la dimensione del
                       // file più grande (nella versione USA)
char stringa[255];
 
FILE *discimg_fse, *discimg_pkg, *estratto;
 
int main()
  {
  printf("Crisis Core: Final Fantasy VII Archiviatore 1.0beta by Brisma\n\n");
  if(!((discimg_fse=fopen("discimg.fse", "rb")) == NULL))
    {
    if(!((discimg_pkg=fopen("discimg.pkg", "r+b")) == NULL))
      {
      fseek(discimg_fse, 0, SEEK_END);
      num_file=ftell(discimg_fse) / 12;
      fseek(discimg_fse, 0, SEEK_SET);
      for(i = 1; i <= num_file; i++)
        {
        fread(&offset, 4, 1, discimg_fse);
        fread(&dimensione, 4, 1, discimg_fse);
        fread(&padding, 4, 1, discimg_fse);
        if (dimensione > 0)
          {
          printf("Reinserimento file discimg.pkg.%d Offset %X Dimensioni %d byte...", z, offset*2048, dimensione);
          sprintf(stringa, "data\\discimg.pkg.%d", z);
          estratto=fopen(stringa, "rb");
          fseek(discimg_pkg, offset*2048, SEEK_SET);
          fread(&buffer, dimensione, 1, estratto);
          fwrite(&buffer, dimensione, 1, discimg_pkg);
          fclose(estratto);
          printf("[OK]\n");
          z++;
          }
        }
      }
    else printf("Impossibile aprire discimg.pkg\n");
    }
  else printf("Impossibile aprire discimg.fse\n");
  _fcloseall();
  printf("Reinseriti %d file.\n", z);
  getch();
  return 0;
  }

Download Crisis Core: Final Fantasy VII Archiviatore 1.0beta (Eseguibile Win32/Sorgenti C).

Hacking Crisis Core: Final Fantasy VII (PSP) – Parte 2

Pubblicato il 31 marzo 2008 alle 04:03 da Brisma

Come dire: “detto, fatto” :asd:
Visto che la tentazione di smontare questo gioco era forte mi sono messo all’opera e ho scritto il dearchiviatore (ottimizzato per la versione USA, ma dovrebbe andare anche per la JAP). L’uso è semplicissimo: estraete l’eseguibile in un nuova cartella e copiateci all’interno anche i file discimg.fse e discimg.pkg che trovate nella cartella PSP_GAME\USRDIR\ dell’ISO di FF7CC, infine avviate l’eseguibile e vi estrarrà tutti i dati del gioco in una nuova cartella data. Come mio solito fare, trovate il download dell’eseguibile al fondo di questo articolo, subito sotto i sorgenti C :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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
 
Crisis Core: Final Fantasy VII Dearchiviatore 1.0beta
               31/03/2008 - Brisma
 
*/
 
#include <stdio.h>
 
long int offset, dimensione, padding, num_file, num_dummy, i, z = 1;
int buffer[160978944]; // 160978944 è la dimensione del
                       // file più grande (nella versione USA)
char stringa[255];
 
FILE *discimg_fse, *discimg_pkg, *estratto;
 
int main()
  {
  printf("Crisis Core: Final Fantasy VII Dearchiviatore 1.0beta by Brisma\n\n");
  if(!((discimg_fse=fopen("discimg.fse", "rb")) == NULL))
    {
    if(!((discimg_pkg=fopen("discimg.pkg", "rb")) == NULL))
      {
      mkdir("data");
      fseek(discimg_fse, 0, SEEK_END);
      num_file=ftell(discimg_fse) / 12;
      fseek(discimg_fse, 0, SEEK_SET);
      for(i = 1; i <= num_file; i++)
        {
        fread(&amp;offset, 4, 1, discimg_fse);
        fread(&amp;dimensione, 4, 1, discimg_fse);
        fread(&amp;padding, 4, 1, discimg_fse);
        if (dimensione > 0)
          {
          printf("Estrazione file discimg.pkg.%d Offset %X Dimensioni %d byte...", z, offset*2048, dimensione);
          sprintf(stringa, "data\\discimg.pkg.%d", z);
          estratto=fopen(stringa, "wb");
          fseek(discimg_pkg, offset*2048, SEEK_SET);
          fread(&amp;buffer, dimensione, 1, discimg_pkg);
          fwrite(&amp;buffer, dimensione, 1, estratto);
          fclose(estratto);
          printf("[OK]\n");
          z++;
          }
        }
      }
    else printf("Impossibile aprire discimg.pkg\n");
    }
  else printf("Impossibile aprire discimg.fse\n");
  _fcloseall();
  printf("Estratti %d file.\n", z);
  getch();
  return 0;
  }

Download Crisis Core: Final Fantasy VII Dearchiviatore 1.0beta (Eseguibile Win32/Sorgenti C).

Hacking Crisis Core: Final Fantasy VII (PSP) – Parte 1

Pubblicato il 31 marzo 2008 alle 10:03 da Brisma

Beh, chi non conosce questo gioco di questi tempi? Crisis Core è la Killer App per PSP, il prequel perfetto di Final Fantasy VII: finalmente tutta la verità su Zack, Cloud, Aerith e Sephiroth raccontata nei minimi dettagli in un gioco che è indubbiamente un capolavoro. Sebbene la versione PAL non sia ancora uscita (ma l’arrivo dovrebbe esser imminente), SquareEnix non ha ancora annunciato se il titolo verrà localizzato nella lingua nostrana o se rimarrà anche per noi in inglese e quindi mi son detto (sì, state pensando bene)… beh, nel qual caso rimanga in inglese… meglio portarsi avanti con i lavori :asd:

Vediamo subito come si presenta il titolo a livello tecnico. La prima cosa che salterà subito all’occhio è la totale assenza di file e cartelle se non per 2 soli file che contengono il tutto: discimg.pkg e discimg.fse. Il primo file contiene tutti i dati del gioco mentre il secondo è semplicemente la “struttura” con cui accedere al primo. Questo sistema di archiviazione, tra l’altro, non è casuale come può sembrare, infatti la struttura del discimg.fse è molto simile a quella di un altro titolo Squaresoft: Legend of Mana. Ma, vi chiederete voi, come funziona? Il file ha una dimensione pari a 288.276 byte, ed è diviso in 24.023 settori da 12 byte, aventi la seguente struttura:

  • 4 byte: Offset del file all’interno di discimg.pkg (da moltiplicare per 2048 per avere l’indirizzo assoluto, quindi offset*2048).
  • 4 byte: Dimensioni del file da estrarre.
  • 4 byte: Puro, semplice ed inutile padding (00 00 00 00).

Vuolà, tutto qui :D Ora non resta che scrivere un de/archiviatore per questo simpatico formato e proseguire con l’analisi. Stay tuned ;)

Hacking Tales of the World: Radiant Mythology (PSP)

Pubblicato il 29 marzo 2008 alle 09:03 da Brisma

Qualche giorno fa ho provato questo simpatico RPG per PSP e, come mia norma fare, ho subito iniziato ad analizzarlo a livello tecnico con ottimi risultati (per il tempo che gli ho dedicato).

Il gioco si presenta con una classica struttura a cartella (quindi niente mega archivi come Final Fantasy Tactics o Crisis Core: Final Fantasy VII), ma presenta tantissimi file. Questi file altro non sono che degli archivi; si presentano quasi tutti con l’estensione .ARC. Così facendo mi sono messo subito al lavoro per capire che tipo di archivio fossero e che tipo di compressione usasse e, con mia fortuna, con ottimi risultati.

La struttura è la seguente:

  • 0×00 – 8 byte: compare la scritta EZBIND, che rappresenta l’header di questi file.
  • 0×08 – 4 byte: indica il numero di file presenti nell’archivio.
  • 0×0C – 4 byte: 40 00 00 00 non ha un significato preciso, ma fa parte dell’header di ogni file.

Ora inizia il bello, per N volte (dove N è il numero di file presenti nell’archivio) si ripeteranno questi 16 byte:

  • 4 byte: offset a cui inizia il nome dell’archivio (terminante per 0×00).
  • 4 byte: dimensioni dell’archivio da estrarre.
  • 4 byte: offset dell’archivio da estrarre.
  • 4 byte: sconosciuti, ma analizzando altri file ho notato che variano al variare della dimensione dei file.

Questa è la struttura di questi file .ARC (che sono presenti anche in altri giochi PSP). Fortunatamente in TOTW gli archivi compressi contenuti nei file .ARC non sono poi così tanto misteriosi come sembra, infatti si tratta di semplicissimi file GZip (come già avvenuto in Final Fantasy VII). Infatti basta rinominare i file con estenzione .gz e potrete estrarne il contenuto bello che decompresso, pronto da esser dumpato e tradotto :P
Inoltre, tramite il semplice GZip potrete ricomprimere i file estratti e reinserirli nell’archivio senza il minimo problema (in quanto la compressione è proprio lei, i file ricompressi non risultano né più piccoli né più grandi degli originali).

Download GZip 1.2.4 (Eseguibile Win32).

Beh, con questo è tutto per ora, anche perché non ho fatto ulteriori test :P