从问题到结果 ――EXE2SWF的开发手记

2016-01-29 14:13 9 1 收藏

从问题到结果 ――EXE2SWF的开发手记,从问题到结果 ――EXE2SWF的开发手记

【 tulaoshi.com - Delphi 】

 
从问题到结果 ——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属性,其他的采用默认值。

btnOpen是用来打开硬盘上EXE形式的Flash文件的,双击之,添加如下的代码:


procedure TForm1.btnOpenClick(Sender: TObject);

begin

// 通过OpenDialog让用户选择EXE形式的Flash

if OpenDialog.Execute then

begin

edtSourceExe.Text := OpenDialog.FileName;

// 自动生成.swf格式的文件名,方便用户

edtTargetSwf.Text := ChangeFileExt(edtSourceExe.Text, '.swf');

end;

end;

btnConvert是用来转换文件格式的按钮,双击之,添加如下代码:

procedure TForm1.btnConvertClick(Sender: TObject);

var

// 分别处理EXE、SWF文件的文件

来源:http://www.tulaoshi.com/n/20160129/1492792.html

延伸阅读
Struts2 Struts2是在WebWork2基础发展而来的。和struts1一样, Struts2也属于MVC框架。不过有一点大家需要注意的是:尽管Struts2和struts1在名字上的差别不是很大,但Struts2和struts1在代码编写风格上几乎是不一样的。那么既然有了struts1,为何还要推出struts2。主要是因为struts2有以下优点: 1  在软件设计上Struts2没有...
标签: Web开发
数据绑定系列的第二篇是如何从 XML 数据限制中生成一个 Java 语言。 本文通过完整的代码展现了如何生成类和代码,并提供了如何定制您自己版本的建议。 还没有看过第一篇吗?第一篇, "对象,无处不在的对象", 解释了数据绑定是如何将 XML 和 Java 语言对象互为转换。它比较了数据绑定和其它在 Java 程序中处理 XML 的方法, 并介...
标签: flash教程
二、swf文件中记录影片宽、高的方式 前面表中第八个字节“影片宽高数据控制码”指的是下表中控制码一栏中的数字。第九个字节至第N个字节“影片的宽度与高度数据存放区”指的是下表中控制码右边的那一行数字。由于控制码的不同,宽度与高度的数据存放区的字节长度也不同。 下表中将控制码所在的字节分为两部分(高四位和低四位)...
标签: Java JAVA基础
Java Learning Path(二)、书籍篇 学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。 在这里我只想补充一点看法,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这...
附:Java入门与加深FAQ 一、预备篇 1 什么是Java、Java2、JDK?JDK后面的1.3、1.4.2版本号又是怎么回事? 答:Java是一种通用的,并发的,强类型的,面向对象的编程语言(摘自Java规范第二版) JDK是Sun公司分发的免费Java开发工具,正式名称为J2SDK(Java2 Software Develop Kit)。 2 什么是JRE/J2RE? 答:J2RE是Java2 Runtime En...