Ejemplo n.º 1
0
        public MultinameInfo ReadMultinameInfo(ConstantPoolInfo constantPool, uint index)
        {
            MultinameInfo result = new MultinameInfo(index);

            result.Kind = (MultinameKind)ReadByte();
            switch (result.Kind)
            {
            case MultinameKind.QName:
            case MultinameKind.QNameA:
                var mkQName = new MKQName();
                mkQName.Namespace = constantPool.GetNamespaceAt(ReadU30());
                mkQName.Name      = constantPool.GetStringAt(ReadU30());
                result.Data       = mkQName;
                break;

            case MultinameKind.RTQName:
            case MultinameKind.RTQNameA:
                var mkRtkName = new MKRTQName();
                mkRtkName.Name = constantPool.GetStringAt(ReadU30());
                result.Data    = mkRtkName;
                break;

            case MultinameKind.RTQNameL:
            case MultinameKind.RTQNameLA:
                var mkRtqNameL = new MKRTQNameL();
                result.Data = mkRtqNameL;
                break;

            case MultinameKind.Multiname:
            case MultinameKind.MultinameA:
                var mkMultiname = new MKMultiname();

                mkMultiname.Name         = constantPool.GetStringAt(ReadU30());
                mkMultiname.NamespaceSet = constantPool.GetNamespaceSetAt(ReadU30());
                result.Data = mkMultiname;
                break;

            case MultinameKind.MultinameL:
            case MultinameKind.MultinameLA:
                var mkMultinameL = new MKMultinameL();
                mkMultinameL.NamespaceSet = constantPool.GetNamespaceSetAt(ReadU30());
                result.Data = mkMultinameL;
                break;

            case MultinameKind.GenericName:
                var mkGenericName = new MKGenericName(constantPool);
                mkGenericName.TypeDefinitionIndex = ReadU30();
                mkGenericName.ParamArrayIndexes   = ReadU30Array(ReadU30());
                result.Data = mkGenericName;
                break;

            default:
                throw new Exception();
            }
            return(result);
        }
Ejemplo n.º 2
0
 public int FindClass(MultinameInfo name)
 {
     for (int i = 0; i < AbcClassArray.Length; i++)
     {
         if (AbcClassArray[i].InstanceInfo.Name.Index == name.Index)
         {
             return(i);
         }
     }
     return(-1);
 }
Ejemplo n.º 3
0
        public void SetMultinameAt(MultinameInfo value, uint index)
        {
            index--;
            if (MultinameArray.Count > index && Multinames.ContainsKey(MultinameArray[(int)index]))
            {
                Multinames.Remove(MultinameArray[(int)index]);
            }

            if (MultinameArray.Count == index)
            {
                MultinameArray.Add(value);
            }
            else
            {
                MultinameArray[(int)index] = value;
            }
            Multinames[value] = index;
        }
Ejemplo n.º 4
0
        public void Constructor(IList <As3Instruction> as3)
        {
            as3.Clear();

            var multinameArray = constantPool.GetMultinameArray();
            var multinameInfos = new MultinameInfo[] {
                multinameArray.FirstOrDefault(
                    multiname => multiname.MKQName?.Name?.String == "jKanjiList"),
                multinameArray.FirstOrDefault(
                    multiname => multiname.MKQName?.Name?.String == "jList"),
                multinameArray.FirstOrDefault(
                    multiname => multiname.MKQName?.Name?.String == "list")
            };

            as3.Add(new As3GetLocal0());
            as3.Add(new As3PushScope());

            var typingTable = new string[] {
                "さあ",
                "げーむをはじめよう"
            };

            var count = (uint)typingTable.Length;

            foreach (var multinameInfo in multinameInfos)
            {
                as3.Add(new As3FindProperty(multinameInfo));

                foreach (var typingData in typingTable)
                {
                    var stringArray = constantPool.StringArrayLength;
                    var stringInfo  = new StringInfo(stringArray, typingData);
                    constantPool.SetStringAt(stringInfo, stringArray);
                    as3.Add(new As3PushString(stringInfo));
                }

                as3.Add(new As3NewArray(count));
                as3.Add(new As3InitProperty(multinameInfo));
            }

            as3.Add(new As3ReturnVoid());
        }
