IPB

Добро пожаловать, гость ( Вход | Регистрация )

> The Settlers (все части), Запнулся на сжатии
Siberian GRemlin
Jun 6 2007, 15:58
Сообщение #1


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Итак, пока есть время перед экзаменами и играть поднадоело + зависоны, я решил поковырять четвёртых Поселенцев, о чём давно мечтал. А точнее начал пока с формата [.LIB]. Но, вот? незадача, я думал, там обычный ZLib, но разжать не смог =( Порылся в файлах, нашёл RTComp.dll логично подумал, что Comp от Compress и, кажется, был прав в этом файле видны строчки с "zlib". Но почему-то у меня не получилось разжать файл. Погуглил на RT Compression и сокращения, нашёл только какую-то чушь (вроде) про Real-Time Compression.

Работаю с последней английской версией игры и версией от 1С. Демку можно скачать с AG.ru
CODE
program Settlers4_LIB_Info;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  Windows,
  Classes;
type
  TFAT = record
    Unknown1,
    Unknown2,
    Unknown3,
    FolderCount,
    Unknown5,
    FilesCount: Dword;
  end;
  TFileInfo = record
    Offset,
    PackedSize,
    UnPackedSize,
    FolderNum,
    IsPacked,
    CheckSum: Dword;
  end;
  TFile = record
    Name:String;
    Info:TFileInfo;
  end;
var
  MSTR: TMemoryStream;
  FATOffset: Dword;
  F:TFAT;
  Folders: array of string;
  Files: array of TFile;
  i,j: dword;
  outf: textfile;
begin
  Assign(outf,'D:\Games\The Settlers IV\gfx.txt');
  ReWrite(outf);
  MSTR:=TMemoryStream.Create;
  Mstr.LoadFromFile('D:\Games\The Settlers IV\gfx.lib');
  Mstr.Position:=Mstr.Size-4;
  Mstr.ReadBuffer(FATOffset,4);
  WriteLn(outf,'Header Offset: '+IntToHex(FATOffset,4));
  Mstr.Position:=FATOffset;
  Mstr.ReadBuffer(F,sizeof(f));
  WriteLn(outf);
  WriteLn(outf,'Unknown1: '+IntToStr(F.Unknown1));
  WriteLn(outf,'Unknown2: '+IntToStr(F.Unknown2));
  WriteLn(outf,'Unknown3: '+IntToStr(F.Unknown3));
  WriteLn(outf,'Folder Count: '+IntToStr(F.FolderCount));
  WriteLn(outf,'Unknown5: '+IntToStr(F.Unknown5));
  WriteLn(outf,'Files Count: '+IntToStr(F.FilesCount));
//папки
  SetLength(Folders,F.FolderCount);
  for i:=1 to F.FolderCount do begin
    j:=1;
    SetLength(Folders[i-1],1);
    Repeat
      Mstr.ReadBuffer(Folders[i-1][j],1);
      inc(j);
      SetLength(Folders[i-1],Length(Folders[i-1])+1);
    Until ord(Folders[i-1][j-1])=0;
    SetLength(Folders[i-1],Length(Folders[i-1])-2);
  end;
//файлы
  SetLength(Files,F.FilesCount);
  for i:=1 to F.FilesCount do begin
    j:=1;
    SetLength(Files[i-1].Name,1);
    Repeat
      Mstr.ReadBuffer(Files[i-1].Name[j],1);
      inc(j);
      SetLength(Files[i-1].Name,Length(Files[i-1].Name)+1);
    Until ord(Files[i-1].Name[j-1])=0;
    SetLength(Files[i-1].Name,Length(Files[i-1].Name)-2);
  end;
//данные
  for i:=1 to F.FilesCount-1 do begin
    Writeln(outf);
    Mstr.ReadBuffer(Files[i-1].Info,sizeof(Files[i-1].Info));
    if F.FolderCount>1 then
    WriteLn(outf,IntToStr(i)+': '+Folders[Files[i-1].Info.FolderNum]+'\'+Files[i-1].Name)
    else
    WriteLn(outf,IntToStr(i)+': '+Folders[0]+'\'+Files[i-1].Name);
    WriteLn(outf,Format('Offset: %s Packed Size: %s UnPacked Size: %s Compressed: %s ?ChekSum?: %s',[IntToHex(Files[i-1].Info.Offset,8),IntToHex(Files[i-1].Info.PackedSize,8), IntToHex(Files[i-1].Info.UnPackedSize,8),IntToHex(Files[i-1].Info.IsPacked,1), IntToHex(Files[i-1].Info.CheckSum,8)]));
  end;
  Mstr.Free;
  CloseFile(outf);
  WriteLn('Complete!');
  Readln;
end.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
-=CHE@TER=-
Oct 3 2018, 18:31
Сообщение #2


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



Там, действительно, какая-то модификация LZW, пришлось на ассемблере выдирать.
unlibs4.zip
Я так задолбался выдирая распаковку (там же ср@ные классы, где регистр ecx указывает на структуру, в которой хрен пойми что лежит - т.е. ты не можешь вот так просто взять и выдрать код распаковки), что на расшифровку забил. В demo ничего не шифровали, так что сделай при распаковке перенаправление вывода в файл (unlibs4.exe filename.lib > output.txt) и смотри, есть ли там "Warning: encrypted file, but decryption not supported - saving as is." и, если есть, то выложи куда-нибудь самый мелкий такой архив посмотреть.

CODE
#pragma pack(push, 1)
typedef struct {
  DWORD headsize; // размер заголовка со всеми таблицами
  DWORD revision; // должно быть равно 0x1000 иначе игра считает архив битым
  DWORD dnamelen; // длина блока с именами директорий
  DWORD dcounter; // количество директорий в блоке
  DWORD fnamelen; // длина блока с именами файлов
  DWORD fcounter; // количество файлов
} headinfo;

// после этого идут char[dnamelen] и char[fnamelen]
// затем описание файлов fcounter раз:

typedef struct {
  DWORD floffs; // смещение файла, минимальное 1 (.LIB всегда должен начинаться с нулевого байта)
  DWORD pksize; // упакованный размер
  DWORD unsize; // распакованный размер (0 если не упакован)
  DWORD dindex; // номер директории в массиве строк выше
  DWORD xflags; // флаги: 1 - упакован; 2 - зашифрован (расшифровывать, ПЕРЕД, распаковкой)
  DWORD crcsum; // контрольная сумма (16 бит), может быть ноль (только для запакованных?)
} fileinfo;
#pragma pack(pop)
Распаковка идёт так:
1) Проверка контрольной суммы, если она не ноль.
2) Если контрольная сумма совпала или ноль, то расшифровать если (xflags & 2).
3) Если задан флаг (xflags & 1), то распаковать.
В принципе, игра не использует файлы из архива, если нужные уже есть на диске в соответствующем подкаталоге - т.е. достаточно распаковать и всё, можно переводить.

