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); }
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); }
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; }
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()); }
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; } }
public As3GetDescendants(MultinameInfo multiname) { Multiname = multiname; }
public As3GetSuper(MultinameInfo multiname) { Multiname = multiname; }
/** * 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."); } }
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); }
public As3Coerce(MultinameInfo multiname) { Multiname = multiname; }
public As3FindPropStrict(MultinameInfo multiname) { Multiname = multiname; }
public As3CallSuperVoid(MultinameInfo multiname, uint argCount) { Multiname = multiname; ArgCount = argCount; }
public TraitsInfo this[MultinameInfo name] => _traits.FirstOrDefault(t => t.Name == name);
public As3ConstructProp(MultinameInfo multiname, uint argCount) { Multiname = multiname; ArgCount = argCount; }
public As3AsType(MultinameInfo multiname) { Multiname = multiname; }
public As3DeleteProperty(MultinameInfo multiname) { Multiname = multiname; }
public As3CallProperty(MultinameInfo multiname, uint argCount) { Multiname = multiname; ArgCount = argCount; }
public As3GetProperty(MultinameInfo multiname) { Multiname = multiname; }
public As3FindProperty(MultinameInfo multiname) { Multiname = multiname; }
public As3GetLex(MultinameInfo multiname) { Multiname = multiname; }
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 }