Пример #1
0
 public DefineFontNameTag(FlashReader reader, TagRecord header) :
     base(reader, header)
 {
     FontId        = reader.ReadUInt16();
     FontName      = reader.ReadNullTerminatedString();
     FontCopyright = reader.ReadNullTerminatedString();
 }
Пример #2
0
        protected HGame(FlashReader input)
            : base(input)
        {
            _abcFileTags = new Dictionary <DoABCTag, ABCFile>();

            ABCFiles = new List <ABCFile>();
        }
 public DefineBinaryDataTag(HeaderRecord header, FlashReader input)
     : base(header)
 {
     Id = input.ReadUInt16();
     input.ReadUInt32(); // Reserved | Must equal '0'.
     Data = input.ReadBytes(header.Length - 6);
 }
Пример #4
0
 public SetBackgroundColorTag(HeaderRecord header, FlashReader input)
     : base(header)
 {
     R = input.ReadByte();
     G = input.ReadByte();
     B = input.ReadByte();
 }
Пример #5
0
        private void FlashReader_Click(object sender, EventArgs e)
        {
            var flashReader = new FlashReader();

            flashReader.MdiParent = this;
            flashReader.Show();
        }
Пример #6
0
 protected void ReplaceNextOperation(FlashReader inCode, FlashWriter outCode, ASMethod method, OPCode oldOP, object[] oldValues, OPCode newOP, object[] newValues)
 {
     while (inCode.IsDataAvailable)
     {
         OPCode   op     = inCode.ReadOP();
         object[] values = inCode.ReadValues(op);
         if (op != oldOP)
         {
             outCode.WriteOP(op, values);
             continue;
         }
         if (oldValues != null && (oldValues.Length == values.Length))
         {
             bool valuesMatch = true;
             for (int i = 0; i < oldValues.Length; i++)
             {
                 if (oldValues[i] != null &&
                     !oldValues[i].Equals(values[i]))
                 {
                     valuesMatch = false;
                     break;
                 }
             }
             if (!valuesMatch)
             {
                 outCode.WriteOP(op, values);
                 continue;
             }
         }
         outCode.WriteOP(newOP, newValues);
         WriteLog($"Replaced operation '{oldOP}[{string.Join(", ", oldValues)}]' with '{newOP}[{string.Join(", ", newValues)}]' in method '{method}'.");
         break;
     }
 }
Пример #7
0
        protected ShockwaveFlash(FlashReader input)
            : this(false)
        {
            Compression = (CompressionKind)input.ReadString(3)[0];
            Version     = input.ReadByte();
            FileLength  = input.ReadUInt32();

            switch (Compression)
            {
            case CompressionKind.LZMA:
            {
                byte[] decompressed = LZMA.Decompress(input.BaseStream, ((int)FileLength - 8));
                _input = new FlashReader(decompressed);
                break;
            }

            case CompressionKind.ZLIB:
            {
                _input = ZLIB.WrapDecompressor(input.BaseStream);
                break;
            }

            case CompressionKind.None:
            {
                _input = input;
                break;
            }
            }
            Frame = new FrameRecord(_input);
        }
 public DefineFontNameTag(HeaderRecord header, FlashReader input)
     : base(header)
 {
     Id        = input.ReadUInt16();
     Name      = input.ReadNullString();
     Copyright = input.ReadNullString();
 }
Пример #9
0
        public ASInstance(ABCFile abc, FlashReader reader)
            : this(abc)
        {
            TypeIndex      = reader.Read7BitEncodedInt();
            SuperTypeIndex = reader.Read7BitEncodedInt();
            ClassInfo      = (ClassFlags)reader.ReadByte();

            if ((ClassInfo & ClassFlags.ProtectedNamespace) != 0)
            {
                ProtectedNamespaceIndex = reader.Read7BitEncodedInt();
            }

            InterfaceIndices.Capacity = reader.Read7BitEncodedInt();
            for (int i = 0; i < InterfaceIndices.Capacity; i++)
            {
                InterfaceIndices.Add(reader.Read7BitEncodedInt());
            }

            ConstructorIndex = reader.Read7BitEncodedInt();
            if (Constructor != null)
            {
                Constructor.IsConstructor = true;
            }

            Traits.Capacity = reader.Read7BitEncodedInt();
            for (int i = 0; i < Traits.Capacity; i++)
            {
                Traits.Add(new ASTrait(abc, reader));
            }
        }