P.S. Как экзамен-то сдал? (*улыбается*)
P.P.S. Если не сложно, можешь чего-нибудь на копилку закинуть - мы на этой неделе как раз оплачивать хостинг будем. Спасибо.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме
Siberian GRemlin   The Settlers (все части)   Jun 6 2007, 15:58
Siberian GRemlin   Поковырялся ещё. Оказалось в GFX.LIB последней анг...   Jun 7 2007, 04:29
jTommy   Раздобыл полную версию. Заодно и пятую часть скача...   Jun 8 2007, 13:11
Siberian GRemlin   Ты уверен, что в пятой zlib? т.к. на wiki.xentax б...   Jun 14 2007, 03:59
jTommy   Ты уверен, что в пятой zlib? т.к. на wiki.xentax б...   Jun 14 2007, 20:04
Siberian GRemlin   Я думал, ты меня сразу носом натыкаешь! =) Я с...   Jun 15 2007, 05:59
Siberian GRemlin   Вот, на нашем родном языке =) http://www.shokhirev...   Jun 17 2007, 13:48
Siberian GRemlin   Вернулся к разбору четвёртой части. Демо-версия. ...   Oct 3 2018, 07:03
-=CHE@TER=-   Там, действительно, какая-то модификация LZW, приш...   Oct 3 2018, 18:31
Siberian GRemlin   Спасибо. Наконец-то адаптирую переводы под последн...   Oct 3 2018, 18:58
Siberian GRemlin   Можешь проверить - у тебя кириллица будет в демке ...   Oct 5 2018, 15:03
-=CHE@TER=-   Проверил. Закинул твой файл в демку, меню стало на...   Oct 5 2018, 19:44
Siberian GRemlin   Спасибо. Вроде бы разобрался. Теперь надо проверит...   Oct 5 2018, 20:51


Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 27th April 2024 - 10:29