今天收到Emnkcn的一封邮件,他说他有某考研视频是个exe文件,他想把里面的音频提取出来放到mp3中听,无奈他试了多种方法都不能将flash自这个exe文件中分离出来。今天小搞了下,终于成功,特将思路与方法记录于下:
拿到这个exe文件,第一反应就是得先判断下这个程序是用何种软件写成的,毕竟里面的Flash是嵌入在资源文件中的,只有了解了exe的编译软件才能找到相应的提取资源文件的方法。这个步骤很简单,我们请出大名鼎鼎的“language2000”,很简单就得出了我们需要的信息。此软件是使用Delphi编写的。
知道了编写工具,我们就得想办法提取资源,我先后使用了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.
最后一步就是把swf文件转成mp3咯,这个很简单,下载Flash To Mp3 Converter即可,支持批量文件转换 :)
Enjoy !
(声明:Swf Reader程序不单单可以用于提取Flash,还可以完成类似于Flash脱壳,解密操作,请大家不要将此程序用于非法用途,若由此引起的任何版权问题,由使用者自负,本人及软件作者无责!)
非常感谢!昨晚我也试了resource hacker这类软件,也试过ue查找,也用过两个能查找内存的swf提取软件,一个叫flash 吸血鬼,另一个忘了,一直弄到电脑没电都没搞定……
有问题还是找哥吧,嘿嘿嘿 :)
– – 技术宅 果然霸气!
谢谢,哈哈 :)
技术达人,好强悍!
是挺NIU X的
大侠,如果遇到从flash中提取图片的问题可以请教你吗? 😮
一般的图片硕思就可以搞定吧?再不行截图也可以搞定的吧 :)