CoV/PCU archivum megnyitasa

Fórumok

Talan emlekeztek a CoV cimu ujsagra (aztan PC Ultra volt egy evig). Mar a PCU idokben jelentek meg CD-k, CDU neven. Par szamon az osszes addigi CoV/PCU es egyeb Com-Ware termek szovege rajta volt. Most megtalaltam a wincsimen. dosbox alatt siman megy, mountolni kell a konyvtarat kulon meghajtokent es el is indithato. Maga az archivum egy 40M file. Nezegetni lehet, de az egeszet szeretnem dumpolni, viszont lovesem sincs, mivel alljak neki. Valahogy nem hiszem, hogy a Doom WAD felepitest hasznaltak, bar lehet. file parancs sem ismeri fel, milyen formatum lehet.

A konvytarlista:
-rw-r--r-- 1 celtic celtic 307978 2002 márc 31 adv.scx
-rw-r--r-- 1 celtic celtic 56 szept 25 21.35 cdu.bat
-rw-r--r-- 1 celtic celtic 117224 2002 márc 31 cdultra.art
-rw-r--r-- 1 celtic celtic 773 2002 márc 31 cdultra.com
-rw-r--r-- 1 celtic celtic 967 2002 nov 29 cdultra.pif
-rw-r--r-- 1 celtic celtic 37411065 1998 febr 13 cdultra.wad
-rw-r--r-- 1 celtic celtic 17742 2002 márc 31 cdu.vxd
-rw-r--r-- 1 celtic celtic 21777 2002 márc 31 cplay.vxd
-rw-r--r-- 1 celtic celtic 34177 1994 febr 2 mouse.com
-rw-r--r-- 1 celtic celtic 841 1994 febr 2 mouse.ini
-rw-r--r-- 1 celtic celtic 34429 1994 febr 2 mouse.sys
-rw-r--r-- 1 celtic celtic 41315 2002 márc 31 unzip.vxd

A vxd fileok MS-DOS exe-k, a cdu.bat subst-vel mountolja (de a dosbox mount parancsa is jo) es elinditja a cdultra.com filet, ami utana (gondolom), inditja a vxd-ket, amik kibontjak a wad filet. De hogyan? Van ra otlet?
Itt az egesz cucc, tar.gz-ben.

Hozzászólások

Valami wad szerkesztovel nem nezted meg? miert ne lehetne a doom wad formatuma? Lattam mar mashol is.

Hallod, a .wad fájl felépítése tök egyszerű.
A fájl végén vannak a fájl-rekordok.
Ott vannak a fájlnevek, nyílván a fájlnevek után a kezdőpozíció, méret, stb.
A fájl utolsó négy bájtja szerintem egy longint, ami egy pointer a fájl-táblázat kezdetére a .wad-ban.
Ha tudsz programozni, szvsz fél-egy óra alatt ki lehet találni próbálgatással a fájl-rekordok felépítését.
Aztán az más kérdés, hogy a .wad-ban levő fájlok tömörítve vannak-e, esetleg titkosítva, vagy mi van velük, mert nyers .txt tartalmat nem láttam a .wad-ban.
(Mivel ott az unzip.vxd, arra tippelek, hogy a .wad-ból ki kell szedni az egyes fájlokat, és unzippelni - de lehet, hog ez nem így van.)
A cdplay.vxd meg egyebek biztos, hogy tömörítve vannak valamilyen exepackerrel egyébként, de nem UPX-szel, az is biztos.
Most így hirtelen nem emlékszem, hgoy akkoriban miylen exepackerek voltak divatban, majd még nézegetem a csomagot.

Na előszedtem doxboxba a jó kis régi dos navigatort meg borland c-t, hátha. :)

A fileneveket en is lattam a vegen, de ennyi, amire jutottam. Programozni nem tudok, sot, kimondottam mumusom a kerdes. (most van egy java targyam, elore rettegek, meg egy szoftver-szigorlat, aminek harmadszor futok neki....)

Exepacker: file parancs szeriunt:
unzip.vxd: MS-DOS executable, MZ for MS-DOS, WWPACK compressed

De ismeretlen ez a wwpack. De nagyon halas lennek, ha rajonnel :) Nem tudom, mi modon fejezem ki halamat, de megtalaljuk a modjat, azt hiszem.

--
http://www.micros~1

Ez az unzip.vxd valami unzip klón 1996-ból, nevezd át .exe-re és "megnevezi" magát :). Elvileg ezzel kellene kicsomagolni a wad-ból a fileokat, de még nem sikerült, mert hiányolja az End-Of-Central-Directory-Signature-t, szóval tudja, hogy zip, csak azt nem, hogy mikből áll. Még szórakozok vele (de csak picit)