Ejemplo n.º 5
0
        public void WriteMultinameInfo(MultinameInfo value)
        {
            WriteByte((Byte)value.Kind);

            switch (value.Kind)
            {
            case MultinameKind.QName:
            case MultinameKind.QNameA:
                WriteU30((value.Data as MKQName).Namespace.Index);
                WriteU30((value.Data as MKQName).Name.Index);
                break;

            case MultinameKind.RTQName:
            case MultinameKind.RTQNameA:
                WriteU30((value.Data as MKRTQName).Name.Index);
                break;

            case MultinameKind.RTQNameL:
            case MultinameKind.RTQNameLA:
                break;

            case MultinameKind.Multiname:
            case MultinameKind.MultinameA:
                WriteU30((value.Data as MKMultiname).Name.Index);
                WriteU30((value.Data as MKMultiname).NamespaceSet.Index);
                break;

            case MultinameKind.MultinameL:
            case MultinameKind.MultinameLA:
                WriteU30((value.Data as MKMultinameL).NamespaceSet.Index);
                break;

            case MultinameKind.GenericName:
                WriteU30((value.Data as MKGenericName).TypeDefinition.Index);
                WriteU30Array((from n in (value.Data as MKGenericName).ParamArray select n.Index).ToArray(), true);
                break;
            }
        }
Ejemplo n.º 6
0
 public As3GetDescendants(MultinameInfo multiname)
 {
     Multiname = multiname;
 }
Ejemplo n.º 7
0
 public As3GetSuper(MultinameInfo multiname)
 {
     Multiname = multiname;
 }
Ejemplo n.º 8
0
        /**
         * HERE STARTS THE SPAGHETTI CODE
         */
        public static string ResolveMultiname(Abc46 abc, MultinameInfo multiName)
        {
            NamespaceInfo    ns;
            NamespaceSetInfo nss;
            StringInfo       name;

            string result;

            switch (multiName.Kind)
            {
            case MultinameInfo.RTQName:
            case MultinameInfo.RTQNameA:
                //Console.WriteLine("[-] RTQName/RTQNameA is currently not supported.");
                return(((StringInfo)abc.ConstantPool.StringTable[(int)multiName.Data[0].Value]).ToString());

            case MultinameInfo.QName:
            case MultinameInfo.QNameA:
                ns   = ((NamespaceInfo)abc.ConstantPool.NamespaceTable[(int)multiName.Data[0].Value]);
                name = ((StringInfo)abc.ConstantPool.StringTable[(int)multiName.Data[1].Value]);

                result = "";

                switch (ns.Kind)
                {
                case NamespaceInfo.Namespace:
                case NamespaceInfo.ExplicitNamespace:
                    //TODO implement this
                    //user defined
                    break;

                case NamespaceInfo.PrivateNs:
                    result = "private";
                    break;

                case NamespaceInfo.ProtectedNamespace:
                    result = "protected";
                    break;

                case NamespaceInfo.StaticProtectedNs:
                    result = "protected$";
                    break;

                case NamespaceInfo.PackageInternalNs:
                    result = "internal";
                    break;

                case NamespaceInfo.PackageNamespace:
                    result = "public";
                    break;

                default:
                    result = "*";
                    break;
                    //throw new VerifyException("Unexpected namespace kind.");
                }

                if (0 != ns.Name.Value)
                {
                    string namespaceName = ((StringInfo)abc.ConstantPool.StringTable[(int)ns.Name.Value]).ToString();
                    if ("" != namespaceName && result != "")
                    {
                        result += "::";
                    }
                    result += namespaceName;
                }

                result += "::" + name.ToString();

                return(result);

            case MultinameInfo.RTQNameL:
            case MultinameInfo.RTQNameLA:
                Console.WriteLine("[-] RTQNameL/RTQameLA is currently not supported.");
                return("");

            case MultinameInfo.Multiname_:
            case MultinameInfo.MultinameA:
                //TODO fix this -- what about the namespace set here?
                //Console.WriteLine("[-] Multiname/MultinameA is currently not supported.");

                name = ((StringInfo)abc.ConstantPool.StringTable[(int)multiName.Data[0].Value]);
                nss  = ((NamespaceSetInfo)abc.ConstantPool.NamespaceSetTable[(int)multiName.Data[1].Value]);

                return(name.ToString());;

            case MultinameInfo.MultinameL:
            case MultinameInfo.MultinameLA:
                //Console.WriteLine("[-] MultinameL/MultinameLA is currently not supported.")
                nss = ((NamespaceSetInfo)abc.ConstantPool.NamespaceSetTable[(int)multiName.Data[0].Value]);
                string set = "[";
                for (int i = 0, n = nss.NamespaceSet.Count; i < n; ++i)
                {
                    U30 nssNs = (U30)nss.NamespaceSet[i];
                    ns = ((NamespaceInfo)abc.ConstantPool.NamespaceTable[(int)nssNs.Value]);

                    string r2 = "";

                    switch (ns.Kind)
                    {
                    case NamespaceInfo.Namespace:
                    case NamespaceInfo.ExplicitNamespace:
                        //TODO implement this
                        //user defined
                        break;

                    case NamespaceInfo.PrivateNs:
                        r2 = "private";
                        break;

                    case NamespaceInfo.ProtectedNamespace:
                        r2 = "protected";
                        break;

                    case NamespaceInfo.StaticProtectedNs:
                        r2 = "protected$";
                        break;

                    case NamespaceInfo.PackageInternalNs:
                        r2 = "internal";
                        break;

                    case NamespaceInfo.PackageNamespace:
                        r2 = "public";
                        break;

                    default:
                        r2 = "*";
                        break;
                    }

                    set += String.Format("{0}::{1}", r2, ((StringInfo)abc.ConstantPool.StringTable[(int)ns.Name.Value]).ToString());

                    if (i != n - 1)
                    {
                        set += ", ";
                    }
                }

                set += "]";

                return(set);

            default:
                return("*");
                //throw new VerifyException("Unknown multiname kind.");
            }
        }
