命令行从SWF中提取?

7 flash command-line

似乎大多数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
Run Code Online (Sandbox Code Playgroud)

然而,我希望从这些中提取一些更"常规"的东西,例如targzip

seh*_*ehe 19

来自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
Run Code Online (Sandbox Code Playgroud)

然后您将运行一组*.swf文件(假设您将其另存为uncompress_swf.sh):

uncompress_swf.sh /some/folder/*.swf
Run Code Online (Sandbox Code Playgroud)

它会说类似的东西

uncompressed     /some/folder/a.swf
uncompressed     /some/folder/b.swf
uncompressing to /some/folder/uncompressed_c.swf
Run Code Online (Sandbox Code Playgroud)

如果某些东西看起来不像flash文件,它会向stderr打印一个错误.

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

  • 仅供参考,您可以使用`openssl zlib -d`而不是`zlib-flate` (2认同)