命令行从SWF中提取?

时间:2012-07-26 22:44:28

标签: command-line flash

看来大多数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

1 个答案:

答案 0 :(得分:18)

http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf

的相关引用
  

标头以0x46,0x57,0x53(“FWS”)的三字节签名开头;或0x43,0x57,0x53(“CWS”)。

     
      
  • FWS签名表示未压缩的SWF文件;
  •   
  • CWS表示使用ZLIB开放标准压缩前8个字节之后(即FileLength字段之后)的整个文件。   ZLIB库使用的数据格式由1950年至1952年的Request for Comments(RFC)文档描述。仅在SWF 6或更高版本中允许CWS文件压缩。
  •   

更新在回复评论时,这里有一个小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

如果某些内容看起来不像flash文件,它会向stderr打印错误。

免责声明这就是我阅读引用规范的方式。我刚刚检查过,使用此脚本产生的输出与我在输入swf上使用7z x时的输出相同。