Ejemplo n.º 9
0
        public static U30 GetMultiname(Abc46 abc, string argument)
        {
            if (argument.StartsWith("#"))
            {
                int index = int.Parse(argument.Substring(1, argument.Length - 1));

                if (index < abc.ConstantPool.MultinameTable.Count && index > 0)
                {
                    return((U30)index);
                }

                throw new Exception(String.Format("Invalid multiname {0}", index));
            }

            NamespaceInfo    ns;
            NamespaceSetInfo nss;
            StringInfo       name;

            bool skipQname = argument.IndexOf("[") == 0;

            if (skipQname)
            {
                //BAD quick dirty hack
                argument = argument.Replace(" ", "");
            }

            string tempName;
            U30    result = new U30();

            for (int i = 1, n = abc.ConstantPool.MultinameTable.Count; i < n; ++i)
            {
                MultinameInfo multiName = (MultinameInfo)abc.ConstantPool.MultinameTable[i];

                switch (multiName.Kind)
                {
                    #region QName, QNameA

                case MultinameInfo.QName:
                case MultinameInfo.QNameA:

                    if (skipQname)
                    {
                        continue;
                    }

                    ns   = ((NamespaceInfo)abc.ConstantPool.NamespaceTable[(int)multiName.Data[0].Value]);
                    name = ((StringInfo)abc.ConstantPool.StringTable[(int)multiName.Data[1].Value]);

                    tempName = "";

                    switch (ns.Kind)
                    {
                    case NamespaceInfo.Namespace:
                    case NamespaceInfo.ExplicitNamespace:
                        //TODO implement this
                        //user defined
                        break;

                    case NamespaceInfo.PrivateNs:
                        tempName = "private";
                        break;

                    case NamespaceInfo.ProtectedNamespace:
                        tempName = "protected";
                        break;

                    case NamespaceInfo.StaticProtectedNs:
                        tempName = "protected$";
                        break;

                    case NamespaceInfo.PackageInternalNs:
                        tempName = "internal";
                        break;

                    case NamespaceInfo.PackageNamespace:
                        tempName = "public";
                        break;

                    default:
                        tempName = "*";
                        break;
                    }

                    if (0 != ns.Name.Value)
                    {
                        string namespaceName = ((StringInfo)abc.ConstantPool.StringTable[(int)ns.Name.Value]).ToString();
                        if ("" != namespaceName && tempName != "")
                        {
                            tempName += "::";
                        }
                        tempName += namespaceName;
                    }

                    tempName += "::" + name.ToString();

                    if (tempName == argument)
                    {
                        result.Value = (uint)i;
                        return(result);
                    }
                    break;

                    #endregion

                    #region MultinameL, MultinameLA

                case MultinameInfo.MultinameL:
                case MultinameInfo.MultinameLA:

                    if (!skipQname)
                    {
                        continue;
                    }

                    tempName = "[";

                    nss = (NamespaceSetInfo)abc.ConstantPool.NamespaceSetTable[(int)multiName.Data[0].Value];

                    for (int j = 0, m = nss.NamespaceSet.Count; j < m; ++j)
                    {
                        U30 nssNs = (U30)nss.NamespaceSet[j];
                        ns = ((NamespaceInfo)abc.ConstantPool.NamespaceTable[(int)nssNs.Value]);

                        string r2 = "";

                        switch (ns.Kind)
                        {
                        case NamespaceInfo.Namespace:
                        case NamespaceInfo.ExplicitNamespace:
                            //TODO implement this
                            //user defined
                            break;

                        case NamespaceInfo.PrivateNs:
                            r2 = "private";
                            break;

                        case NamespaceInfo.ProtectedNamespace:
                            r2 = "protected";
                            break;

                        case NamespaceInfo.StaticProtectedNs:
                            r2 = "protected$";
                            break;

                        case NamespaceInfo.PackageInternalNs:
                            r2 = "internal";
                            break;

                        case NamespaceInfo.PackageNamespace:
                            r2 = "public";
                            break;

                        default:
                            r2 = "*";
                            break;
                        }

                        tempName += r2 + "::" + ((StringInfo)abc.ConstantPool.StringTable[(int)ns.Name.Value]).ToString();

                        if (j != (m - 1))
                        {
                            tempName += ",";
                        }
                    }

                    tempName += "]";

                    if (argument == tempName)
                    {
                        result.Value = (uint)i;
                        return(result);
                    }
                    break;

                    #endregion

                default:
                    continue;
                }
            }

            if (skipQname)
            {
                #region Create MultinameL
                //
                // Create a MultinameL
                //

                // Remove [] from argument
                argument = argument.Substring(1, argument.Length - 2);


                // Get new NamespaceSet index
                U30 setIndex = new U30();
                setIndex.Value = (uint)abc.ConstantPool.NamespaceSetTable.Count;


                // Create MultinameInfo
                MultinameInfo newName = new MultinameInfo();
                newName.Data = new U30[1] {
                    setIndex
                };
                newName.Kind = MultinameInfo.MultinameL;


                // Create NamespaceSet
                NamespaceSetInfo newSet = new NamespaceSetInfo();
                newSet.NamespaceSet = new ArrayList();

                abc.ConstantPool.NamespaceSetTable.Add(newSet);

                for (int i = 0, n = abc.ConstantPool.NamespaceTable.Count; i < n; ++i)
                {
                    ns = (NamespaceInfo)abc.ConstantPool.NamespaceTable[i];

                    string r2 = "";

                    switch (ns.Kind)
                    {
                    case NamespaceInfo.Namespace:
                    case NamespaceInfo.ExplicitNamespace:
                        //TODO implement this
                        //user defined
                        break;

                    case NamespaceInfo.PrivateNs:
                        r2 = "private";
                        break;

                    case NamespaceInfo.ProtectedNamespace:
                        r2 = "protected";
                        break;

                    case NamespaceInfo.StaticProtectedNs:
                        r2 = "protected$";
                        break;

                    case NamespaceInfo.PackageInternalNs:
                        r2 = "internal";
                        break;

                    case NamespaceInfo.PackageNamespace:
                        r2 = "public";
                        break;

                    default:
                        r2 = "*";
                        break;
                    }

                    r2 += "::" + ((StringInfo)abc.ConstantPool.StringTable[(int)ns.Name.Value]).ToString();

                    if (argument.IndexOf(r2) != -1)
                    {
                        U30 nsIndex = new U30();
                        nsIndex.Value = (uint)i;

                        newSet.NamespaceSet.Add(nsIndex);
                    }
                }

                result.Value = (uint)abc.ConstantPool.MultinameTable.Count;
                abc.ConstantPool.MultinameTable.Add(newName);

                #endregion
            }
            else
            {
                #region Create QName

                // Create a QName

                U30 nsIndex = new U30();

                if (argument.IndexOf("::") == argument.LastIndexOf("::"))
                {
                    nsIndex.Value = GetNamespace(abc, argument.Substring(0, argument.LastIndexOf("::") + 2)).Value;
                }
                else
                {
                    nsIndex.Value = GetNamespace(abc, argument.Substring(0, argument.LastIndexOf("::"))).Value;
                }

                MultinameInfo newQName = new MultinameInfo();
                newQName.Data = new U30[2] {
                    nsIndex, (U30)abc.ConstantPool.ResolveString(argument.Substring(argument.LastIndexOf("::") + 2))
                };
                newQName.Kind = MultinameInfo.QName;

                result.Value = (uint)abc.ConstantPool.MultinameTable.Count;

                abc.ConstantPool.MultinameTable.Add(newQName);

                #endregion
            }

            return(result);
        }
