Difference between revisions of "Uodemo.dat"

From UODemo Wiki
Jump to: navigation, search
m
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
This is a custom made archive file for the Ultima Online Gold Demo.
+
This is a custom made archive file for the Ultima Online Gold Demo.  To learn about the contents of this file please go to the [[.rundir]] section.
  
 
The archive is divided in 2 area's:
 
The archive is divided in 2 area's:
  header area (dynamic in size, the size is a multiple of 280 bytes)
+
header area (dynamic in size, the size is a multiple of 280 bytes)
  data area (dynamic in size)
+
data area (dynamic in size)
  
 
The header area consists of minimum 1 header and can contain up to 3000 files.  More files are simply not supported by the code.  If the filename in the header is equal to "@@@.@@@" then the end of the header area is reached.  The end of the header area marks the beginning of the data area.
 
The header area consists of minimum 1 header and can contain up to 3000 files.  More files are simply not supported by the code.  If the filename in the header is equal to "@@@.@@@" then the end of the header area is reached.  The end of the header area marks the beginning of the data area.
  
 
The file is encrypted using the GOST block cipher.
 
The file is encrypted using the GOST block cipher.
Each header is encrypted seperatly, the data of each file is encrypted in blocks of 4KB (4096 bytes).
+
Each header is encrypted separately, the data of each file is encrypted in blocks of 4KB (4096 bytes).
The same encryption/decryption key is used for the entire arhive.
+
The same encryption/decryption key is used for the entire archive.
  
 
One header entry is 280 bytes in size.
 
One header entry is 280 bytes in size.
  
struct datheader
+
struct datheader
{
+
{
  char filename[260];      // 260 is MAX_PATH in Windows
+
  char filename[260];      // 260 is MAX_PATH in Windows
  int32 filepointer;      // this pointer is relative from the beginning of the data area
+
  int32 filepointer;      // this pointer is relative from the beginning of the data area
  int32 maximumsize;      // if set, the file can grow until this size is reached
+
  int32 maximumsize;      // if set, the file can grow until this size is reached
  int32 isreadyonly;       // 0 = writeable, <> = read-only
+
  int32 isreadonly;       // 0: writeable, <>0: read-only
  int32 encryptedsize;    // encrypted filesize (not the actual filesize)
+
  int32 encryptedsize;    // encrypted file size (not the actual file size)
  int32 fileposition;      // internally used by [[uodemo.exe]], not relevant for reading from the archive
+
  int32 fileposition;      // internally used by [[uodemo.exe]], not relevant for reading from the archive
};
+
};
  
The actual filesize can be obtained by reading the last int32 in the file data after decryption.
+
The actual file size can be obtained by reading the last int32 in the file data after decryption.
This means that for a 0 length file, the encryptedsize will be atleast be 4 bytes (size of one int32).
+
This means that for a 0 length file, the encrypted size will be atleast be 4 bytes (size of one int32).
 +
Also note that it's recommended (but not required) for the encrypted file size to be a multiple of 8 due to how the GOST cipher works.
 +
 
 +
There are programs out there to extract the files from this DAT file.
 +
DemoDat v0.34 [http://web.archive.org/web/19990127212423/uox.stratics.com/files.html]
 +
Ultima Online uodemo.dat extractor 0.1b [http://aluigi.altervista.org/papers.htm#others-file]
 +
 
 +
The DemoDat utility can nowhere be found on the internet, if you have this utility let us know.
 +
 
 +
While it is technically possible to replace and add files in this archive file, no one has officially done the effort to do so.

Latest revision as of 09:34, 24 August 2009

This is a custom made archive file for the Ultima Online Gold Demo. To learn about the contents of this file please go to the .rundir section.

The archive is divided in 2 area's:

header area (dynamic in size, the size is a multiple of 280 bytes)
data area (dynamic in size)

The header area consists of minimum 1 header and can contain up to 3000 files. More files are simply not supported by the code. If the filename in the header is equal to "@@@.@@@" then the end of the header area is reached. The end of the header area marks the beginning of the data area.

The file is encrypted using the GOST block cipher. Each header is encrypted separately, the data of each file is encrypted in blocks of 4KB (4096 bytes). The same encryption/decryption key is used for the entire archive.

One header entry is 280 bytes in size.

struct datheader
{
  char filename[260];      // 260 is MAX_PATH in Windows
  int32 filepointer;       // this pointer is relative from the beginning of the data area
  int32 maximumsize;       // if set, the file can grow until this size is reached
  int32 isreadonly;        // 0: writeable, <>0: read-only
  int32 encryptedsize;     // encrypted file size (not the actual file size)
  int32 fileposition;      // internally used by uodemo.exe, not relevant for reading from the archive
};

The actual file size can be obtained by reading the last int32 in the file data after decryption. This means that for a 0 length file, the encrypted size will be atleast be 4 bytes (size of one int32). Also note that it's recommended (but not required) for the encrypted file size to be a multiple of 8 due to how the GOST cipher works.

There are programs out there to extract the files from this DAT file.

DemoDat v0.34 [1]
Ultima Online uodemo.dat extractor 0.1b [2]

The DemoDat utility can nowhere be found on the internet, if you have this utility let us know.

While it is technically possible to replace and add files in this archive file, no one has officially done the effort to do so.