从问题到结果 ——exe2swf的开发手记
随着macromedia flash 5的闪亮推出,flash在网络多媒体应用方面已经占据了不可动摇的地位,再加上中国闪客们的无私劳动,许多经典歌曲,比如“东北人”、“第一次” 等等都有了flash版本的mtv,真是别有一番情趣。然而,网络上许多flash作品都是exe形式的,虽然方便了没有安装flash插件的朋友,但是exe形式的flash不能用于网页制作,更不用说分析action什么的了。由于手边没有免费的exe2swf工具,于是决定自己diy一个,一显programmer本色!
一、开发工具
我用到的开发工具有delphi6,最好用的rad工具; ultraedit,强大的16进制编辑工具;showgood三国系列中的财神到.swf、桃源结义.swf、神啊救救我吧.exe、割须弃袍.exe;最后就是思考,最有力也是最根本的工具。^_^
二、基本思路
首先我设想了一个基本思路:exe形式的flash包含两部分,flash播放器和跟在播放器后面的swf文件,因为bmp2exe、mp32exe等软件都是这么做的。是不是这样呢?我们动手看一看吧!
用ultraedit打开“财神到.swf”和“桃源结义.swf”分析文件头,非常明显,文件头都包括相同的ascii码“fws”,估计这是flash文件的标识符。用ultraedit打开“神啊救救我吧.exe”,文件全长1183046字节。按下ctrl+f调出搜索对话框,在find what后填入“fws”并且勾上“find ascii”,搜索。果不其然,在5c000处找到了“fws”,接着的部分也和“财神到.swf”中的非常相似,可见假设很有可能是正确的。顺藤摸瓜,查看两个.swf文件的文件尾,都是若干个00加上40 00 00 00的形式,然而“神啊救救我吧.exe”的文件尾却是若干个00加上40 00 00 00再加上120d3e处的56 34 12 fa 3e 4d 0c 00。最后这八个字节会是什么呢?再打开“割须弃袍.exe”,发觉它的最后八个字节是56 34 12 fa 82 f5 12 00。聪明的你一定猜到56 34 12 fa是exe形式flash文件的标识符了吧?经过检查其他exe形式的flash,事实证明了这个猜测是正确的。至于3e 4d 0c 00是什么呢?不妨把它当作一个32位整数,注意到低字节和高字节的逆序,3e 4d 0c 00就应该等于00 0c 4d 3e,也就是十进制的806206。ok!至此我们已经获取了足够多的信息,接着就看看有什么巧合吧!颠来倒去,不难发现,把“神啊救救我吧.exe”中swf部分的结束地址120d3e减去起始地址5c000,不就正好得到806206?
接下来要办的事情就简单了,我们动手证实一下。还是利用ultraedit,把5c000至120d3e之间的数据粘贴出来,保存为一个.swf文件,用ie打开一看,这不就是久违了的陈小春的歌吗?呵呵,大功告成!
顺便说一句,如果好奇的话,你还可以把0至5c000的数据直接保存成.exe文件看看,呵呵,惊奇吧,就是flash 5中的standalone player!
三、编写程序
在正式编写程序之前,我想先花一些时间介绍delphi 中的文件流操作。如果你已经对这个非常熟悉了,可以跳过去,直接阅读后文的代码。否则,请花一点时间看一看,这对于你阅读下面的代码非常有帮助。
在delphi中,所有流对象的基类为tstream类,其中定义了所有流的共同属性和方法。那什么是流呢?简单来说,流就是建立在面向对象基础上的一种抽象的处理数据的工具。流中定义了一些处理数据的基本操作,如读取数据、写入数据等,程序员只是面对流进行所有操作的,不用关心流的另一头数据的真正流向。我们程序中将要使用tfilestream,它是tstream最常用的派生类。使用 tfilestream操作文件要比object pascal基本文件操作方便得多。tfilestream的基本操作是这样的:首先create一个实例,然后用try...finally tfilestream.free的格式操作,“...”部分可以用tfilestream的readbuffer、 seek、
writebuffer、copyfrom方法来操作文件流。此外,流不但可以处理文件,还可以处理动态内存、网络数据等多种数据形式。编写程序时善加利用流,将会大大提高编程的效率。
好了,现在让我们正式开工。首先我们先设计窗体。打开delphi,首先在窗体上添加两个button、两个edit、一个opendialog以及若干个label工具,界面设计以及控件 name属性,其他的采用默认值。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器