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

zhouxiong1919

zhouxiong1919

2016-01-29 14:13

从问题到结果 ――EXE2SWF的开发手记,从问题到结果 ――EXE2SWF的开发手记
 
从问题到结果 ——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文件的文件
展开更多 50%)
分享

猜你喜欢

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

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

开发手记(一)

电脑网络
开发手记(一)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

利用VC从DLL传递消息到EXE

编程语言 网络编程
利用VC从DLL传递消息到EXE

开发手记(三)

电脑网络
开发手记(三)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

开发手记(二)

电脑网络
开发手记(二)

《网络吸管》开发手记

编程语言 网络编程
《网络吸管》开发手记

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

在DELPHI中利用API实现网格内组件的嵌入

在DELPHI中利用API实现网格内组件的嵌入

Delphi的两个实用技巧(1)播放Flash

Delphi的两个实用技巧(1)播放Flash
下拉加载更多内容 ↓