Ejemplo n.º 10
0
 public As3Coerce(MultinameInfo multiname)
 {
     Multiname = multiname;
 }
Ejemplo n.º 11
0
 public As3FindPropStrict(MultinameInfo multiname)
 {
     Multiname = multiname;
 }
Ejemplo n.º 12
0
 public As3CallSuperVoid(MultinameInfo multiname, uint argCount)
 {
     Multiname = multiname;
     ArgCount  = argCount;
 }
Ejemplo n.º 13
0
 public TraitsInfo this[MultinameInfo name] => _traits.FirstOrDefault(t => t.Name == name);
Ejemplo n.º 14
0
 public As3ConstructProp(MultinameInfo multiname, uint argCount)
 {
     Multiname = multiname;
     ArgCount  = argCount;
 }
Ejemplo n.º 15
0
 public As3AsType(MultinameInfo multiname)
 {
     Multiname = multiname;
 }
Ejemplo n.º 16
0
 public As3DeleteProperty(MultinameInfo multiname)
 {
     Multiname = multiname;
 }
Ejemplo n.º 17
0
 public As3CallProperty(MultinameInfo multiname, uint argCount)
 {
     Multiname = multiname;
     ArgCount  = argCount;
 }
Ejemplo n.º 18
0
 public As3GetProperty(MultinameInfo multiname)
 {
     Multiname = multiname;
 }
