{A}
本文的目标
本文的主要目的是展示如何来管理SWF编码的文件的。NET,C#或VB.NET。 SWF是一个二进制格式表示编译的Flash动画。使用SwfDotNet库
SwfDotNet库是一个C#开源框架,可以在:
该库提供了一些好东西,到现在读写SWF格式的文件从版本1至7。 SwfDotNet.IO.dll与兼容。NET框架1.1,2.0和。这个库方面MacromediaTM SWF格式规范。你可以阅读和下载的Macromedia官方规范。
对于我们的反编译应用程序,我们使用这个框架就像在这些例子:包括在你的类SwfDotnNet的库:
创建SwfReader对象的SWF对象:{C}写在SWF对象,并保存为一个SWF文件或流:using SwfDotNet.IO;
框架中可用的标记对象的名单:使用字节代码反编译得到的行动标记的动作脚本代码:// Create a new swf animation
Swf swf = new Swf();
// Define background as blue
swf.Tags.Add(new SetBackgroundColorTag(255, 0, 0));
// Define a new frame
swf.Tags.Add(new ShowFrameTag());
// Define a swf writer
SwfWriter writer = new SwfWriter("myfile.swf");
// Write animation
writer.Write(swf);
// Close the stream
writer.Close();
我们可以直接从标签中提取的媒体文件://include bytecode management namespace
using SwfDotNet.IO.ByteCode;
...
//Browse swf tags list
IEnumerator tagsEnu = swf.Tags.GetEnumerator();
while (tagsEnu.MoveNext())
{
BaseTag tag = (BaseTag)tagsEnu.Current;
if (tag.ActionRecCount != 0)
// The tag contains action script ?
{
IEnumerator byteCodeEnu = tag.GetEnumerator();
while (enum2.MoveNext())
{
//Init the action script decompiler
Decompiler dc = new Decompiler(swf.Version);
//Decompile the current actionscript action from a tag
ArrayList actions = dc.Decompile((byte[])tagsEnu.Current);
foreach (BaseAction obj in actions)
{
//Write action script byte code to the console
Console.WriteLine(obj.ToString());
}
}
}
}
创建SWF反编译器样品//Browse swf tags list
IEnumerator tagsEnu = swf.Tags.GetEnumerator();
while (tagsEnu.MoveNext())
{
BaseTag tag = (BaseTag)tagsEnu.Current;
if (tag is DefineBitsJpeg2Tag) //Extract a jpeg:
{
//Extract to a file:
((DefineBitsJpeg2Tag)tag).DecompileToFile("extract_image.jpeg");
//Or in a stream:
Image img = ((DefineBitsJpeg2Tag)tag).DecompileToImage();
}
else if (tag is DefineSoundTag) //Extract a sound file:
{
DefineSoundTag soundTag = (DefineSoundTag)tag;
//Extract to a file
if (soundTag.SoundFormat == SoundCodec.MP3)
soundTag.DecompileToFile("extract_sound.mp3");
else
soundTag.DecompileToFile("extract_sound.wav");
}
}
本示例的目标是创建一个非常简单的SWF反编译器。从编译FlashTM动画(SWF文件),我们要加载它,并在单独的文件,所有的图片和所有的嵌入的MP3文件的摘录。
注意:此示例反编译器是不是一个完整的SWF反编译器!此示例只反编译嵌入没有JPEG表JPEG文件,和唯一的非流,MP3和WAV声音。只有动作脚本字节码中提取。
你可以看到SwfDecompiler.exe.log.xml要求在项目文件,这个文件是log4net框架的配置文件。关于log4net的更多信息,您可以读取{A5}。
SwfDotNet库所有跟踪操作使用log4net的。当你读一个SWF文件,你可以跟踪所有的SwfReader对象读取SWF标签,并可以跟踪DefineShape例如一个标签所包含的不同形状。要做到这一点,只是在SwfDecompiler.exe.log.xml文件中的这些行:<!-- To trace tags readed -->
<logger name="SwfDotNet.IO">
<level value="ALL" /> <!-- Turn it to ALL -->
</logger>
<!-- To trace shapes readed -->
<logger name="SwfDotNet.IO.Tags.Types">
<level value="ALL" /> <!-- Turn it to ALL -->
</logger>
如果你改变这些值,并执行反编译一个更多的时间,文件名为"log.txt中"将出现在相同的目录中的应用这样一些行::结论
正如你可以看到,由于SwfDotNet库,你可以很容易地分析,管理,创建,读取,或写入SWF二进制文件。这个范例是一个真正的"轻"的SWF反编译器,但显示的方式做到这一点,说明了如何做一个真正的,并且不需要是一个二进制的阅读过程中专家。
此外,SwfDotNet库是100%免费(GPL许可),而不是依赖于平台的:您可以使用它在Web项目中或在一个WinForms应用程序,并为确保使用Mono。历史19/12/2006:第一条版本。