Пример #10
0
        /// <summary>
        /// Returns the hardcoded client revision string from the Outgoing[4000] message class.
        /// </summary>
        /// <returns></returns>
        public string GetClientRevision()
        {
            if (!string.IsNullOrWhiteSpace(_clientRevision))
            {
                return(_clientRevision);
            }

            if (!(OutgoingMessages?.ContainsKey(4000) ?? false))
            {
                return(string.Empty);
            }

            ASInstance outgoingInstance = OutgoingMessages[4000].Instance;
            ASMethod   method           = outgoingInstance.FindFirstMethod(null, "Array");

            if (method == null)
            {
                return(string.Empty);
            }

            using (var inCode = new FlashReader(method.Body.Bytecode))
            {
                object[] values          = inCode.ReadValuesUntil(OPCode.PushString);
                var      pushStringIndex = (int)values[0];

                _clientRevision = method.ABC.Constants.Strings[pushStringIndex];
            }
            return(_clientRevision);
        }
Пример #11
0
        public ASInstance(ABCFile abc, FlashReader input)
            : this(abc)
        {
            QNameIndex = input.ReadInt30();
            SuperIndex = input.ReadInt30();
            Flags      = (ClassFlags)input.ReadByte();

            if (Flags.HasFlag(ClassFlags.ProtectedNamespace))
            {
                ProtectedNamespaceIndex = input.ReadInt30();
            }

            InterfaceIndices.Capacity = input.ReadInt30();
            for (int i = 0; i < InterfaceIndices.Capacity; i++)
            {
                int interfaceIndex = input.ReadInt30();
                InterfaceIndices.Add(interfaceIndex);
            }

            ConstructorIndex          = input.ReadInt30();
            Constructor.IsConstructor = true;
            Constructor.Container     = this;

            PopulateTraits(input);
        }
Пример #12
0
        protected virtual FlashTag ReadTag(FlashReader reader, TagRecord header)
        {
            FlashTag tag = null;

            switch (header.TagType)
            {
            default:
                tag = new UnknownTag(Reader, header);
                break;

            case FlashTagType.DoABC:
                tag = new DoABCTag(Reader, header);
                _abcFiles.Add(((DoABCTag)tag).ABC);
                break;

            case FlashTagType.DefineBitsLossless2:
                tag = new DefineBitsLossless2Tag(Reader, header);
                break;

            case FlashTagType.DefineBinaryData:
                tag = new DefineBinaryDataTag(Reader, header);
                break;
            }

            var character = (tag as ICharacter);

            if (character != null)
            {
                // Add ICharacter tag to the global dictionary.
                Dictionary.Characters[
                    character.CharacterId] = character;
            }
            return(tag);
        }
Пример #13
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ShockwaveFlash"/> class based on the specified array of bytes.
        /// </summary>
        /// <param name="data">The data containing the raw Shockwave Flash(SWF) file.</param>
        public ShockwaveFlash(byte[] data)
        {
            _flashData = data;
            _abcFiles  = new List <ABCFile>();

            Reader     = new FlashReader(data);
            Tags       = new List <FlashTag>();
            Dictionary = new FlashDictionary();

            Signature    = Reader.ReadString(3);
            CompressWith = (CompressionStandard)Signature[0];

            Version    = Reader.ReadByte();
            FileLength = Reader.ReadUInt32();

            if (CompressWith ==
                CompressionStandard.None)
            {
                ReadFrameInformation();
            }
            else
            {
                IsCompressed = true;
            }
        }
Пример #14
0
        public ASMethodBody(ABCFile abc, FlashReader reader)
            : this(abc)
        {
            MethodIndex       = reader.Read7BitEncodedInt();
            MaxStack          = reader.Read7BitEncodedInt();
            LocalCount        = reader.Read7BitEncodedInt();
            InitialScopeDepth = reader.Read7BitEncodedInt();
            MaxScopeDepth     = reader.Read7BitEncodedInt();

            int bytecodeLength = reader.Read7BitEncodedInt();
            Bytecode = reader.ReadBytes(bytecodeLength);

            Exceptions.Capacity = reader.Read7BitEncodedInt();
            for (int i = 0; i < Exceptions.Capacity; i++)
            {
                Exceptions.Add(new ASException(abc, reader));
            }

            Traits.Capacity = reader.Read7BitEncodedInt();
            for (int i = 0; i < Traits.Capacity; i++)
            {
                Traits.Add(new ASTrait(abc, reader));
            }

            Method.Body = this;
        }
Пример #15
0
        public DefineBinaryDataTag(FlashReader reader, TagRecord header)
            : base(reader, header)
        {
            CharacterId = reader.ReadUInt16();
            reader.ReadUInt32();

            BinaryData = reader.ReadBytes(header.Body.Length - 6);
        }
Пример #16
0
        public ASClass(ABCFile abc, FlashReader input) : base(abc)
        {
            ConstructorIndex          = input.ReadInt30();
            Constructor.IsConstructor = true;
            Constructor.Container     = this;

            PopulateTraits(input);
        }