Ejemplo n.º 19
0
 public As3FindProperty(MultinameInfo multiname)
 {
     Multiname = multiname;
 }
Ejemplo n.º 20
0
 public As3GetLex(MultinameInfo multiname)
 {
     Multiname = multiname;
 }
Ejemplo n.º 21
0
        public void ReadExternal(BinaryReader input)
        {
            #region integer

            uint n = Primitives.ReadU30(input).Value;

            _intTable = new ArrayList(Capacity.Max(n));
            _intTable.Add(new S32());

            for (uint i = 1; i < n; ++i)
            {
                _intTable.Add(Primitives.ReadS32(input));
            }

            #endregion

            #region uinteger

            n = Primitives.ReadU30(input).Value;

            _uintTable = new ArrayList(Capacity.Max(n));
            _uintTable.Add(new U32());

            for (uint i = 1; i < n; ++i)
            {
                _uintTable.Add(Primitives.ReadU32(input));
            }

            #endregion

            #region double

            n = Primitives.ReadU30(input).Value;

            _doubleTable = new ArrayList(Capacity.Max(n));
            _doubleTable.Add(double.NaN);

            for (uint i = 1; i < n; ++i)
            {
                _doubleTable.Add(input.ReadDouble());
            }

            #endregion

            #region string_info

            n = Primitives.ReadU30(input).Value;

            _stringTable = new ArrayList(Capacity.Max(n));
            _stringTable.Add(new StringInfo());

            for (uint i = 1; i < n; ++i)
            {
                StringInfo stringInfo = new StringInfo();
                stringInfo.ReadExternal(input);

                _stringTable.Add(stringInfo);
            }

            #endregion

            #region namespace_info

            n = Primitives.ReadU30(input).Value;

            _namespaceTable = new ArrayList(Capacity.Max(n));
            _namespaceTable.Add(new NamespaceInfo());

            for (uint i = 1; i < n; ++i)
            {
                NamespaceInfo namespaceInfo = new NamespaceInfo();
                namespaceInfo.ReadExternal(input);

                _namespaceTable.Add(namespaceInfo);
            }

            #endregion

            #region ns_set_info

            n = Primitives.ReadU30(input).Value;

            _nsTable = new ArrayList(Capacity.Max(n));
            _nsTable.Add(new NamespaceSetInfo());

            for (uint i = 1; i < n; ++i)
            {
                NamespaceSetInfo nsInfo = new NamespaceSetInfo();
                nsInfo.ReadExternal(input);

                _nsTable.Add(nsInfo);
            }

            #endregion

            #region multiname_info

            n = Primitives.ReadU30(input).Value;

            _multinameTable = new ArrayList(Capacity.Max(n));
            _multinameTable.Add(new MultinameInfo());

            for (uint i = 1; i < n; ++i)
            {
                MultinameInfo multinameInfo = new MultinameInfo();
                multinameInfo.ReadExternal(input);

                _multinameTable.Add(multinameInfo);
            }

            #endregion
        }