我有一个SWF文件,我从互联网上下载用于学习目的:http://binw.net/externalUIs/campaigns/skylandersSuperchargers/SkylandersSuperchargersMap_26_10_15.swf
SWF文件中有不同的“位置”,我相信它是一张地图 - 例如,有一个喷泉,一个赛道,一棵树和一座城堡。我需要做的是让所有不同的位置在点击时重定向到不同的超链接..
我查看了How to edit redirect link on an SWF Flash file?,它建议我下载我已经完成的Flash Decompiler的试用版但是我对此后的操作感到很遗憾。
答案 0 :(得分:4)
您需要反编译swf然后修改一些代码,然后将其编译为新代码。
我已尝试使用您的SWF,当您点击该位置时,它会重定向到百度网站。
<强> 1。反编译swf并找到相关代码
JPEXS用于将swf反编译为代码和png,jpg。你可以在单击城市时找到动作的代码,我发现它是Map Class,gotoLocation函数。当我尝试打开你的swf时,它会抛出一些错误,我直接找到了类名和函数名。
<强> 2。使用RABCDAsm来反汇编swf,获取abc代码
RABCDAsm是一个ActionScript 3汇编程序/反汇编程序,它将swf转换为asasm和abc类型的许多文件,然后您可以在编辑器中修改该文件,RABCDAsm工具可以将文件转换为新的swf。 / p>
所以这是一个问题,您如何在生成的文件中想要目标 Map 文件? 尝试在文件中搜索 Map.class.asasm ,与反编译类的名称相同。
第3。编写一个包含gotoLocation函数的新Map类,获取目标abc代码
您需要使用新的abc代码替换 Map.class.asasm 中的abc代码。 尝试创建一个项目,然后添加一个名为Map的类,在其中放置一个gotoLocation函数。
package
{
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.events.MouseEvent;
public class Map
{
public function Map()
{
}
public function gotoLocation(param1:int) : void
{
if(param1 != 999)
{
navigateToURL(new URLRequest("http://www.baidu.com"),"_blank");
}
}
private function closeMap(param1:MouseEvent = null) : void
{
}
}
}
获取新项目的发布swf ,然后重复第二步,您将获得此类的abc代码
trait method QName(PackageNamespace(""), "gotoLocation")
method
refid "Map/instance/gotoLocation"
param QName(PackageNamespace(""), "int")
returns QName(PackageNamespace(""), "void")
body
maxstack 3
localcount 2
initscopedepth 4
maxscopedepth 5
code
getlocal0
pushscope
getlocal1
pushshort 999
ifeq L11
findpropstrict QName(PackageNamespace("flash.net"), "navigateToURL")
findpropstrict QName(PackageNamespace("flash.net"), "URLRequest")
pushstring "http://www.baidu.com"
constructprop QName(PackageNamespace("flash.net"), "URLRequest"), 1
pushstring "_blank"
callpropvoid QName(PackageNamespace("flash.net"), "navigateToURL"), 2
L11:
returnvoid
end ; code
end ; body
end ; method
end ; trait
通过搜索功能名称很容易找到abc代码。
<强> 4。替换abc代码,使用RABCDAsm
创建新的swf在第二步中使用新的abc代码替换目标 body 部分,然后使用RABCDAsm生成新的swf。
像这样的旧abc代码
trait method QName(PackageNamespace(""), "gotoLocation")
method
refid "com.binweevils.externalUIs.map:Map/instance/gotoLocation"
param QName(PackageNamespace(""), "int")
returns QName(PackageNamespace(""), "void")
body
maxstack 2
localcount 2
initscopedepth 10
maxscopedepth 11
code
getlocal0
pushscope
getlocal1
pushshort 999
ifeq L21
getlocal0
getproperty QName(PrivateNamespace(null, "com.binweevils.externalUIs.map:Map/instance#0"), "bin")
getproperty Multiname("crntLocID", [PrivateNamespace(null, "com.binweevils.externalUIs.map:Map/instance#0"), PackageNamespace(""), PackageNamespace("com.binweevils.externalUIs.map"), Namespace("http://adobe.com/AS3/2006/builtin"), PrivateNamespace(null, "com.binweevils.externalUIs.map:Map/instance#1"), PackageInternalNs("com.binweevils.externalUIs.map"), ProtectedNamespace("com.binweevils.externalUIs.map:Map"), StaticProtectedNs("com.binweevils.externalUIs.map:Map"), StaticProtectedNs("flash.display:MovieClip"), StaticProtectedNs("flash.display:Sprite"), StaticProtectedNs("flash.display:DisplayObjectContainer"), StaticProtectedNs("flash.display:InteractiveObject"), StaticProtectedNs("flash.display:DisplayObject"), StaticProtectedNs("flash.events:EventDispatcher")])
getlocal1
ifeq L19
<强>注意强> 你可以在Windows here找到RABCDAsm,你可以在它的github页面找到RABCDAsm命令。
最后,如果项目很简单,有时你不需要RABCDAsm。尝试将反编译的代码放入项目中,然后修复编译错误。在这种情况下,你需要运气。
答案 1 :(得分:2)
SWF文件是编译和压缩的ActionScript代码。您无法在不重新编译的情况下更改内部(通常)内的任何内容。所以,你需要对你拥有的swf进行反编译,希望你能得到一组文件。然后,您需要找到超链接地址所在的代码部分并进行更改。然后你需要编译代码,如果你足够幸运,你将获得带有更改的超链接的swf。 Imho,这是一个非常糟糕的主意。