Пример #17
0
 public DebugIns(ABCFile abc, FlashReader input)
     : this(abc)
 {
     DebugType     = input.ReadByte();
     NameIndex     = input.ReadInt30();
     RegisterIndex = input.ReadByte();
     Extra         = input.ReadInt30();
 }
Пример #18
0
 public ASException(ABCFile abc, FlashReader input)
     : base(abc)
 {
     From               = input.ReadInt30();
     To                 = input.ReadInt30();
     Target             = input.ReadInt30();
     ExceptionTypeIndex = input.ReadInt30();
     VariableNameIndex  = input.ReadInt30();
 }
        public SetBackgroundColorTag(HeaderRecord header, FlashReader input)
            : base(header)
        {
            byte r = input.ReadByte();
            byte g = input.ReadByte();
            byte b = input.ReadByte();

            BackgroundColor = Color.FromArgb(r, g, b);
        }
Пример #20
0
 public ASException(ABCFile abc, FlashReader reader)
     : this(abc)
 {
     From               = reader.Read7BitEncodedInt();
     To                 = reader.Read7BitEncodedInt();
     Target             = reader.Read7BitEncodedInt();
     ExceptionTypeIndex = reader.Read7BitEncodedInt();
     VariableNameIndex  = reader.Read7BitEncodedInt();
 }
Пример #21
0
 public ASNamespaceSet(ABCFile abc, FlashReader reader)
     : this(abc)
 {
     NamespaceIndices.Capacity = reader.Read7BitEncodedInt();
     for (int i = 0; i < NamespaceIndices.Capacity; i++)
     {
         NamespaceIndices.Add(reader.Read7BitEncodedInt());
     }
 }
Пример #22
0
        /// <summary>
        /// Injects the specified public RSA keys into the bytecode that handles the verification of the received primes.
        /// </summary>
        /// <param name="exponent">The public exponent.</param>
        /// <param name="modulus">The public modulus.</param>
        public void ReplaceRSAKeys(int exponent, string modulus)
        {
            ABCFile    abc = ABCFiles[2];
            ASInstance habboCommDemoInstance = abc.FindFirstInstanceByName("HabboCommunicationDemo");

            IEnumerable <MethodGetterSetterTrait> mgsTraits =
                habboCommDemoInstance.FindMethodGetterSetterTraits();

            ASMethod method          = null;
            int      rsaKeyTypeIndex = abc.Constants.IndexOfMultiname("RSAKey");

            foreach (MethodGetterSetterTrait mgsTrait in mgsTraits)
            {
                if (mgsTrait.Method.ReturnType.Name != "void")
                {
                    continue;
                }
                if (mgsTrait.Method.Parameters.Count != 1)
                {
                    continue;
                }

                if (ContainsOperation(mgsTrait.Method, OPCode.GetLex, rsaKeyTypeIndex))
                {
                    method = mgsTrait.Method;
                    WriteLog($"Found reference to 'RSAKey' in method '{method}'.");
                    break;
                }
            }

            using (var outCode = new FlashWriter())
                using (var inCode = new FlashReader(method.Body.Bytecode))
                {
                    int modulusStringIndex     = abc.Constants.AddString(modulus);
                    int exponentStringIndex    = abc.Constants.AddString(exponent.ToString("x")); // Turn the number to hex, remeber guys, (65537= 10001(hex))
                    int keyObfuscatorTypeIndex = abc.Constants.IndexOfMultiname("KeyObfuscator");

                    // Replace the first 'GetLex[KeyObfuscator]' operation with 'PushString[modulus]'.
                    ReplaceNextOperation(inCode, outCode, method,
                                         OPCode.GetLex, new object[] { keyObfuscatorTypeIndex },
                                         OPCode.PushString, new object[] { modulusStringIndex });

                    // Ignore these operations, do not write.
                    inCode.ReadValuesUntil(OPCode.CallProperty);

                    // Replace the second 'GetLex[KeyObfuscator]' operation with 'PushString[exponent]'.
                    ReplaceNextOperation(inCode, outCode, method,
                                         OPCode.GetLex, new object[] { keyObfuscatorTypeIndex },
                                         OPCode.PushString, new object[] { exponentStringIndex });

                    // Ignore these operations, do not write.
                    inCode.ReadValuesUntil(OPCode.CallProperty);

                    CopyBytecode(inCode, outCode);
                    method.Body.Bytecode = outCode.ToArray();
                }
        }
