internal void ParseCode(DoABCTag doabc) { if (doabc.Strings.ContainsValue("CURRENT_VERSION")) { } try { while (_byteReader.LeftBytes > 0) { byte __opcode = _byteReader.GetByte(); if (OpCodes.Exists(__opcode)) { OpCode __OpCode = OpCodes.GetOpCode(__opcode); char[] __parameters = __OpCode.parameters.ToCharArray(); __OpCode.datas = new object[__parameters.Length]; for (int __i = 0; __i < __parameters.Length; __i++) { object data = null; char __parameter = __parameters[__i]; if (__parameter == 'n') // generic integer { data = _byteReader.GetInt30(); } else if (__parameter == '2') //multiname { data = doabc.Multinames[_byteReader.GetUInt30()]; } else if (__parameter == 'N') //namespace { data = doabc.Namespaces[_byteReader.GetUInt30()]; } else if (__parameter == 'U') //uint { data = doabc.UIntegers[_byteReader.GetUInt30()]; } else if (__parameter == 'I') //int { data = doabc.Integers[_byteReader.GetUInt30()]; } else if (__parameter == 'f') //double { data = doabc.Doubles[_byteReader.GetUInt30()]; } else if (__parameter == 'm') //method { data = doabc.MethodInfos[_byteReader.GetUInt30()]; } else if (__parameter == 'c') //classinfo { data = doabc.Classes[_byteReader.GetUInt30()]; } else if (__parameter == 'i') //methodbody { _byteReader.GetUInt30(); //data = array_getvalue(file->method_bodies, swf_GetU30(tag)); } else if (__parameter == 'u') // generic uinteger { data = _byteReader.GetInt30(); } else if (__parameter == 'r') // local register { data = _byteReader.GetInt30(); } else if (__parameter == 'b') // byte { data = _byteReader.GetByte(); } else if (__parameter == 'j') // jump { data = _byteReader.GetU24(); } else if (__parameter == 's') // string { data = doabc.Strings[_byteReader.GetUInt30()]; } else if (__parameter == 'D') // debug { /*type, usually 1*/ byte __type = _byteReader.GetByte(); if (__type != 1) { //fprintf(stderr, "Unknown debug type: %02x\n", type); } /*register name*/ //code->data[0] = strdup((char*)pool_lookup_string(pool, swf_GetU30(tag))); _byteReader.GetUInt30(); /*register index*/ //code->data[1] = (void*)(ptroff_t)swf_GetU8(tag); _byteReader.GetByte(); /*unused*/ _byteReader.GetUInt30(); } else if (__parameter == 'S') // switch statement { uint __def = _byteReader.GetU24(); uint __targets_number = _byteReader.GetUInt30(); for (uint __j = 0; __j < __targets_number; __j++) { uint __target = _byteReader.GetU24(); } /* * lookupswitch_t* l = malloc(sizeof(lookupswitch_t)); * l->def = (code_t*)(ptroff_t)swf_GetS24(tag); * l->targets = list_new(); * int num = swf_GetU30(tag) + 1; * int t; * for (t = 0; t < num; t++) * list_append(l->targets, (code_t*)(ptroff_t)swf_GetS24(tag)); * data = l; * */ } else { //printf("Can't parse opcode param type \"%c\" (for op %02x %s).\n", *p, code->opcode, op->name); return; } __OpCode.datas[__i] = data; //code->data[pos++] = data; } Codes.Add(__OpCode); } else { } } if (Codes.Count > 0 && doabc.Strings.ContainsValue("CURRENT_VERSION")) { for (int __i = 0; __i < Codes.Count; __i++) { Console.WriteLine(__i.ToString("00000") + ") " + Codes[__i].name); } } } catch { } }
internal void Extract(ByteReader r) { magic = r.GetUI32(); switch (magic) //3014672 - 0x002e0010 { case (46 << 16 | 14): case (46 << 16 | 15): case (46 << 16 | 16): case (47 << 16 | 12): case (47 << 16 | 13): case (47 << 16 | 14): case (47 << 16 | 15): case (47 << 16 | 16): case (47 << 16 | 17): case (47 << 16 | 18): case (47 << 16 | 19): case (47 << 16 | 20): break; default: Console.WriteLine("not an abc file. magic=" + magic.ToString("X2")); return; } //switch a byte ??? //if (r.PeekByte() == 2) //{ //byte __startByte = r.GetByte(); //} //Console.WriteLine("!!! " + r.LeftBytes + " BYTES !!! "); // ints uint __n = r.GetUInt30(); Integers.Clear(); if (__n > 0) { Integers[0] = 0; } //Console.Write("Pool of " + (__n > 0 ? (__n - 1).ToString() : "0") + " int : ["); for (uint __i = 1; __i < __n; __i++) { try { Integers[__i] = r.GetInt30(); //Console.Write(" " + Integers[__i] + " "); } catch { } } //Console.WriteLine("]"); // uints __n = r.GetUInt30(); UIntegers.Clear(); if (__n > 0) { UIntegers[0] = 0; } //Console.Write("Pool of " + (__n > 0 ? (__n - 1).ToString() : "0") + " uint : ["); for (uint __i = 1; __i < __n; __i++) { try { UIntegers[__i] = r.GetUInt30(); //Console.Write(" " + UIntegers[__i] + " "); } catch { } } //Console.WriteLine("]"); // doubles __n = r.GetUInt30(); Doubles.Clear(); if (__n > 0) { Doubles[0] = 0; } //Console.Write("Pool of " + (__n > 0 ? (__n - 1).ToString() : "0") + " double : ["); for (uint __i = 1; __i < __n; __i++) { try { Doubles[__i] = r.GetDouble(); // Console.Write(" " + Doubles[__i] + " "); } catch { } } //Console.WriteLine("]"); // strings __n = r.GetUInt30(); Strings.Clear(); if (__n > 0) { Strings[0] = ""; } string[] strings = new string[__n]; //Console.Write("Pool of " + (__n > 0 ? (__n - 1).ToString() : "0") + " string : ["); for (uint __i = 1; __i < __n; __i++) { try { Strings[__i] = r.GetUTF8Bytes(r.GetUInt30()); //Console.Write(" \"" + Strings[__i] + "\" "); } catch { } } //Console.WriteLine("]"); // namespaces __n = r.GetUInt30(); Namespaces.Clear(); if (__n > 0) { Namespaces[0] = new AS3_Namespace(); } //Console.Write("Pool of " + (__n > 0 ? (__n - 1).ToString() : "0") + " namespace : ["); for (uint __i = 1; __i < __n; __i++) { try { byte __namespace_type = r.GetByte(); switch (__namespace_type) { case CONSTANT_Namespace: case CONSTANT_PackageNs: case CONSTANT_PackageInternalNs: case CONSTANT_ProtectedNs: case CONSTANT_StaticProtectedNs: case CONSTANT_StaticProtectedNs2: case CONSTANT_PrivateNs: string __namespace = Strings[r.GetUInt30()]; Namespaces[__i] = new AS3_Namespace(__namespace, __namespace_type); //Console.Write(" " + Namespaces[__i] + " "); break; case 210: uint __rere = r.GetUInt30(); string __namespace2 = Strings[__rere]; //Namespaces[__i] = "private"; Namespaces[__i] = new AS3_Namespace("private", __namespace_type); //Console.Write(" private "); break; default: //Console.WriteLine("not Namespaces type =" + __namespace_type.ToString("X2")); break; } } catch { } } //Console.WriteLine("]"); // namespace sets __n = r.GetUInt30(); NamespaceSets.Clear(); if (__n > 0) { NamespaceSets[0] = new Dictionary <uint, AS3_Namespace>(); } //Console.WriteLine("Pool of " + (__n > 0 ? (__n - 1).ToString() : "0") + " sets namespace : ["); for (uint __i = 1; __i < __n; __i++) { try { Dictionary <uint, AS3_Namespace> __namespaceSet = new Dictionary <uint, AS3_Namespace>(); uint __nnset_count = r.GetUInt30(); //Console.Write(" Pool of #" + __i + " set namespace : ["); for (uint __j = 0; __j < __nnset_count; __j++) { uint __index = r.GetUInt30(); if (Namespaces.Count > __index) { __namespaceSet[__j] = Namespaces[__index]; //Console.Write(" \"" + Namespaces[__index] + "\" "); } else { } } NamespaceSets[__i] = __namespaceSet; //Console.WriteLine(" ]"); } catch { } } //Console.WriteLine("]"); // multinames Multinames.Clear(); __n = r.GetUInt30(); //Console.WriteLine("Pool of " + (__n > 0 ? (__n - 1).ToString() : "0") + " Multiname : ["); if (__n > 0) { Multinames[0] = new Multiname(0, "*", 0); } for (uint __i = 1; __i < __n; __i++) { try { uint __index1; uint __index2; byte __kind = r.GetByte(); switch (__kind) { case CONSTANT_Qname: case CONSTANT_QnameA: __index1 = r.GetUInt30(); __index2 = r.GetUInt30(); Multinames[__i] = new QName(Namespaces[__index1], Strings[__index2], __kind); break; case CONSTANT_RTQname: case CONSTANT_RTQnameA: __index1 = r.GetUInt30(); Multinames[__i] = new RTQName(Strings[__index1], __kind); break; case CONSTANT_RTQnameL: case CONSTANT_RTQnameLA: Multinames[__i] = new AbstractMultiname(__kind); break; case CONSTANT_NameL: case CONSTANT_NameLA: Multinames[__i] = new QName(new AS3_Namespace(), null, __kind); break; case CONSTANT_Multiname: case CONSTANT_MultinameA: __index1 = r.GetUInt30(); __index2 = r.GetUInt30(); string __nameMultiname = Strings[__index1]; Multinames[__i] = new Multiname(__index2, __nameMultiname, __kind); break; case CONSTANT_MultinameL: case CONSTANT_MultinameLA: __index1 = r.GetUInt30(); Multinames[__i] = new Multiname(__index1, null, __kind); break; case CONSTANT_TypeName: __index1 = r.GetUInt30(); uint __TypeNameCount = r.GetUInt30(); AbstractMultiname __nameTypeName = Multinames[__index1]; Dictionary <int, AbstractMultiname> __types = new Dictionary <int, AbstractMultiname>(); for (int __j = 0; __j < __TypeNameCount; __j++) { __index2 = r.GetUInt30(); __types[__j] = Multinames[__index2]; } Multinames[__i] = new TypeName(__nameTypeName, __types, __kind); break; default: Console.Write("invalid kind " + __kind); break; } } catch { } } //Console.WriteLine("]"); //--------------Method----------------------- try { __n = r.GetUInt30(); MethodInfos.Clear(); //Console.WriteLine("Pool of " + (__n) + " Method : ["); for (uint __i = 0; __i < __n; __i++) { try { AS3_MethodInfo m = new AS3_MethodInfo(); m.method_id = __i; uint __param_count = r.GetUInt30(); uint __return_type_index = r.GetUInt30(); m.returnType = Multinames[__return_type_index]; m.paramTypes = new Dictionary <uint, AbstractMultiname>(); for (uint __j = 0; __j < __param_count; __j++) { uint __type_index = r.GetUInt30(); m.paramTypes[__j] = Multinames[__type_index]; } m.debugName = Strings[r.GetUInt30()]; m.flags = r.GetByte(); if ((m.flags & HAS_OPTIONAL) != 0) { uint __optional_count = r.GetUInt30(); for (uint __k = 0; __k < __optional_count; __k++) { uint __param_index = r.GetUInt30(); // optional value index uint __param_kind = r.GetByte(); // kind byte for each default value if (__param_index == 0) { // kind is ignored, default value is based on type //m.optionalValues[k] = undefined; } else { /* * if (!defaults[kind]) * this.log.errorPrint("ERROR kind="+kind+" method_id " + i + "\r"); * else * m.optionalValues[k] = defaults[kind][index]; */ } } } if ((m.flags & HAS_ParamNames) != 0) { // has_paramnames for (int __k = 0; __k < __param_count; __k++) { r.GetUInt30(); } } MethodInfos[__i] = m; } catch { } } } catch { } //parseMetadataInfos MetaDatas.Clear(); try { __n = r.GetUInt30(); //Console.WriteLine("Pool of " + (__n) + " metadata "); for (uint __i = 0; __i < __n; __i++) { try { AS3_Metadata __Metadata = new AS3_Metadata(); __Metadata.name = Strings[r.GetUInt30()]; uint __values_count = r.GetUInt30(); __Metadata.values = new Dictionary <string, string>(); /* * Dictionary<uint, string> __metadatanames = new Dictionary<uint, string>(); * for (uint __j = 0; __j < __values_count; __j++) * { * __metadatanames.Add(__j, Strings[r.GetUInt30()]); * } */ for (uint __j = 0; __j < __values_count; __j++) { __Metadata.values.Add(Strings[r.GetUInt30()], Strings[r.GetUInt30()]); //__Metadata.values.Add(__metadatanames[__j], Strings[r.GetUInt30()]); } MetaDatas[__i] = __Metadata; } catch { } } } catch { } //parseClassInfos FAKE try { Classes.Clear(); __n = r.GetUInt30(); //Console.WriteLine("Pool of " + (__n) + " Class info "); for (uint __i = 0; __i < __n; __i++) { try { AS3_Class _class = new AS3_Class(); _class.classname = Multinames[r.GetUInt30()]; //classname _class.superclass = Multinames[r.GetUInt30()]; //supername superclass _class.flags = r.GetByte(); if ((_class.flags & 8) != 0) { _class.protectedNs = Namespaces[r.GetUInt30()]; //protectedNS } uint __interface_count = r.GetUInt30(); //interface count for (uint __k = 0; __k < __interface_count; __k++) { uint __interface_index = r.GetUInt30(); } uint __interface_init = r.GetUInt30(); //iinit _class.constructor = MethodInfos[__interface_init]; _class.traits = new AS3_Traits(); _class.traits.ParseTraits(r, this); Classes[__i] = _class; } catch { } } for (uint __i = 0; __i < __n; __i++) { try { uint __class_init = r.GetUInt30(); //cinit Classes[__i].static_traits = new AS3_Traits(); Classes[__i].static_traits.ParseTraits(r, this); } catch { } } } catch { } //parseScriptInfos try { Scripts.Clear(); __n = r.GetUInt30(); //Console.WriteLine("Pool of " + (__n) + " Script info "); for (uint __i = 0; __i < __n; __i++) { try { DoABC_Script __script = new DoABC_Script(); __script.constructor = MethodInfos[r.GetUInt30()]; __script.traits = new AS3_Traits(); __script.traits.ParseTraits(r, this); /* * DoABC_Traits t = new DoABC_Traits(); * t.name = "script" + __i; * t.baseName = Multinames[0]; // Object * t.init = MethodInfos[r.GetUInt30()]; * t.init.name = t.name + "$init"; * t.init.kind = TRAIT_Method; * */ //_ParseTraits(r, t); //DoABC_Traits.SkipTraits(r); Scripts[__i] = __script; } catch { } } } catch { } //return; //parseMethodBodies try { __n = r.GetUInt30(); //Console.WriteLine("Pool of " + (__n) + " MethodBodies "); for (uint __i = 0; __i < __n; __i++) { try { AS3_MethodInfo m = MethodInfos[r.GetUInt30()]; m.max_stack = r.GetUInt30(); m.local_count = r.GetUInt30(); uint initScopeDepth = r.GetUInt30(); uint maxScopeDepth = r.GetUInt30(); m.max_scope = maxScopeDepth - initScopeDepth; uint code_length = r.GetUInt30(); if (code_length > 0) { m.code = new AS3_Code(r.GetBytes(code_length)); m.code.ParseCode(this); } m.exceptions = new Dictionary <uint, AS3_Exception>(); uint exception_count = r.GetUInt30(); for (uint __j = 0; __j < exception_count; __j++) { AS3_Exception __exception = new AS3_Exception(); __exception.from = r.GetUInt30(); __exception.to = r.GetUInt30(); __exception.target = r.GetUInt30(); __exception.var_type = Multinames[r.GetUInt30()]; //var exc_type = multiname_clone(pool_lookup_multiname(pool, swf_GetU30(tag))); __exception.var_name = Multinames[r.GetUInt30()]; //var name:* = names[readU32()]; m.exceptions.Add(__j, __exception); } m.activation = new AS3_Traits(); m.activation.ParseTraits(r, this); } catch { } } } catch { } int __leftBytes = r.LeftBytes; /* * if (__leftBytes > 0) * { * Console.WriteLine("!!! " + __leftBytes + " BYTES LEFT !!! "); * } * else if (__leftBytes == 0) * { * Console.WriteLine("!!! DONE !!! "); * } * else * { * Console.WriteLine("!!! ERROR !!! " + __leftBytes + " BYTES MIN !!! "); * } */ }