从exe文件中提取flash文件,进而提取flash中的音频

今天收到Emnkcn的一封邮件,他说他有某考研视频是个exe文件,他想把里面的音频提取出来放到mp3中听,无奈他试了多种方法都不能将flash自这个exe文件中分离出来。今天小搞了下,终于成功,特将思路与方法记录于下:

拿到这个exe文件,第一反应就是得先判断下这个程序是用何种软件写成的,毕竟里面的Flash是嵌入在资源文件中的,只有了解了exe的编译软件才能找到相应的提取资源文件的方法。这个步骤很简单,我们请出大名鼎鼎的“language2000”,很简单就得出了我们需要的信息。此软件是使用Delphi编写的。

c1

知道了编写工具,我们就得想办法提取资源,我先后使用了eXeScope,PE Explorer以及ResHacker,都没能取得其中内嵌的资源文件。于是换了种想法,既然是内嵌资源,程序源文件中应该包含此文件的完整副本,于是

我便选择使用UltraEdit打开了此文件。当然,全都是密密麻麻的十六进制编码,如何定位我们所需的资源呢?我想的很简单,去研究下Flash的文件头定义,根据其定义就能找到Flash文件开始的位置。Flash的文件头定义很容易就在Google查询到了:

字段 –  类型 – 备注
标识-8位-标识字节: F代表未压缩 C代表已压缩(SWF6以后的版本特有)
标识-8位-代表W
标识-8位-代表S
版本号-8位-代表SWF文件的版本,比如0x06代表SWF6
文件长度-32位-整个文件的所占的字节数
帧大小-RECT结构-SWF场景的大小,单位为1twip(1/20像素)
帧速度-16位
帧数-16位-影片总的帧数目

这样,我们在文件中使用ASCII查询fws或者cws就应该可以找到内嵌的Flash文件。我通过这种方式确实找到了Flash文件的开始位置,但是却存在一个问题,我不能很好的确定Flash的结尾位置——因为自SWF6版本以后,SWF文件都是压缩存放的,其“文件长度标识位”注明的是压缩前的原始大小,这个大小远远大于文件中实际存在的字节数,故此方法不可行。

之后想到,这个程序想要播放Flash文件,必然会将最终的Flash保存于内存之中,而且此时的Flash文件应该是已经解压缩之后的文件,这样想来,只需要用WinHex之类的在内存中执行上面的步骤,就应该可以得到原始的Flash文件,但是Kaisir并没有那样做,因为Kaisir不小心找到了一款开源的Flash嗅探软件!

找到的这款嗅探软件名为Swf Reader,在08年还是一个开源项目,不过目前已经变成了商业软件,不过他的官方网站还是提供了DEMO版的软件(无时间及保存文件限制!)软件的使用非常简单,打开软件(因为使用Java编写,故需要安装JRE)打开需要提取Flash的exe程序,然后点击Swf Reader左上角的File,选择其中的“Load From Memory”之后在Process处选择你运行的那个exe程序,点后面的“Find Swfs”Ok,剩下的静静等着就好了,之后选中要保存出来的文件,点“save swfs as”选择保存位置,all done.

 c2

最后一步就是把swf文件转成mp3咯,这个很简单,下载Flash To Mp3 Converter即可,支持批量文件转换 :)

Enjoy !

(声明:Swf Reader程序不单单可以用于提取Flash,还可以完成类似于Flash脱壳,解密操作,请大家不要将此程序用于非法用途,若由此引起的任何版权问题,由使用者自负,本人及软件作者无责!)