Lada Racing Club "pak.bin" format (Old Dagor Engine, PC, Windows XP)

Extraction and unpacking of game archives and compression, encryption, obfuscation, decoding of unknown files
Kikimorok
Posts: 1
Joined: Thu Jan 26, 2023 11:47 pm

Lada Racing Club "pak.bin" format (Old Dagor Engine, PC, Windows XP)

Post by Kikimorok »

Greetings!
Recently I came across a very interesting game, Lada Racing Club (2006), which contains a 3D model of Moscow. At the same time, the historical center itself is captured, which has a certain cultural significance. Based on such material, it is quite possible to create a huge variety of post-Soviet settlements - Moscow, Kiev, provincial towns - and so on.
Its files are packed in the "pak.bin" format and I have managed to find out that:
1. Game archives are not encrypted.
2. The game uses the old non-public Russian Dagor Engine (versions 0.7 - 2.5).
3. The game archive contains DDS texture files and files in the "engine" model format. The analysis of the file by viewing the code itself confirmed this. On the other hand, Dragon Unpacker could not extract anything (but he still managed to get some badly damaged textures from a neighboring file :? ).
4. Researchers of the past say that the process is not impossible (the extractor was once created but is lost since 2008).
I am primarily interested in textures in DDS format (or in any other). If someone helps me with format analysis or - best of all - extracting the images themselves, then I will be very grateful. ;)
An example arhive is attached below.
https://dropmefiles.com/UORav - map (?) file
https://dropmefiles.com/jlX1D - textures bank (?) file.
Passwords are 123. To download a file, just click the arrow.
grandshot
Posts: 42
Joined: Mon Jun 07, 2021 8:20 pm

Re: Lada Racing Club "pak.bin" format (Old Dagor Engine, PC, Windows XP)

Post by grandshot »

I research this long time ago. Archive format is very simply:
//------------------------------------------------
//--- 010 Editor v10.0.2 Binary Template
//
// File:
// Authors:
// Version:
// Purpose:
// Category:
// File Mask:
// ID Bytes:
// History:
//------------------------------------------------
string getName( uint offsetName )
{
local string temp;
SPrintf( temp, "%s", ReadString( offsetName + 12 ) );
return temp;
};

struct HEADER
{
byte sign[4];
uint32 sizeOfTables;
uint32 numTables;
} header;

struct TABLE
{
uint32 offsetName <format=hex, comment=getName>;
uint32 offsetFile <format=hex>;
uint32 sizeFile;
} table[ header.numTables];