• 另类方法将SWF植入AS3


    转自:http://flashteam.tencent.com/post/58/%e5%8f%a6%e7%b1%bb%e6%96%b9%e6%b3%95%e5%b0%86swf%e6%a4%8d%e5%85%a5as3/

      自从AS3引入ByteArray之后,可以玩的花样更多了,下面这种把SWF植入AS3的用法虽不常用,但是绝对可以满足初级代码控的需求。
    思路就是把SWF或者PNG/JPG的资源二进制文件流,以ASCII CODE的方式放置在一个AS数组,运行时写入到ByteArray中去,再用loadBytes加载到场景。
    这种方式比较适合把一些小的SWF文件嵌入到AS代码中去,不建议植入大文件或者大量植入。


    原理:
    代码

    /* generic by swf2class */
    /* original file: as2laucher.swf*/
     
    package
    {
        
    import flash.display.Loader;
        
    import flash.utils.ByteArray;
     
        
    public class Test extends Loader
        {
            
    public function Test()
            {
                
    super();
                var bytes:Array
    =[67,87,83,9,73,11,0,0,120,-100,-83,
                                                    
    86,75,83,-29,70,16,110,61,108,11,99/*,...*/];
                var bin:ByteArray
    =new ByteArray();
                            
    for(var i:int=0;i<bytes.length-1;bin.writeByte(bytes[i++]));
                
    this.loadBytes(bin);
            }
        }
    }

    基于命令行的swf2class代码:

    代码
    /**
     * swf2class
     *
     * by jackfu
     *
     * build:
     *   vc: cl.exe swf2class.c -o swf2class.exe
     *   gcc: gcc swf2class.c -o swf2class
     *
     * usage:
     *     swf2class "swf file" "namespace" "Classname" > Classname.as
     
    */ 
     
    #include 
    <stdio.h>
     
    int main(int argc, char** argv)
    {
        FILE 
    *fp;
        
    char buffer[1];
        
    char *pfile; // swf filename
        char *pns; // namespace
        char *pclass; // class name
     
        
    if (argc<4)
        {
            printf(
    "usage:\n\t%s swf namespace classname\n", argv[0]);
            
    return 0;
        }
     
        pfile 
    = argv[1];
        pns 
    = argv[2];
        pclass 
    = argv[3];
     
        fp 
    = fopen(pfile, "rb");
        
    if (fp)
        {
            printf(
    "/* generic by swf2class */\n/* original file: %s*/\n\n", pfile);
            printf(
    "package %s\n{\n\timport flash.display.Loader;\n\timport flash.utils.ByteArray;\n\n\tpublic class %s extends Loader\n\t{\n\t\tpublic function %s()\n\t\t{\n\t\t\tsuper();\n\t\t\tvar bytes:Array=[", pns, pclass, pclass);
            
    while(!feof(fp))
            {
                fread(buffer, sizeof(
    char), 1, fp );
                printf(
    "%d,", buffer[0]);
            }
            printf(
    "];\n\t\t\tvar bin:ByteArray=new ByteArray();for(var i:int=0;i<bytes.length-1;bin.writeByte(bytes[i++]));\n\t\t\tthis.loadBytes(bin);\n\t\t}\n\t}\n}\n");
     
            fclose(fp);
        }
     
        
    return 0;
    }

    可以考虑用于核心代码的加密

  • 相关阅读:
    为什么你不会redis分布式锁?因为你没看到这篇文章
    JavaScript最佳做法—创建对象
    js构造函数的定义
    作用域和闭包
    js中的call()和apply()的区别
    3种方法快速查找两个数组是否在Javascript中包含任何公共项
    JavaScript继承的6种方式以及它们的优缺点
    JS常见的内存泄漏及可用的解决方法
    Vuex简单入门
    如何使用HTML和CSS为背景创建Wave图片?
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/1723086.html
Copyright © 2020-2023  润新知