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); }
private void ModifyBin(DefineBinaryDataTag binaryTag) { string binaryDataBody = Encoding.UTF8 .GetString(binaryTag.BinaryData); if (binaryDataBody.Contains("habbo_login_dialog")) { string realRsaKeys = binaryDataBody .GetChild("name=\"dummy_field\" caption=\"", '"'); if (string.IsNullOrWhiteSpace(realRsaKeys)) { return; } ExtractRsaKeys(realRsaKeys); string fakeRsaKeys = EncodeRsaKeys( HandshakeManager.FAKE_EXPONENT, HandshakeManager.FAKE_MODULUS); binaryTag.BinaryData = Encoding.UTF8.GetBytes( binaryDataBody.Replace(realRsaKeys, fakeRsaKeys)); } }
SwfTagData ISwfTagVisitor <ISwfStreamWriter, SwfTagData> .Visit(DefineBinaryDataTag tag, ISwfStreamWriter writer) { return(null); }
public void ReplaceLocalizationDefaults(RetroLocalizationConfig[] localizationConfigs) { var abc = _flash.AbcGame; var symbols = (SymbolClassTag)_flash.Tags.Last(x => x.Kind == TagKind.SymbolClass); var localizationClass = abc.GetClass("HabboLocalizationCom"); // Save all old localizations. var localizations = localizationConfigs .Select(x => x.HotelCodeBase).Distinct() .ToDictionary(x => x, y => { var binaryDataId = symbols.Entries.First(x => x.Item2.Contains(y)); var binaryData = (DefineBinaryDataTag)_flash.Tags.First(x => x.Kind == TagKind.DefineBinaryData && ((DefineBinaryDataTag)x).Id == binaryDataId.Item1); return(binaryData.Data); }); // Find all old localizations. var localizationSymbols = symbols.Entries.Where(x => x.Item2.Contains("default_localizations_")).ToArray(); var localizationTraits = localizationClass.Traits.Where(x => x.IsStatic && x.QName.Name.StartsWith("default_localizations_")).ToArray(); var localizationClasses = abc.Classes.Where(x => x.QName.Name.StartsWith("default_localizations_")).ToArray(); if (localizationSymbols.Length != localizationTraits.Length || localizationTraits.Length != localizationClasses.Length) { throw new ApplicationException("Localization result amount mismatch."); } // Remove all old localization references. // - Remove symbols foreach (var symbol in localizationSymbols) { _flash.Tags.RemoveAll(x => x.Kind == TagKind.DefineBinaryData && ((DefineBinaryDataTag)x).Id == symbol.Item1); symbols.Entries.RemoveAll(x => x.Item1 == symbol.Item1); } // - Remove "public static var default_localizations_*" localizationClass.Traits.RemoveAll(trait => trait.QName.Name.StartsWith("default_localizations_")); var body = localizationClass.Constructor.Body.ParseCode(); var getLex = body.First(x => x.OP == OPCode.GetLex && ((GetLexIns)x).TypeName.Name.StartsWith("default_localizations_")); var getLexIndex = body.IndexOf(getLex); var setProp = body.LastIndexOf(body.Count - 1, OPCode.SetProperty); body.RemoveRange(getLexIndex, setProp - getLexIndex + 1); localizationClass.Constructor.Body.Code = body.ToArray(); // - Remove "default_localizations_" classes / instances / scripts // TODO: Figure out how to fix all index based stuff, because this messes it up. DO NOT USE YET. // _flash.AbcGame.Classes.RemoveAll(x => x.QName.Name.StartsWith("default_localizations_")); // _flash.AbcGame.Instances.RemoveAll(x => x.QName.Name.StartsWith("default_localizations_")); // _flash.AbcGame.Scripts.RemoveAll(x => x.QName.Name.Contains("default_localizations_")); // Add localizations. foreach (var config in localizationConfigs) { var localizationName = $"custom_localizations_{config.HotelCode}"; var defLocalizationName = $"own_default_localizations_{config.HotelCode}"; var localizationMultiNameIndex = abc.Pool.AddConstant(new ASMultiname(abc.Pool) { NameIndex = abc.Pool.AddConstant(localizationName), Kind = MultinameKind.QName, NamespaceIndex = 1 }); #region Create localization class // Create instance. var instanceConstructor = new ASMethod(abc) { ReturnTypeIndex = 0 }; var instanceConstructorIndex = abc.AddMethod(instanceConstructor); var instanceConstructorBody = new ASMethodBody(abc) { MethodIndex = instanceConstructorIndex, MaxStack = 1, LocalCount = 1, InitialScopeDepth = 0, MaxScopeDepth = 1, Code = new byte[] { 0xD0, 0x30, 0xD0, 0x49, 0x00, 0x47 } }; abc.AddMethodBody(instanceConstructorBody); // Create class. var classConstructor = new ASMethod(abc) { ReturnTypeIndex = 0 }; var classConstructorIndex = abc.AddMethod(classConstructor); var classConstructorBody = new ASMethodBody(abc) { MethodIndex = classConstructorIndex, MaxStack = 0, LocalCount = 1, InitialScopeDepth = 0, MaxScopeDepth = 0, Code = new byte[] { 0x47 } }; abc.AddMethodBody(classConstructorBody); // Add class to SWF. var classIndex = abc.AddClass( new ASClass(abc) { ConstructorIndex = classConstructorIndex }, new ASInstance(abc) { ConstructorIndex = instanceConstructorIndex, QNameIndex = localizationMultiNameIndex, SuperIndex = abc.Pool.GetMultinameIndex("ByteArray"), Flags = ClassFlags.Sealed } ); // Create script. var initializerMethod = new ASMethod(abc) { ReturnTypeIndex = 0 }; var initializerMethodIndex = abc.AddMethod(initializerMethod); var initializerMethodBody = new ASMethodBody(abc) { MethodIndex = initializerMethodIndex, MaxStack = 3, LocalCount = 1, InitialScopeDepth = 0, MaxScopeDepth = 3, Code = new byte[0] }; abc.AddMethodBody(initializerMethodBody); var initializerMethodBodyCode = new ASCode(abc, initializerMethodBody); initializerMethodBodyCode.AddRange(new ASInstruction[] { new GetLocal0Ins(), new PushScopeIns(), new GetScopeObjectIns(0), new GetLexIns(abc, abc.Pool.GetMultinameIndex("Object")), new PushScopeIns(), new GetLexIns(abc, abc.Pool.GetMultinameIndex("ByteArray")), new DupIns(), new PushScopeIns(), new NewClassIns(abc, classIndex), new PopScopeIns(), new PopScopeIns(), new InitPropertyIns(abc, localizationMultiNameIndex), new ReturnVoidIns() }); initializerMethodBody.Code = initializerMethodBodyCode.ToArray(); var initScript = new ASScript(abc) { InitializerIndex = initializerMethodIndex }; initScript.Traits.Add(new ASTrait(abc) { ClassIndex = classIndex, QNameIndex = localizationMultiNameIndex, Kind = TraitKind.Class }); _flash.AbcGame.AddScript(initScript); #endregion #region Create binary data symbol var symbolId = symbols.AddSymbol(localizationName); var data = localizations[config.HotelCodeBase]; _flash.Tags.Insert(_flash.Tags.IndexOf(symbols), new DefineBinaryDataTag(symbolId, data)); #endregion #region Add to HabboLocalizationCom var defLocalizationMultiNameIndex = abc.Pool.AddConstant(new ASMultiname(abc.Pool) { NameIndex = abc.Pool.AddConstant(defLocalizationName), Kind = MultinameKind.QName, NamespaceIndex = 1 }); localizationClass.Traits.Add(new ASTrait(abc) { QNameIndex = defLocalizationMultiNameIndex, TypeIndex = abc.Pool.GetMultinameIndex("Class") }); var constructorBody = localizationClass.Constructor.Body.ParseCode(); constructorBody.InsertRange(constructorBody.Count - 1, new ASInstruction[] { new GetLexIns(abc, localizationMultiNameIndex), new FindPropertyIns(abc, defLocalizationMultiNameIndex), new SwapIns(), new SetPropertyIns(abc, defLocalizationMultiNameIndex) }); localizationClass.Constructor.Body.Code = constructorBody.ToArray(); #endregion } // Swap localization to load. var stringId = abc.Pool.Strings.IndexOf("default_localizations_"); abc.Pool.Strings[stringId] = "own_default_localizations_"; // Replace localization_configuration_txt. var locConfigBuilder = new StringBuilder(); for (var i = 0; i < localizationConfigs.Length; i++) { var config = localizationConfigs[i]; var currentId = i + 1; locConfigBuilder.AppendLine($"localization.{currentId}={config.HotelCode}"); locConfigBuilder.AppendLine($"localization.{currentId}.code={config.Code}"); locConfigBuilder.AppendLine($"localization.{currentId}.name={config.Name}"); locConfigBuilder.AppendLine($"localization.{currentId}.url={config.Url}"); } var locConfigId = symbols.Entries.First(x => x.Item2.Contains("localization_configuration_txt")); var locConfig = (DefineBinaryDataTag)_flash.Tags.First(x => x.Kind == TagKind.DefineBinaryData && ((DefineBinaryDataTag)x).Id == locConfigId.Item1); locConfig.Data = Encoding.UTF8.GetBytes(locConfigBuilder.ToString()); // Replace localizations manifest. string localizationManifestStr = null; DefineBinaryDataTag localizationManifest = null; foreach (var(entryId, _) in symbols.Entries) { var binaryData = (DefineBinaryDataTag)_flash.Tags.FirstOrDefault(x => x.Kind == TagKind.DefineBinaryData && ((DefineBinaryDataTag)x).Id == entryId); if (binaryData != null) { var dataString = Encoding.UTF8.GetString(binaryData.Data); if (dataString.Contains("<asset mimeType=\"text/plain\" name=\"default_localizations_en\" />")) { localizationManifestStr = dataString; localizationManifest = binaryData; break; } } } if (localizationManifest == null || localizationManifestStr == null) { throw new ApplicationException("Could not find localizationManifest or localizationManifestStr."); } var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(localizationManifestStr); var defaultLoc = new string[] { "development_localizations" }; var manifestAssets = xmlDocument.GetElementsByTagName("assets")[0]; manifestAssets.RemoveAll(); foreach (var name in defaultLoc.Union(localizationConfigs.Select(x => "own_default_localizations_" + x.HotelCode))) { var child = xmlDocument.CreateElement("asset"); child.SetAttribute("mimeType", "text/plain"); child.SetAttribute("name", name); manifestAssets.AppendChild(child); } using (var stringWriter = new StringWriter()) using (var xmlTextWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings { Indent = true })) { xmlDocument.WriteTo(xmlTextWriter); xmlTextWriter.Flush(); localizationManifest.Data = Encoding.UTF8.GetBytes(stringWriter.GetStringBuilder().ToString()); } }
SwfTagBase ISwfTagVisitor <ISwfStreamReader, SwfTagBase> .Visit(DefineBinaryDataTag tag, ISwfStreamReader reader) { return(tag); }
static SwfTagBase Create(SwfTagData tag_data) { var reader = new SwfStreamReader(tag_data.TagData); switch (tag_data.TagId) { // Display list case (int)SwfTagType.PlaceObject: return(PlaceObjectTag.Create(reader)); case (int)SwfTagType.PlaceObject2: return(PlaceObject2Tag.Create(reader)); case (int)SwfTagType.PlaceObject3: return(PlaceObject3Tag.Create(reader)); case (int)SwfTagType.RemoveObject: return(RemoveObjectTag.Create(reader)); case (int)SwfTagType.RemoveObject2: return(RemoveObject2Tag.Create(reader)); case (int)SwfTagType.ShowFrame: return(ShowFrameTag.Create(reader)); // Control case (int)SwfTagType.SetBackgroundColor: return(SetBackgroundColorTag.Create(reader)); case (int)SwfTagType.FrameLabel: return(FrameLabelTag.Create(reader)); case (int)SwfTagType.Protect: return(ProtectTag.Create(reader)); case (int)SwfTagType.End: return(EndTag.Create(reader)); case (int)SwfTagType.ExportAssets: return(ExportAssetsTag.Create(reader)); case (int)SwfTagType.ImportAssets: return(UnsupportedTag.Create(SwfTagType.ImportAssets)); case (int)SwfTagType.EnableDebugger: return(EnableDebuggerTag.Create(reader)); case (int)SwfTagType.EnableDebugger2: return(EnableDebugger2Tag.Create(reader)); case (int)SwfTagType.ScriptLimits: return(ScriptLimitsTag.Create(reader)); case (int)SwfTagType.SetTabIndex: return(UnsupportedTag.Create(SwfTagType.SetTabIndex)); case (int)SwfTagType.ImportAssets2: return(UnsupportedTag.Create(SwfTagType.ImportAssets2)); case (int)SwfTagType.SymbolClass: return(SymbolClassTag.Create(reader)); case (int)SwfTagType.Metadata: return(MetadataTag.Create(reader)); case (int)SwfTagType.DefineScalingGrid: return(UnsupportedTag.Create(SwfTagType.DefineScalingGrid)); case (int)SwfTagType.DefineSceneAndFrameLabelData: return(DefineSceneAndFrameLabelDataTag.Create(reader)); // Actions case (int)SwfTagType.DoAction: return(UnsupportedTag.Create(SwfTagType.DoAction)); case (int)SwfTagType.DoInitAction: return(UnsupportedTag.Create(SwfTagType.DoInitAction)); case (int)SwfTagType.DoABC: return(DoABCTag.Create(reader)); // Shape case (int)SwfTagType.DefineShape: return(DefineShapeTag.Create(reader)); case (int)SwfTagType.DefineShape2: return(DefineShape2Tag.Create(reader)); case (int)SwfTagType.DefineShape3: return(DefineShape3Tag.Create(reader)); case (int)SwfTagType.DefineShape4: return(DefineShape4Tag.Create(reader)); // Bitmaps case (int)SwfTagType.DefineBits: return(UnsupportedTag.Create(SwfTagType.DefineBits)); case (int)SwfTagType.JPEGTables: return(UnsupportedTag.Create(SwfTagType.JPEGTables)); case (int)SwfTagType.DefineBitsJPEG2: return(UnsupportedTag.Create(SwfTagType.DefineBitsJPEG2)); case (int)SwfTagType.DefineBitsJPEG3: return(UnsupportedTag.Create(SwfTagType.DefineBitsJPEG3)); case (int)SwfTagType.DefineBitsLossless: return(DefineBitsLosslessTag.Create(reader)); case (int)SwfTagType.DefineBitsLossless2: return(DefineBitsLossless2Tag.Create(reader)); case (int)SwfTagType.DefineBitsJPEG4: return(UnsupportedTag.Create(SwfTagType.DefineBitsJPEG4)); // Shape Morphing case (int)SwfTagType.DefineMorphShape: return(UnsupportedTag.Create(SwfTagType.DefineMorphShape)); case (int)SwfTagType.DefineMorphShape2: return(UnsupportedTag.Create(SwfTagType.DefineMorphShape2)); // Fonts and Text case (int)SwfTagType.DefineFont: return(UnsupportedTag.Create(SwfTagType.DefineFont)); case (int)SwfTagType.DefineFontInfo: return(UnsupportedTag.Create(SwfTagType.DefineFontInfo)); case (int)SwfTagType.DefineFontInfo2: return(UnsupportedTag.Create(SwfTagType.DefineFontInfo2)); case (int)SwfTagType.DefineFont2: return(UnsupportedTag.Create(SwfTagType.DefineFont2)); case (int)SwfTagType.DefineFont3: return(UnsupportedTag.Create(SwfTagType.DefineFont3)); case (int)SwfTagType.DefineFontAlignZones: return(UnsupportedTag.Create(SwfTagType.DefineFontAlignZones)); case (int)SwfTagType.DefineFontName: return(UnsupportedTag.Create(SwfTagType.DefineFontName)); case (int)SwfTagType.DefineText: return(UnsupportedTag.Create(SwfTagType.DefineText)); case (int)SwfTagType.DefineText2: return(UnsupportedTag.Create(SwfTagType.DefineText2)); case (int)SwfTagType.DefineEditText: return(UnsupportedTag.Create(SwfTagType.DefineEditText)); case (int)SwfTagType.CSMTextSettings: return(UnsupportedTag.Create(SwfTagType.CSMTextSettings)); case (int)SwfTagType.DefineFont4: return(UnsupportedTag.Create(SwfTagType.DefineFont4)); // Sounds case (int)SwfTagType.DefineSound: return(UnsupportedTag.Create(SwfTagType.DefineSound)); case (int)SwfTagType.StartSound: return(UnsupportedTag.Create(SwfTagType.StartSound)); case (int)SwfTagType.StartSound2: return(UnsupportedTag.Create(SwfTagType.StartSound2)); case (int)SwfTagType.SoundStreamHead: return(UnsupportedTag.Create(SwfTagType.SoundStreamHead)); case (int)SwfTagType.SoundStreamHead2: return(UnsupportedTag.Create(SwfTagType.SoundStreamHead2)); case (int)SwfTagType.SoundStreamBlock: return(UnsupportedTag.Create(SwfTagType.SoundStreamBlock)); // Buttons case (int)SwfTagType.DefineButton: return(UnsupportedTag.Create(SwfTagType.DefineButton)); case (int)SwfTagType.DefineButton2: return(UnsupportedTag.Create(SwfTagType.DefineButton2)); case (int)SwfTagType.DefineButtonCxform: return(UnsupportedTag.Create(SwfTagType.DefineButtonCxform)); case (int)SwfTagType.DefineButtonSound: return(UnsupportedTag.Create(SwfTagType.DefineButtonSound)); // Sprites and Movie Clips case (int)SwfTagType.DefineSprite: return(DefineSpriteTag.Create(reader)); // Video case (int)SwfTagType.DefineVideoStream: return(UnsupportedTag.Create(SwfTagType.DefineVideoStream)); case (int)SwfTagType.VideoFrame: return(UnsupportedTag.Create(SwfTagType.VideoFrame)); // Metadata case (int)SwfTagType.FileAttributes: return(FileAttributesTag.Create(reader)); case (int)SwfTagType.EnableTelemetry: return(EnableTelemetryTag.Create(reader)); case (int)SwfTagType.DefineBinaryData: return(DefineBinaryDataTag.Create(reader)); default: return(UnknownTag.Create(tag_data.TagId)); } }
public void Decompile(Byte[] data) { SwfStream stream = data; Signature = stream.ReadStringBytes(3); Version = stream.ReadByte(); Length = stream.ReadInt(); int startTime = Environment.TickCount; if (Signature == "CWS") { stream = ZlibStream.UncompressBuffer(stream.ReadToEnd()); Signature = "FWS"; } if (Signature == "ZWS") { Signature = "FWS"; int length = stream.ReadInt(); byte[] properties = stream.ReadBytes(5); byte[] compressed = stream.ReadBytes(length); Decoder coder = new Decoder(); MemoryStream output = new MemoryStream(Length - 8); coder.SetDecoderProperties(properties); coder.Code(new MemoryStream(compressed), output, length, Length - 8, null); byte[] d = new byte[Length - 8]; output.Position = 0; output.Read(d, 0, Length - 8); stream = d; } int time = Environment.TickCount - startTime; if (Signature != "FWS") { throw new Exception("Unsupported signature: " + Signature); } FrameSize = stream.ReadRect(); FrameRate = stream.ReadFixed8(); FrameCount = stream.ReadShort(); TagList = new List <BaseTag>(); DoAbcTagList = new List <DoAbcTag>(); SymbolClassTagList = new List <SymbolClassTag>(); DefineBinaryDataTagList = new List <DefineBinaryDataTag>(); while (stream.Position < stream.Length) { short tagHeader = stream.ReadShort(); short code = (short)(tagHeader >> 6); int length = tagHeader & 63; if (length == 63) { length = stream.ReadInt(); } byte[] tagBody = stream.ReadBytes(length); BaseTag tag = null; switch (code) { case 82: tag = new DoAbcTag(tagBody); DoAbcTagList.Add(tag as DoAbcTag); break; case 76: tag = new SymbolClassTag(tagBody); SymbolClassTagList.Add(tag as SymbolClassTag); break; case 87: tag = new DefineBinaryDataTag(tagBody); DefineBinaryDataTagList.Add(tag as DefineBinaryDataTag); break; default: tag = new BaseTag(code, tagBody); break; } TagList.Add(tag); } }
ITagFormatter ISwfTagVisitor <object, ITagFormatter> .Visit(DefineBinaryDataTag tag, object arg) { return(new DefineBinaryDataTagFormatter()); }
public SwfDisplayList Visit(DefineBinaryDataTag tag, SwfDisplayList dl) { return(dl); }
protected virtual TagItem ReadTag(HeaderRecord header, FlashReader input) { TagItem tag = null; switch (header.Kind) { case TagKind.DefineBinaryData: tag = new DefineBinaryDataTag(header, input); break; case TagKind.DefineBitsLossless2: tag = new DefineBitsLossless2Tag(header, input); break; case TagKind.DefineFontName: tag = new DefineFontNameTag(header, input); break; case TagKind.DefineSound: tag = new DefineSoundTag(header, input); break; case TagKind.DoABC: tag = new DoABCTag(header, input); break; case TagKind.End: tag = new EndTag(header); break; case TagKind.ExportAssets: tag = new ExportAssetsTag(header, input); break; case TagKind.FileAttributes: tag = new FileAttributesTag(header, input); break; case TagKind.FrameLabel: tag = new FrameLabelTag(header, input); break; case TagKind.ProductInfo: tag = new ProductInfoTag(header, input); break; case TagKind.ScriptLimits: tag = new ScriptLimitsTag(header, input); break; case TagKind.SetBackgroundColor: tag = new SetBackgroundColorTag(header, input); break; case TagKind.ShowFrame: tag = new ShowFrameTag(header); break; case TagKind.SymbolClass: tag = new SymbolClassTag(header, input); break; default: case TagKind.Unknown: tag = new UnknownTag(header, input); break; } return(tag); }