返回首页

{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的库:

using SwfDotNet.IO;

创建SwfReader对象的SWF对象:{C}写在SWF对象,并保存为一个SWF文件或流:
// 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());

      }

    }

  }

}

我们可以直接从标签中提取的媒体文件:
//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反编译器样品
本示例的目标是创建一个非常简单的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:第一条版本。

回答

评论会员:艾伦Burkhart 时间:2011/12/07
一个Flash版本,而不考虑项目zebulon75018提取SWF头信息。可能适合那些只需要得到的属性,而不是创建SWF文件的需要。不支持FLV,虽然
{A6}
如果巴尼弗兰克吃一个水果蛋糕,它是人吃人的
评论会员:游客 时间:2011/12/07
?|艾伦Burkhart:我抓住了SourceForge上lib和发现它易于使用。伟大的东西。不幸的是,缺乏超越闪存7的支持,停止我冷。所有我需要的是得到宽/高/现有的SWF和FLV文件使用生成HTML文件的大小(用VB)。任何建议表示赞赏。我回来了,现在的谷歌搜索。imgsrc=http://www.orcode.com/upimg/2011_12_07_07_18_11_1.gif如果巴尼弗兰克吃一个水果蛋糕,它是人吃人的
?kashif_pucitian124
评论会员:游客 时间:2011/12/07
AsalamØAlikum如何界定ButtonCondaction类的行动呢?DefineButton2Tagbutton2tag=新DefineButton2Tag()button2tag.CharacterId=swf.GetNewDefineId()ButtonRecordCollectionbtnCollection=button2tag.Characters;ButtonRecordbtnRecord=新ButtonRecord(真实的,真实的,真实的,真实,shapeTag.CharacterId,1,新的Matrix(0,0,1,1),新CXFormWithAlphaData());{BR}btnCollection.Add(btnRecord);button2tag.Add(btnCollection); 新ButtonCondactionCollectionButtonCondactionCollectioncndCollection=字符串str="A";ActionPush推=新ActionPush(0,STR);//将字符串ButtonCondactionbtnCondaction1=新ButtonCondaction(Convert.ToByte("4"),Convert.ToByte("0"),StrToByteArray(push.ToString()));{BR}ActionStartDragstartDrag=新ActionStartDrag()ButtonCondactionbtnCondaction2=新ButtonCondaction(Convert.ToByte("4"),Convert.ToByte("0"),StrToByteArray(startDrag.ToString()));{BR}ActionEnd结束=新ActionEnd();ButtonCondactionbtnCondaction3=新ButtonCondaction(Convert.ToByte("4"),Convert.ToByte("0"),StrToByteArray(end.ToString()));{BR}cndCollection.Add(btnCondaction);cndCollection.Add(btnCondaction2);cndCollection.Add(btnCondaction3);ActionEndDragendDrag=新ActionEndDrag()ButtonCondactionbtnCondaction4=新ButtonCondaction(Convert.ToByte("8"),Convert.ToByte("0"),StrToByteArray(endDrag.ToString()));{BR}ActionEndendd=新ActionEnd()ButtonCondactionbtnCondaction5=新ButtonCondaction(Convert.ToByte("8"),Convert.ToByte("0"),StrToByteArray(endd.ToString()));{BR}condCollection.Add(btnCondaction4);condCollection.Add(btnCondaction5);button2tag.Add(condCollection);swf.Tags.Add(button2tag);但是当我看到XML输出​​SWF文件,我发现LT;ButtonCondactions/没有LT;ButtonCondaction和它的子标记在XML文件中发现plz帮助我。我需要做此状态:离开很痛苦非常PLZPLZPLZ帮我出
帕维尔Dlugosz
评论会员:游客 时间:2011/12/07
0exe​​mples
Omglmi
评论会员:游客 时间:2011/12/07
什么设置按钮的事件期待你的回答呢??BR/{S2}
Koudjo
评论会员:游客 时间:2011/12/07
我看到everyother为PNG图片格式,但没有。是否可以这样做
?friendwaters
评论会员:游客 时间:2011/12/07
PNG文件编译成DefineBitsJPEG3在SWF
nKognito
评论会员:游客 时间:2011/12/07
但有时,它does't工作没有消息
Koudjo
评论会员:游客 时间:2011/12/07
嗨!我的问题是:如何填充控件的ID?什么debuger收集包括它呢?感谢:会员4547548
。是否有人知道如何与DefineFont2Tag的CodeTable
DefineFont和DefineFontInfo我可以检索CodeTable中提取的SWF。
文本但我坚持用DefineFont2tag。
所有建议都欢迎
评论会员:会员4547548 时间:2011/12/07
。感谢您的SWF操纵tuto奥利维尔用C#
从昨天起,我试图从SWF中提取文本
是否可以这样做:我使用的标签:defineTextTag和DefineText2tag但我不能够从SWF中提取文本
。我应该如何进行。
关于
shukku
评论会员:游客 时间:2011/12/07
SpaceWalker:我刚刚发现的DefineText2TagGlyphEntry数据保存。
amiuhle
评论会员:游客 时间:2011/12/07
您好奥利维尔,感谢您的大图书馆...非常impresive工作!..我试着去了解如何使用你的库,但我是新手,我只知道VB.NET...不是C#..我想提取所有帧的Flash影片。我尽量发挥你的反编译器样品。当我们编译您的样品SWF文件,我们可以看到,有28帧..但只有3JPEG文件提取并保存在硬盘上..所以我显示所有标签的​​电影,看到只有3个标签"DefineBitsJpeg2Tag"..所以我明白了,其他所有帧上创建的SWF播放器的飞...我怎么能获得28帧BMP或JPEG文件...?{BR}你有没有计划升级您的库,支持flash版本?再次感谢!你可以私下跟我联系,在法国!imgsrc=http://www.orcode.com/upimg/2011_12_07_07_18_11_1.gif至于菲利普
Koudjo
评论会员:游客 时间:2011/12/07
任何人都可以发布一个示例显示如何导入的字体和文字写入?
CarlosSV
评论会员:游客 时间:2011/12/07
我们可能需要的标签DefineFontInfo,为了得到CodeTable映射雕作品DefineTextTag
奥利维尔卡彭铁尔
评论会员:游客 时间:2011/12/07
请告诉我,如果这个组件从Net框架1.1{BR运行。},卡洛斯
CarlosSV
评论会员:游客 时间:2011/12/07
你必须重新编译所有的解决方案,使用新的DLL,2003年与VS.Net编译。打开VS2003年,创建一个新的解决方案,导入所有的来源和编译所有。我可以证实,这个项目是100%。NET1.1兼容。
chelicera333
评论会员:游客 时间:2011/12/07
感谢您的帮助奥利弗很多,我会重新编译的源代码在VS2003,但我还有一个问题......如果解决方案将作品为Flash8。再次感谢imgsrc=http://www.orcode.com/upimg/2011_12_07_07_18_11_1.gif
科夫曼
评论会员:游客 时间:2011/12/07
EEH,啧啧不错,但似乎提取代码的片段应该是这样的: IEnumerator的byteCodeEnu=tag.GetEnumerator() (byteCodeEnu.MoveNext()){//初始化动作脚本反编译闪客DC=新闪客(swf.Version)//反编译一个标记当前的ActionScript动作ArrayList的行动=dc.Decompile((字节[])byteCodeEnu.Current); FOREACH(BaseAction行动OBJ) {//写入动作脚本字节代码到控制台Console.WriteLine(obj.ToString());{BR}}请纠正我,如果我错了或不正确的啧啧。它的那些小东西......
crazyoldman
评论会员:游客 时间:2011/12/07
有谁样品写作和阅读DefineText2Tag?我不能似乎在textrecordcollection读取了textrecord。TIA
Koudjo
评论会员:游客 时间:2011/12/07
我已被想了一会儿反编译SWF现在,我变得非常沮丧,因为有没有definesoundstream因此我不能编译文件中的声音流。我如何可以反编译SWF文件中的声音流?,crazyoldman"
halifaxdal
评论会员:游客 时间:2011/12/07
使用这些行:如果(标签SwfDotNet.IO.Tags.DefineSoundTag){SwfDotNet.IO.Tags.DefineSoundTagsoundTag=(SwfDotNet.IO.Tags.DefineSoundTag)标记; //解压缩到一个文件(soundTag.SoundFormat==SoundCodec.MP3)soundTag.DecompileToFile("extract_sound.mp3");ELSE soundTag.DecompileToFile("extract_sound.wav")}
aijfisuhhtrtl
评论会员:游客 时间:2011/12/07
但良好的工作虽然。
aijfisuhhtrtl
评论会员:游客 时间:2011/12/07
是否与这个包工作的FLV这正是我寻找,但然后为FLV。