似乎大多数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)
然而,我希望从这些中提取一些更"常规"的东西,例如tar或gzip
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 时使用的输出相同.