Todos los punteros que salen en el archivo son relativos a su propia posición, por ejemplo, si el puntero está al offset 16 del archivo y el valor del puntero es 256, el offset al que apunta es 16 + 256 = 276.
Cabecera del archivo BIN:
struct Header
{
uint32_t unk1; // Siempre 0x00000007 (???)
uint32_t binFileSize; // Tamaño del archivo .BIN
uint32_t nFiles; // Numero de archivos
uint32_t unk2; // Siempre 0x00010000 (???)
uint32_t ptrPathPtrTable; // Puntero a la tabla con punteros a las rutas
}
Después de la cabecera vienen "nFiles" estructures de estas:
struct FileEntry
{
uint32_t fileSize; // Tamaño del archivo
uint32_t fileId; // Identificador del archivo. Este valor lo puedes encontrar en los archivos .h.
uint32_t unk2; // Ni idea, creo que tiene el mismo valor en todos los archivos del mismo contenedor.
uint32_t unk3; // Ni idea, creo que tiene el mismo valor en todos los archivos del mismo contenedor.
uint32_t unk4; // Ni idea, creo que tiene el mismo valor en todos los archivos del mismo contenedor.
uint32_t fileOffset; // Offset del archivo en el archivo .000
uint32_t unk5; // Siempre 0x00000000 (???)
}
Donde apunta el puntero a la tabla de rutas, hay "nFiles" punteros (uint32_t) a las rutas de los archivos. Estas rutas son rutas absolutas, es decir, tienen la unidad y todo el arbol completo de directorios, por ejemplo: "x:/directorio1/directorio2/archivo.edb".
Estas rutas estan obfuscadas con este simple procedimiento:
c = (char)(o + 22 - fileIdx - i);
c = Caracter ASCII.
o = Byte leido desde el archivo.
fileIdx = Índice del archivo.
i = Número de carácter (0 para el primer carácter, 1 para el segundo, etc.)
Hay que tener en cuenta que el resultado es de 1 byte.
La ruta termina cuando el carácter es 0x00 (son cadenas como las de C).
(No se si se entiende mucho, sobretodo la última parte
).