9

ほとんどのSWFファイルは、すべてではないにしても、実際にはそれ自体の圧縮バージョンを含むswf「アーカイブ」であるように見えます。いくつかのツールを使用してファイルを抽出できることを確認しました

$ flasm -x player.swf
Flasm configuration file flasm.ini not found, using default values
player.swf successfully decompressed, 206239 bytes

$ 7z x player.swf

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

Processing archive: player.swf

Extracting  player~.swf

Everything is Ok

Size:       206239
Compressed: 106427

しかし、私はもう少し「従来の」ものを使用してこれらから抽出することを望んでいましたtargzip

4

1 に答える 1

22

http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdfからの関連引用

ヘッダーは、0x46、0x57、0x53 (「FWS」) のいずれかの 3 バイトの署名で始まります。または 0x43、0x57、0x53 (「CWS」)。

  • FWS 署名は、圧縮されていない SWF ファイルを示します。
  • CWS は、最初の 8 バイトの後 (つまり、FileLength フィールドの後) のファイル全体が、ZLIB オープン標準を使用して圧縮されたことを示します。ZLIB ライブラリが使用するデータ形式は、Request for Comments (RFC) ドキュメント 1950 ~ 1952 で説明されています。CWS ファイル圧縮は、SWF 6 以降でのみ許可されています。

更新コメントへの応答として、上記の内容を文字通りに翻訳した小さな bash スクリプトを次に示します。

#!/bin/bash
for swf in "$@"
do
    signature=$(dd if="$swf" bs=1 count=3 2> /dev/null)
    case "$signature" in
        FWS)
            echo -e "uncompressed\t$swf"
            ;;
        CWS)
            targetname="$(dirname "$swf")/uncompressed_$(basename "$swf")"
            echo "uncompressing to $targetname"

            dd if="$swf" bs=1 skip=8 2>/dev/null |
                (echo -n 'FWS'; 
                 dd if="$swf" bs=1 skip=3 count=5 2>/dev/null;
                 zlib-flate -uncompress) > "$targetname"
            ;;
        *)
            {
                echo -e "unrecognized\t$swf"
                file "$swf"
            } > /dev/stderr
            ;;
    esac

done

次に、一連のファイルに出くわし*.swfます(として保存したと仮定しますuncompress_swf.sh):

uncompress_swf.sh /some/folder/*.swf

それは次のようなことを言うでしょう

uncompressed     /some/folder/a.swf
uncompressed     /some/folder/b.swf
uncompressing to /some/folder/uncompressed_c.swf

何かがフラッシュ ファイルのように見えない場合は、stderr にエラーが出力されます。

免責事項これは、引用された仕様を読む方法です。7z xこのスクリプトを使用すると、入力 swf で使用した場合と同じ出力が得られることを確認しました。

于 2012-07-27T02:33:54.053 に答える