无需不断重建 swf 即可修补 actionscript

Posted

技术标签:

【中文标题】无需不断重建 swf 即可修补 actionscript【英文标题】:patching actionscript without constantly rebuilding swf 【发布时间】:2016-12-30 12:51:24 【问题描述】:

如何在不不断重建 sfw 的情况下修补 actionscript? 我需要修改一个相当大的 actionscript 项目,并且生成的 swf 用于实时站点。我遇到的问题是我需要对 swf 进行快速的小更新,并且每天在实时站点上更新 swf 十次是不可接受的(我无法控制那部分,我需要让另一个人把结果在现场)。 我有什么选择来解决这个问题?当谈到动作脚本和所有与 Flash 相关的东西时,我是一个完全的菜鸟,我什至不确定什么是可能的,什么不是。我正在考虑以下方法,哪些是可能/可接受的?

假设实时站点位于www.livesite.com/game.html 并且此页面加载www.livesite.com/flashgame.swf。在flashgame.swf 中,有一个类com/livesite/Magic.as 被实例化,并且该类的实例具有类com/livesite/MagicWork.as 的成员变量xxx123。我只需要修改这个MagicWork 类。现在,我只需对其进行修改、构建并要求将更新的flashgame.swf 直播。所以,我想避免那个手动步骤。

我的所有想法都可以分为两种基本方法:1) 保持 flashgame.swf 完全不变,然后加载包含 MagicWork 类的替代实现的 flashgame.mod.swf,然后使用 javascript 访问该实例的内部结构Magic 类并将其 xxx123 成员更新为来自 flashgame.mode.swfMagicWork 类的实例。我需要修改game.html 以加载我的javascript,以便我的js 文件将加载flashgame.mod.swfflashgame.swf 中的补丁代码。通过修补我的意思是 javascript 样式覆盖 Magic.xxx123 到一个新值。 flashgame.mode.swf 理想情况下会驻留在我自己控制的主机上。那种东西是可能的,如果不是什么是不可能的? 2) 我可以在flashgame.swf 中进行一次性更改,以便它可以在运行时有效地加载我自己的代码并修补它的xxx123 成员。这可能吗?

【问题讨论】:

为什么需要多次重新发布到现场制作网站?! @Brian 我不需要,但如果我需要,我不想手动询问 10 次。我正在从事早期项目,该项目部分取决于它在现场网站上的工作方式。因此,如果有任何问题,可以快速修复并立即更新。关键是它是为 0.001% 的用户启用的,所以它不会对所有 ppl 产生影响,在那里犯错是可以的。 好的,那么解决您的问题的方法是直接访问“0.001% 实时站点”,这样您就可以更新 swf——不要更改代码以从 pavelscustomworld.org 加载依赖项 swf . 不,这实际上是以这种方式作为模块加载的重点。最终会是这样。基本上更大的flashgame.swf 项目独立存在,mod 是独立的,可以独立更新。将它们分开不仅是解决手动更新问题的“奇怪”方式,而且无论如何都是最终必须的方式。 您是否正在考虑使用运行时共享库​​? Flash Player 能够在运行时加载外部代码库,这些代码库可以与您正在播放的主 .swf 文件分开。但是外部库仍然需要在公共 Web 服务器上进行编译和部署。 【参考方案1】:

我之前已经写过关于加载运行时共享库​​的说明。我将把这个过程中最重要的部分放在这里,并在最后添加一个指向全文的链接。

您需要按以下方式标记您的主应用程序入口点。

[Frame(factoryClass="Preloader")]
public class Main extends Sprite



然后创建一个名为 Preloader 的类。

public class Preloader


    public function Preloader()
    
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.loader_completeHandler);
        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, this.loader_ioErrorHandler);
        var request:URLRequest = new URLRequest("math.swf");
        var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
        loader.load(request, context);
    

    private function loader_completeHandler(event:Event):void
    
        var mainClass:Class = getDefinitionByName("Main") as Class;
        var mainInstance:Main = new mainClass();
        this.addChild(mainInstance);
    

Main类的完整实现是这样的。

[Frame(factoryClass="Preloader")]
public function Main()

    var integer:IntegerArithmetic = new IntegerArithmetic(); // Type declared in math.swf
    var operand1:int = 10;
    var operand2:int = 10;
    var result:int = integer.add(operand1, operand2);

部署运行时共享库​​

使用运行时共享库​​令人困惑的一点是,必须在部署应用程序时从 SWC 中提取 SWF。这并不是很明显,我最终花了几天时间将编译好的 SWC 文件放在不同的位置,并想知道为什么应用程序无法在运行时加载它。 Adobe 网站上的一篇晦涩难懂的文章明确说明了这一特定步骤并直截了当。

完整的文章和相同的例子可以在http://www.notadesigner.com/runtime-shared-libraries-with-plain-actionscript/获得。

【讨论】:

以上是关于无需不断重建 swf 即可修补 actionscript的主要内容,如果未能解决你的问题,请参考以下文章

ZABBIX 存在高危漏洞,尽快修补

如何修补/invoker/jmxinvokerservlet/漏洞

将数据存储在 SWF 文件中,无需解析它们

重建使用 javadecompilers.com 反编译的 .apk

无需备份即可恢复 Wordpress 数据库

AS3 Loader 不断重新加载相同的 swf