De van egy fapados workaround a txt-t kinyerésére :D. Szóval elindítod a cuccot, megjelenítesz egy cikket, majd egy másik ablakban belekukkantasz a könyvtárába és ott $tmpfile.$$$ néven ott a pure txt cucc. Ezt lemásolod, nyitod a másik cikket stb... (windows alatt az alt+tab-os váltásra igencsak sokat kell várni, szóval no panic :) Linux alatt is meglesem majd.)

Ja, nem pkunlite, nem UPN (Unpack), nem wpexpand :), hirtelen ezeket a exe kicsomagolókat találtam, de nem váltak be.

Igen, hat en is addig jutottam a post megirasa elott, hoyg atneveztem exe-re es megprobaltam megnyitni vele a wad filet (vagy ezt nem irtam fent). Es en is a hibauzenetig jutottam el.

Ugyanilyen fapados, ha megnyitom a cikket es ranyomok a Lemez ikomnra, lementi.

Igazabol abban remenykedtem, hatha feltunk az az user, aki annak idejen ezt irta. Sztem a Scanner diskmag keszitoi kozul lehetett valaki.

--
http://www.micros~1

A cdultra.wad állomány nem a doom-nál megszokott IWAD vagy PWAD, hanem egy független találmánynak tűnik. A szerkezetét "visszafejtettem", az alábbi:

  • Az utolsó két byte egy little endian short, amely azt mondja meg, hány bejegyzés található az indexben.
  • Az index a file végén található, az utolsó két byte-ot közvetlenül megelőzően.
  • Az index egy bejegyzése négy mezőből áll:
    1. filenév hossza 1 byte-on
    2. filenév (12 karakterre paddelve NUL-lal, de nem NUL-terminált)
    3. adattartalom kezdő-offszet-je (4 byte-os little endian unsigned)
    4. adattartalom hossza (ugyanúgy)
  • Amennyiben az offszet és a hossz 0xFFFFFFFF, úgy a filenév egy relatív könyvtárnevet tartalmaz.
  • A relatív könyvtárnév lehet ".." is. Az indexbeli bejegyzések sorrendje számít, a könyvtárfa mélységi bejárását adja meg -- ezért lehetnek a könyvtárnevek relatívak.

A fentieknek megfelelően az alábbi "program" (tág értelemben használva a szót) kibontja a cdultra.wad-ot. Futtatandó a cdultra.wad mellett állva, a könyvtárfa a "wad-extract" alkönyvtár alá kerül.

Az igazi cumi azonban csak itt következik, ugyanis az egyes file-ok valamivel tömörítve vagy kódolva vannak, amiről gőzöm sincs. Ehhez valószínűleg vissza kellene fejteni (de legalábbis "diszasszemblálni") a DOS-os diskmag programot.

Nahát akkor itt a "forrás".


/* ABSOLUTELY NO ERROR CHECKING, NO PORTABILITY, NO DATA VALIDATION */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>

struct idx
{
  char name[13];
  unsigned pos, size;
};

int
main(void)
{
  FILE *f;
  short unsigned num_entries;
  unsigned i;
  struct idx *toc;

  f = fopen("cdultra.wad", "r");
  fseek(f, -2, SEEK_END);
  fread(&num_entries, 2, 1, f);

  toc = malloc(num_entries * sizeof *toc);

  fseek(f, - (2 + num_entries * (1 + 12 + 4 + 4)), SEEK_END);
  for (i = 0; i < num_entries; ++i) {
    char unsigned fnamelen;

    fread(&fnamelen, 1, 1, f);

    fread(toc[i].name, 1, 12, f);
    toc[i].name[fnamelen] = '\0';

    fread(&toc[i].pos,  4, 1, f);
    fread(&toc[i].size, 4, 1, f);
  };

  mkdir("wad-extract", 0700);
  chdir("wad-extract");

  for (i = 0; i < num_entries; ++i) {
    if (toc[i].pos == 0xFFFFFFFFu) {
      if (0 == strcmp(toc[i].name, "..")) {
        fprintf(stderr, "%4u: leveling up\n", i);
        chdir("..");
      }
      else {
        fprintf(stderr, "%4u: making and entering directory \"%s\"\n", i,
            toc[i].name);
        mkdir(toc[i].name, 0700);
        chdir(toc[i].name);
      }
    }
    else {
      char unsigned *data;
      FILE *dataf;

      fprintf(stderr, "%4u: extracting \"%s\" (%u)\n", i, toc[i].name,
          toc[i].size);

      data = malloc(toc[i].size);

      fseek(f, toc[i].pos, SEEK_SET);
      fread(data, 1, toc[i].size, f);

      dataf = fopen(toc[i].name, "w");
      fwrite(data, 1, toc[i].size, dataf);
      fclose(dataf);

      free(data);
    }
  }

  return 0;
}