实例破解Flash

Author: Date: 2001年 35期

?牐牶昧耍衷诖蠹矣Ω靡丫訟ction Script Viewer的功能和操作有了一定的认识了,接着就让我们来实际操作一下吧。在以下的实例中我们将使用一个Flash4版本的swf文件为例进行破解,对Flash5版本的swf文件的破解方法和它相同。我们将只就Action script做相对简单的比较说明,需要详细了解的朋友可以参考《电脑报》2001年第11期D11版《悠游水泡》一文,源文件可以到http://www.Flashkit.com/movies/Animations/Bubble-hojo-817/index.shtml下载。
  ?牐犗热梦颐强纯碽ubble.swf,这是个小程序,只要用鼠标在该swf打开后的界面上一拖就会带起一串大小不一的水泡,水泡越往上浮越大,有些爆开了,有些就消失了,在下面的输入栏中可以调节水泡的数量和上浮速度。
  ?牐犜诵蠥ction Script Viewer,打开bubble.swf。我们首先要做的既不是查看它的结构,也不是查看Action语句,而是先了解场景信息。选择utility下拉菜单下的movie information选项,会新弹出一个信息小窗口(^35060103a^),从它上面我们可以了解到该Flash的主场景的宽为320,高为240,播放速度为12帧/秒,主场景中共有两帧,背景色为白色。
  ?牐牬蚩狥lash,按我们所得到的信息新建一个场景。
  ?牐牷氐紸ction Scr-
  ?牐爄pt Viewer,看一下swf窗口中的信息我们就会发现主场景下有两个关键帧,每帧都包含有Action(^35060103b^)。
  ?牐牭紽lash中建好的场景下建两个关键帧,接着要做的就是通过在Action Script Viewer中分别查看主场景下第1和第2关键帧中的Action语句,再把它们写到Flash中新建场景的相应的关键帧中去,我们可以发现两者的语法格式都是一样的(^35060103c^和^35060103d^)。如果是用Flash5的朋友可以通过force Flash5 mode将Action语句转为Flash5模式,再直接复制粘贴到Flash5中去,可以省不少力,但对于抱学习目的的朋友来说还是自己将Action语句输入一遍较好。
  ?牐牭?1帧:
  ?牐燬tart Drag("dg",L=0,T=0,R=320,B=240, lockcenter)
  ?牐燬et Property("gnist1",Visibility)=0
  ?牐燬et Variable:"gx"=GetProperty("dg",_x)??
  ?牐燬et Variable:"gy"=GetProperty("dg",_y)??
  ?牐營f(not(gx=gx1) or not(gy=gy1))?牐?
  ?牐燬et Variable:"l"=m
  ?牐燣oop While(not(l<0))?牐?
  ?牐燬et Variable:"l"=l-1
  ?牐燬et Variable:"Scale"=Random(25)+5
  ?牐燬et Property("/gnist1", X Position)=(GetProperty("dg",_x)+Random(3))-Random(3)??
  ?牐燬et Property("/gnist1",Y Position)=(GetProperty("dg",_y)+Random(3))-Random(3)??
  ?牐燬et Property("gnist1",Visibility)=1
  ?牐燬et Property("/gnist1",Rotation)=Random(20)+1
  ?牐燬et Property("/gnist1",X Scale)=Scale
  ?牐燬et Property:"/gnist1",Y Scale)= Scale
  ?牐燬et Variable:"n" = n + 1
  ?牐燬et Variable:"bn"="gnist1"& n
  ?牐燚uplicate Movie Clip("gnist1",bn,n)??
  ?牐燛nd Loop
  ?牐燛nd If
  ?牐牭?2帧:
  ?牐燬et Variable:"gx1"=GetProperty("dg",_x)??
  ?牐燬et Variable:"gy1"=GetProperty("dg",_y)??
  ?牐牐╠g和gnist1是两个电影夹的instance name,稍后我们将破解重建它。)
  ?牐犕瓿芍蠡氐紸ction Script Viewer中去了解一下主场景中组件对象的信息以便在Flash中重建它们,此时请将预览窗口打开以给我们一个更直观的认识。一般来说我们应该从下到上来重建层,别管原来的Flash人家是怎么做的,我们在Flash中重建最好也按照Action Script Viewer一个组件一个层来进行。 如果我们还仔细观察一下第二帧中层旁边的图标,就会发现它们都是没有变化的层,所以我们只要做主场景第一帧的层就可以了。
  ?牐犎梦颐强纯醋畹撞愕男畔ⅲ╚35060103e^),可以得知该层含有一个变量框(editable......),变量名为g,坐标位置是x=41,y=225,从预览窗口中我们还可以看见它的初始数值是15。
  ?牐牭紽lash场景中新建一层并按照我们得到的信息来重建它(^35060103f^)。接着就用相同的办法将除了电影夹组件外整个主场景里的内容都构建出来,其实在这里我们大可不必“死做”,我们可以用先前介绍的Swifty Zeus将整个swf文件完全分层,然后再参照Action Script Viewer里的信息一个个导入到自己的swf场景里再作修改。
  ?牐犕瓿珊蟮腇lash主场景看起来就比较清晰了(^35060103g^)。
  ?牐犎梦颐窃倩氐紸ction Script Viewer中来分析一下关键的电影夹组件,先看 movie clip,双击它将它在新的swf窗口中打开,我们就会发现这个电影夹组件是空的(^35060103h^),可能是用来判断鼠标的坐标。这就好办了,回到Flash中在主场景下新建一个空的电影夹组件就可以了,但是别忘了,它的instance name还是要和Action Script Viewer里的信息一致,要叫做dg(^35060103i^)。
  ?牐牻幼盼颐蔷透玫紸ction Script Viewer里去看看7 movie clip了,同样双击将它在新的swf窗口中打开(^35060103j^),用file菜单下的“save as”选项将它另存为一个swf文件备用。用我们前面学到的知识去分析一下就可以知道该电影夹中有7帧,其中5个是关键帧,其中包括了两个空白关键帧,每个关键帧都含有对应的Action Script。
  ?牐牭紽lash中去在主场景下新建一个电影夹组件,别忘了将instance name改为相对应的gnist1。
  ?牐牻胝飧鲂陆ǖ目盏缬凹凶榧≡駀ile下的import选项将先前另存出去的7 movie clip的swf导入进来(^35060103k^),我们发现该电影夹导入后全变成了关键帧,没关系,反正我们通过Action Script Viewer得到了足够的信息,将多出来的关键帧删除(用clear keyframe)就可以了,现在结构就完全一样了(^35060103l^),我们可以参照Action Script Viewer里显示的Action语句将5个关键帧相对应的Action语句分别写入。
  ?牐牭?1帧:
  ?牐燬et Variable: "gg" = /?焔
  ?牐燬et Property("g",X Position)=GetProperty("g",_x) ??
  ?牐燬et Property("g",Y Position)=GetProperty("g",_y)-gg
  ?牐燬et Property("g", Alpha)=GetProperty("g",_alpha)-3
  ?牐燬et Property("",X Scale)=GetProperty("",_xscale)+Random(3)??
  ?牐燬et Property("",Y Scale)=GetProperty("",_yscale)+ Random(3)??
  ?牐燬et Variable:"opx"=GetProperty("g",_x)??
  ?牐燬et Variable:"opy"=GetProperty("g",_y)??
  ?牐燬et Variable:"a"=GetProperty("g",_alpha)??
  ?牐營f(((bo=Random(8))and(a<50))and(80<(opxs+opys)))?牐牐?
  ?牐燝o to and Play (4)??
  ?牐燛nd If
  ?牐牐╣是个电影夹的instance name)
  ?牐牭?2帧:
  ?牐燬et Variable: "bo" = 1
  ?牐燬et Variable: "opxs" = GetProperty("",_xscale) ??
  ?牐燬et Variable: "opys" = GetProperty("",_yscale) ??
  ?牐營f (not (0 < a))?牐?
  ?牐燝o to and Stop (3)??
  ?牐燛lse
  ?牐燝o to and Play (1)??
  ?牐燛nd If
  ?牐牐ㄇ胱⒁庠谡饫镂颐敲挥玫紼lseIf子句,如果用到了的话,Action Script Viewer会自动将它们分写成else子句和if子句。)
  ?牐牭?3帧:Remove Movie Clip ??""??
  ?牐牭?4帧:
  ?牐燬et Property ("w", X Position)= opx
  ?牐燬et Property ("w", Y Position)= opy
  ?牐燬et Property ("w", X Scale)= opxs
  ?牐燬et Property ("w", Y Scale)= opys
  ?牐燬et Property ("w", Alpha)= a
  ?牐牐╳是个电影夹的instance name)??
  ?牐牭?7帧:Remove Movie Clip("")??
  ?牐犝庋屯瓿闪寺穑康比幻挥校氐紸ction Script Viewer里查看一下就会发现在7 movie clip中还包含有两个电影夹组件,将它们分别在新的swf窗口中打开并用“save as”另存为两个新的swf文件。
  ?牐犜倏纯次颐亲约旱牡缬凹校既氲闹挥幸桓鐾枷褡榧C晃侍猓慰糀ction Script Viewer中的信息,我们将自己的电影夹组件的第一和第二帧的图像组件都转为电影夹组件(insert→convert to symbol),instance name也要和2 movie clip相符,叫g。将第四帧的图像组件也转为电影夹组件,instance name和Action Script Viewer里的6 movie clip的一样,叫w,这时看上去没什么变化,其实已经是大不一样了。
  ?牐牱直鸾雐nstance name为g和w的两个电影夹组件,将刚才新存出来的2 movie clip和6 movie clip的两个相应的swf文件导入并删除它们本来的内容,我们会发现instance name叫g的电影夹组件的内容没有变化,而叫w的那个电影夹组件则一下子就有了5个关键帧,还包括一个空白关键帧(^35060103m^)。
  ?牐牷谹ction Script Viewer里查看一下,发现这和对应的6 movie clip的结构完全一致,只是6 movie clip的空白关键帧里还有Action语句(^35060103n^)。将对应的Action语句写到自己的电影夹里去吧!
  ?牐牭?5帧: Remove Movie Clip ??""??
  ?牐牴?喜你,破解重建工作完成了。测试一下影片,是不是和原来的swf文件一模一样啊?还能自己随意修改啊!总结下来,用Action Script Viewer做破解重建最好要做到三个一致--帧一致、Action Script一致以及组件结构一致,这样才能尽可能地减少出错的可能。
  ?牐牨嗪螅汉昧耍父鼍哂写硇缘钠平馊砑徒樯芡炅耍饫镆嵝汛蠹乙痪洌平夤ぞ弑暇怪皇枪ぞ撸荒艽孀约旱呐Γ绻愎忠览倒ぞ呶抟苫嵯拗谱约旱拇匆狻>拖褚桓隼贤舛許WF Browser的评价那样--“如果我不小心丢失了自己的fla文件的话,我会很高兴用SWF Browser来将它找回,如果我想研究别人的swf的话,我会破解照做一遍,但绝不会将它当作自己的作品。如果我是一个小人的话,那SWF Browser这款软件就太危险了。”