Пример #23
0
        public ASMultiname(ASConstantPool pool, FlashReader input)
            : this(pool)
        {
            Kind = (MultinameKind)input.ReadByte();
            switch (Kind)
            {
            case MultinameKind.QName:
            case MultinameKind.QNameA:
            {
                NamespaceIndex = input.ReadInt30();
                NameIndex      = input.ReadInt30();
                break;
            }

            case MultinameKind.RTQName:
            case MultinameKind.RTQNameA:
            {
                NameIndex = input.ReadInt30();
                break;
            }

            case MultinameKind.RTQNameL:
            case MultinameKind.RTQNameLA:
            {
                /* No data. */
                break;
            }

            case MultinameKind.Multiname:
            case MultinameKind.MultinameA:
            {
                NameIndex         = input.ReadInt30();
                NamespaceSetIndex = input.ReadInt30();
                break;
            }

            case MultinameKind.MultinameL:
            case MultinameKind.MultinameLA:
            {
                NamespaceSetIndex = input.ReadInt30();
                break;
            }

            case MultinameKind.TypeName:
            {
                QNameIndex           = input.ReadInt30();
                TypeIndices.Capacity = input.ReadInt30();
                for (int i = 0; i < TypeIndices.Capacity; i++)
                {
                    int typeIndex = input.ReadInt30();
                    TypeIndices.Add(typeIndex);
                }
                break;
            }
            }
        }
Пример #24
0
        public ASTrait(ABCFile abc, FlashReader input)
            : this(abc)
        {
            QNameIndex = input.ReadInt30();

            byte bitContainer = input.ReadByte();
            Kind       = (TraitKind)(bitContainer & 0x0F);
            Attributes = (TraitAttributes)(bitContainer >> 4);

            Id = input.ReadInt30();
            switch (Kind)
            {
            case TraitKind.Slot:
            case TraitKind.Constant:
            {
                TypeIndex  = input.ReadInt30();
                ValueIndex = input.ReadInt30();
                if (ValueIndex != 0)
                {
                    ValueKind = (ConstantKind)input.ReadByte();
                }
                break;
            }

            case TraitKind.Method:
            case TraitKind.Getter:
            case TraitKind.Setter:
            {
                MethodIndex  = input.ReadInt30();
                Method.Trait = this;
                break;
            }

            case TraitKind.Class:
            {
                ClassIndex = input.ReadInt30();
                break;
            }

            case TraitKind.Function:
            {
                FunctionIndex = input.ReadInt30();
                break;
            }
            }

            if (Attributes.HasFlag(TraitAttributes.Metadata))
            {
                MetadataIndices.Capacity = input.ReadInt30();
                for (int i = 0; i < MetadataIndices.Capacity; i++)
                {
                    int metadatumIndex = input.ReadInt30();
                    MetadataIndices.Add(metadatumIndex);
                }
            }
        }
Пример #25
0
 public LookUpSwitchIns(FlashReader input)
     : this()
 {
     DefaultOffset        = input.ReadUInt24();
     CaseOffsets.Capacity = (input.ReadInt30() + 1);
     for (int i = 0; i < CaseOffsets.Capacity; i++)
     {
         CaseOffsets.Add(input.ReadUInt24());
     }
 }
Пример #26
0
        public SetBackgroundColorTag(FlashReader reader, TagRecord header) :
            base(reader, header)
        {
            byte red   = reader.ReadByte();
            byte green = reader.ReadByte();
            byte blue  = reader.ReadByte();

            BackgroundColor =
                Color.FromArgb(red, green, blue);
        }
Пример #27
0
 public ASNamespace(ASConstantPool pool, FlashReader input)
     : base(pool)
 {
     Kind = (NamespaceKind)input.ReadByte();
     if (!Enum.IsDefined(typeof(NamespaceKind), Kind))
     {
         throw new InvalidCastException($"Invalid namespace kind for value {Kind:0x00}.");
     }
     NameIndex = input.ReadInt30();
 }
Пример #28
0
        public RectangeRecord(FlashReader input)
        {
            int maxBitCount = input.ReadUB(5);

            X     = input.ReadSB(maxBitCount);
            Width = (input.ReadSB(maxBitCount) / 20);

            Y      = input.ReadSB(maxBitCount);
            Height = (input.ReadSB(maxBitCount) / 20);
        }
Пример #29
0
 public ASNamespaceSet(ASConstantPool pool, FlashReader input)
     : this(pool)
 {
     NamespaceIndices.Capacity = input.ReadInt30();
     for (int i = 0; i < NamespaceIndices.Capacity; i++)
     {
         int namespaceIndex = input.ReadInt30();
         NamespaceIndices.Add(namespaceIndex);
     }
 }
Пример #30
0
        public DoABCTag(HeaderRecord header, FlashReader input)
            : base(header)
        {
            Flags = input.ReadUInt32();
            Name  = input.ReadNullString();

            int partialLength = (Encoding.UTF8.GetByteCount(Name) + 5);

            ABCData = input.ReadBytes(header.Length - partialLength);
        }