Как Opera Turbo сжимает данные (кеш)?

У меня браузер Opera с включенным Opera Turbo. Это прокси, который сжимает HTML в меньший формат. У меня есть файл из кеша оперы, который был сжат турбо от 2000 кб до 500 кб. Как я могу распаковать этот файл в читаемую форму (исходный файл почти не имеет HTML-тегов, только 8-битный текст "<p>"теги и html заголовок / нижний колонтитул)?

Вот пример такого файла:

.opera$ hexdump -C cache/turbo/g_0000/opr00003.tmp
00000000  78 da 6c 8f bf 4e c4 30  0c c6 67 fa 14 26 48 6c  |xзl▐©Nд0.фgЗ.&Hl|
00000010  a1 1c 12 d3 25 1d f8 37  82 54 f1 02 69 63 48 74  |║..с%.Ь7┌TЯ.icHt|
00000020  69 52 12 97 d2 b7 ed 88  40 80 b8 05 06 06 7a 57  |iR.≈р╥М┬@─╦...zW|
00000030  09 21 84 27 fb f3 cf 9f  6d 61 a8 71 45 26 0c 2a  |.!└'ШСо÷ma╗qE&.*|
00000040  5d 64 3b a2 41 52 60 88  5a 8e 77 9d bd 97 ec 34  |]d;╒AR`┬Z▌w²╫≈Л4|
00000050  78 42 4f fc 7a 68 91 41  3d 57 92 11 3e 50 be 99  |xBOЭzh▒A=W▓.>P╬≥|
00000060  5d 42 6d 54 4c 48 b2 b7  5e 87 3e f1 c5 d1 f1 82  |]BmTLH╡╥^┤>ЯеяЯ┌|
00000070  fd 78 79 d5 a0 64 1a 53  1d 6d 4b 36 f8 5f 26 ef  |Щxyу═d.S.mK6Ь_&О|
00000080  eb 71 fd f5 f8 97 5d e1  d0 87 a8 d3 ff 20 59 72  |КqЩУЬ≈]Ап┤╗сЪ Yr|
00000090  58 94 5d 4a 56 41 f0 40  06 e1 12 09 f6 1b ad 92  |X■]JVAП@.А..Ж.╜▓|
000000a0  59 c2 8c 8a 7c e6 32 91  cf 9f 09 67 fd 0a 22 3a  |Yб▄┼|Ф2▒о÷.gЩ.":|
...

и вот часть оригинального файла (я не уверен, действительно ли это оригинальный файл или нет, но очень вероятно, что это так):

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    <meta name="description" content="статьи">
    <meta name="keywords" content="статьи">
    <title>Russia on the Net &mdash; статьи</title>
</head>
<link rel="stylesheet" href="/rus/style.css">
<body bgcolor="#FFFFFF">
<center>
...

Размер сжатого файла составляет 3397 и оригинал ~ 8913 байт. Исходный файл сжимается с помощью bzip2 до 3281 байта; gzip до 3177 байт; от lzma до 2990 байт; от 7z до 3082 байт; по почтовому индексу до 3291 байта.

Обновление: у меня есть информация (из расширения chrome opera-mini http://ompd-proxy.narod.ru/distrib/opera_mini_proxy.crx - распакуйте его с 7-zip), что Opera Mini использует это для распаковки данных webodf/src/core_RawInflate.js Может ли этот файл помочь мне?

2 ответа

Решение

Первые два байта 78 DA являются действительным 2-байтовым заголовком zLib (см. раздел 2.2 по CMF и FLG), который предшествует сжатию сжатых данных. Таким образом, файл может быть сжат с помощью zLib/deflate.

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

precomp -v -c- -slow opr00003.tmp

Он сообщит о сжатых потоках zLib и о том, насколько они распакованы ("... может быть распаковано в... байты"). Если это успешно (возвращает распакованный размер, близкий к размеру файла, который вы знаете), используйте ваш любимый язык программирования вместе с библиотекой zLib для распаковки ваших данных.

Также обратите внимание, что если вам повезет, поток (или его часть) может быть скомпрессирован бит-в-бит, идентичным Precomp и выходному файлу opr00003.pcf содержит (часть) распакованные данные, которым предшествует небольшой заголовок.

РЕДАКТИРОВАТЬ: Как прокомментировал osgx и дальнейший анализ, данные не могут быть распакованы с использованием zLib/deflate, так что это все еще не решенный случай.

РЕДАКТИРОВАТЬ 2: Обновление и особенно связанный JS показывают, что это является дефлятом, но это, кажется, некоторый пользовательский вариант. Может помочь сравнение с исходным кодом, а также сравнение с исходным исходным кодом zLib.

Кроме того, JS-код, конечно, можно использовать для распаковки данных. Похоже, он не обрабатывает 2-байтовый заголовок, поэтому, возможно, их следует пропустить.

В опера турбо кеш есть разные типы файлов. Первый процитирован под вопросом; некоторые файлы распакованы (css и js), и есть Z-упакованный многофайловый tar-подобный архив изображений (VP8, обнаруженный с помощью простого текста RIFF,WEBP,VP8 magics):

Пример Z-упакованного заголовка файла:

 5a 03 01 1c 90 02 0a 22 03 18 2a (RIFF data first img) (RIFF data second img)
 (RIFF data third img)

Контейнер RIFF хорошо виден и имеет поле длины, поэтому я предлагаю описание:

 5a - magic of format
    03 - number of files
       01 - first file (riff size=0x1c90)
          1c 90 - big-endian len of first file
                02 - second file (riff size=0a22)
                   0a 22 - len of second file
                         03 - third file (riff size=182a)
                            18 2a
                                  52 49 46 46 == "RIFF" magic of first file

Еще один пример Z-файла с JPG (магия "JFIF" видна, jpeg-маркер ffd8ff невидим; 8 файлов внутри):

0000000: 5a08 0118 de02 1cab 0308 0804 162c 0531  Z............,.1
0000010: 4d06 080f 070a 4608 0964"ffd8 ffe0 0010  M.....F..d......
0000020: 4a46 4946 0001 0101 0060 0060 0000 ffdb  JFIF.....`.`....

Еще один обнаружен file) тип файла "<000"-файл с примером заголовка (шестнадцатеричный) "1f 8b 08 00 00 00 00 00 02 ff ec 52 cb 6a c3 30 10 fc 15 63". file говорит, что это "gzip compressed data, max compression", и он просто распаковывается любым gzip.

Другие вопросы по тегам