Сколько байт в килобите? — 1024

+--------------------------------------------------------------------------------------------------------------------------[release: 07.11.04]----+
|
|
|
|
|
|
|
  _|_|    _|_|_|    _|_|    _|_|_|    _|_|    _|  _|    _|  _|_|    _|_|_|      _|  _|    _|_|_|
_|      _|  _|  _|  _|  _|  _|        _|  _|      _|_|_|_|  _|  _|  _|        _|_|_|_|_|  _|    
_|      _|_|_|_|_|  _|  _|  _|_|      _|_|    _|  _| |  _|  _|_|    _|_|_|      _|  _|    _|_|_|
_|      _|  _|  _|  _|  _|  _|        _|      _|  _|    _|  _|          _|    _|_|_|_|_|      _|
  _|_|    _|_|_|    _|_|    _|_|_|    _|      _|  _|    _|  _|      _|_|_|      _|  _|    _|_|_|
|
|
|
|
|
|
|
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
+------------------------------------------------------[0x08: Games в раzрезе 0x01]-------------------------------------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

Это незапланированое продолжение статьи 0x05 из CodePimps #4. Бывает, что уйдешь с головой в работу над чем-то одним, потратишь много времени и сил, но добъешься лишь незначительных успехов. А, ведь, иногда стоит поднять голову и посмотреть по сторонам. Так и я угробил почти 2 месяца на препарирование ГЭГ-2, часами разбирал дизассемблированный текст, но результаты были далеко не впечатляющими. Потом я решил сделать то, что нужно было сделать с самого начала. А именно, посмотреть, нет ли уже готовых наработок в этой области. Недолгие поиски привели меня на http://www.extractor.ru/. Чего там только нет! Но распаковщик для этой игрушки я так и не нашел. Я начал искать другой квест, чтобы попробовать его "разодрать" на ресурсы. И игрушка нашлась - Woodruff and Schniblle of Azimuth от небезызвестной компании Sierra.

Сразу скажу, что основной моей задачей стояла распаковка архива, а не применение результатов распаковки. Поэтому, приступим непосредственно к препарации архива.

Заголовку архива предшествует пара байт, назначение которых для нас пока не имеет значение. Дальше идут записи о файлах длиной по 22 байта, 12 из которых отведено под само имя файла, написанное в верхнем регистре. Если все шестнадцатиричные коды записать столбиком по 22 байта в строке, то мы увидим, что 13й и 22й байты всегда равны $00. Запомним это и в дальнейшем будем применять для контроля валидности формата архива. Оставшиеся 8 байт содержат в себе смещение и размер файла или смещения начала и конца файла, одним словом, информация, знать которую нам просто необходимо.
<имя> 00 6B 01 00 00 00 1E 00 00 00
<имя> 00 D3 00 00 00 6C 1F 00 00 00
<имя> 00 FF 7D 00 00 40 20 00 00 00
<имя> 00 F9 8A 00 00 40 9E 00 00 00
<имя> 00 A1 8E 00 00 3A 29 01 00 00
<имя> 00 A1 13 01 00 DC B7 01 00 00
...................................
<имя> 00 A6 04 00 00 20 AE 35 01 00
Из оставшихся 8 байт нужно "выудить", как минимум, 2 числа (смещение и размер). Вполне логично предположить, что там находятся именно 2 четырехбайтных числа, т.к. двубайтные целые числа не позволят создавать большие архивы (правда, можно считать размер, смещение в каких-то единицах, например, килобайтах, но тогда в архиве было бы много пустого пространства, что не наблюдается в действительности), а использовать трехбайтное представление целых чисел нецелесообразно.

А если вспомнить, что четырехбайтные целые числа в памяти хранятся в обратном порядке, тогда становится сразу видно, что $1E00+$016B=$1F6B, а $1F6B+$0001=$1F6C. Т.е. если обозначить левое число за x, правое - за y, а за x(i) обозначить число x для i-го файла, тогда получается формула y(i+1)=y(i)+x(i)+$0001. Выходит, что за y мы приняли смещение, а за x - размер файла. А теперь, если возвратиться к первым двум байтам архива, то окажется, что в них хранится число файлов в архиве. На основе этого несложно написать распаковщик (в принципе, и упаковщик тоже).


Вот и все, теперь благодарности:

Спасибо создателю сайта www.extractor.ru за интересный ресурс, который стоит посетить даже просто так.
Спасибо EVulture из команды Brotherhood of Illusions за помощь в исследовании архивов.
Спасибо тебе, читатель, за то, что ты нашел время и желание прочитать мою статью.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+-----[content]-----------------------------------------------------------------------------------------------------------------------[mail us]-----+