看来大多数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
然而,我希望从这些中提取一些更多的东西"传统的" tar
或gzip
答案 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
时的输出相同。