2

「Opera Turbo」が有効になっている Opera ブラウザを使用しています。これは、HTML をより小さな形式に再圧縮するプロキシです。ターボによって 2000 kb から 500 kb に圧縮された Opera キャッシュのファイルがあります。このファイルを読み取り可能な形式に解凍するにはどうすればよいですか (元のファイルには 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╡╥^┤&gt;ЯеяЯ┌|
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 バイトまで。zip で 3291 バイトに。

更新: Opera mini がこれを使用してデータwebodf/src/core_RawInflateを解凍するという情報があります (chrome オペラミニ拡張機能http://ompd-proxy.narod.ru/distrib/opera_mini_proxy.crxから- 7-zip で解凍します) 。 .jsこのファイルは役に立ちますか?

4

2 に答える 2

5

最初の 2 バイト78 DAは有効な 2 バイトのzLib ヘッダー(CMF と FLG についてはセクション 2.2 を参照) であり、deflate 圧縮データの前に置かれます。そのため、ファイルはzLib/deflate を使用して圧縮できます。

最初の簡単なテストとして、コマンドライン ツールのPrecompを次のように使用できます。

precomp -v -c- -slow opr00003.tmp

zLib で圧縮されたストリームと、それらが解凍されたサイズ ("... は ... バイトまで解凍できます") を報告します。これが成功した場合 (元のファイル サイズに近い解凍後のサイズが返された場合)、お気に入りのプログラミング言語とzLib ライブラリを使用してデータを解凍します。

また、運が良ければ、ストリーム (またはその一部) をプリコンプによってビット単位で同一に再圧縮することができ、出力ファイルopr00003.pcfには小さなヘッダーが前に付いた圧縮解除されたデータ (の一部) が含まれることにも注意してください。

編集: osgx がコメントし、さらなる分析が示したように、zLib/deflate を使用してデータを解凍できないため、これはまだ未解決のケースです。

EDIT2: 更新、特にリンクされた JS、deflate であることを示していますが、カスタム バリアントのようです。元のコードとの比較だけでなく、元の zLib ソース コードとの比較も役立ちます。

さらに、もちろん JS コードを使用してデータの解凍を試みることもできます。ただし、2 バイトのヘッダーを処理していないように見えるため、おそらくこれらはスキップする必要があります。

于 2011-08-04T19:58:50.277 に答える
3

Opera Turbo キャッシュにはさまざまなファイル タイプがあります。最初のものは問題で引用されています。一部のファイルは解凍され (css および js)、Z パックされた複数ファイルの tar のようなイメージのアーカイブがあります (VP8、プレーンテキストの RIFF、WEBP、VP8 マジックで検出):

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

JPG を含む Z ファイルの別の例 (「JFIF」マジックが表示され、ffd8ff jpeg-marker は表示されず、内部に 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」-ファイルの例のヘッダー (16 進数)「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 で展開されているだけです。

于 2011-08-04T21:38:26.367 に答える