Метаданные декомпрессии MS-XCA указывают вне сжатого байтового массива - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужно распаковать файл модели данных, встроенный в файл xlsx.Предполагается, что файл использует формат файла MS-XLDM и должен состоять из 3 разделов (заголовок модели данных электронной таблицы, файлы и виртуальный каталог), и сжат только средний.Первый и последний раздел представляют собой xml с кодировкой unicode / utf-16, предположительно (каждый второй байт равен 0x00, а содержимому предшествуют 0xFF и 0xFE).Среднему файлу предшествует небольшой фрагмент xml. Подробнее о структуре файла.

Теперь в соответствии с документацией файл должен быть сжат с использованием Xpress-сжатия, указанного здесь , который использует сжатие LZ77и кодировка DIRECT2.

Теперь перейдем к сути.Насколько я понимаю, всегда должна быть 4-байтовая битовая маска, которая указывает, должны ли байты в соответствующей позиции быть данными или метаданными 1: 1.

Например, с учетом гипотетической 8-битной битовой маски,Строка «ABCABCDEF» сжимается как (0,0) A (0,0) B (0,0) C (3,3) D (0,0) E (0,0) F.Его битовая маска будет b'00010001 '(0x11).

Если предполагается, что данная позиция является метаданными, следует прочитать как минимум 2 байта.Из 16 битов первые 13 смещены, а последние 3 - это длина (если последний бит не равен 1, тогда должен быть прочитан другой байт).

Итак, теперь на конкретном примере, с которым я борюсь.Первые 2 блока являются простыми.

Первый - это:

....<Load xmlns="http://schemas.micr

Первые 4 байта (точки) имеют размер 0x00, поэтому последующие 32 байта являются несжатыми.Следующий блок выглядит примерно так:

....osoft.com/analysisservices/2003/

Теперь третий блок - это то место, где я теряюсь

w±engine":ddl27/"/2G_W?%g100gO8eðg_‡_)§è.Õ®]›‡o

Я не уверен, где именно заканчивается блок, потому что, когда я начал считать каждые 36байты после тех первых через некоторое время я достигну части потока байтов, которая должна быть распакована, и она не будет выровнена.

Итак, вернемся к 3-му чанку.Для него используется битовая маска 0x77 0xB1 0x04 0x01 .

или в двоичном формате 01110111 10110001 00000100 00000001 .Я попытался выровнять это с байтами, и это не имело никакого смысла.Понятно, что слово engine «несжато и соответствует предыдущим блокам, потому что быстрый поиск в Google показал мне результат с пространством имен» http://schemas.microsoft.com/analysisservices/2003/engine".

01110111 10110001 00000100 00000001
engine" :ddl27 /"/2G_W ?%g100gO8eðg_‡_)

Это заставило меня подумать, что, возможно, байты в битовой маскев обратном порядке.Для меня это стало более логичным.

00000001
engine"

Если это так, то метаданные должны быть 0x0B 0x02 .

Или в двоичном формате 00001011 00000010 .Поэтому, если я разделю его, первые 13 бит составляют смещение метаданных.И длина составляет 010 + постоянное смещение 3 = 2 + 3 = 5.

Before 0000101100000
Invert 1111010011111
Decimal -353

Но при просмотре 353 байтов он попадает в раздел xml несжатого раздела и должен возвращать символы вкруглые скобки (ame).Это не имеет смысла для меня и, вероятно, неправильно.

Вот файл , который я пытался распаковать.

...