Пример #1
0
        public static byte[] EditHost(byte[] raw, int localPort)
        {
            var swf = new Swf();

            swf.Decompile(raw);

            foreach (var doAbcTag in swf.DoAbcTagList)
            {
                var abc          = doAbcTag.AbcData;
                var constantPool = abc.ConstantPool;
                var localServer  = $"info@{ProductConfiguration.LocalIP}";

                foreach (var instance in abc.InstanceArray)
                {
                    var className = instance.Name.MKQName.Name;
                    var nameSpace = instance.ProtectedNamespace?.Name?.String;
                    var traits    = instance.TraitArray.GetTraits();

                    if (nameSpace != "ProductConfiguration")
                    {
                        continue;
                    }

                    foreach (var trait in traits)
                    {
                        var memberName = trait.Name.MKQName.Name;

                        if (memberName == "infoHost")
                        {
                            var method   = ((TraitGetter)trait.Trait).Method;
                            var bin      = method.MethodBody.Code;
                            var byteCode = new ByteCode(bin, abc);

                            var instructions = new List <As3Instruction>();
                            var index        = constantPool.StringArrayLength;
                            var stringInfo   = new StringInfo(index, localServer);

                            constantPool.SetStringAt(stringInfo, index);

                            instructions.Add(new As3PushString(index));
                            instructions.Add(new As3ReturnValue());

                            var count = 0;

                            foreach (var instruction in instructions)
                            {
                                byteCode.AddInstructionAt(instruction, count++);
                            }

                            while (byteCode.GetInstructions().Count > count)
                            {
                                byteCode.RemoveInstructionAt(count - 1);
                            }

                            method.MethodBody.Code = byteCode.GetBytes();
                        }
                        else if (memberName == "infoWebSocketPort")
                        {
                            var method       = ((TraitGetter)trait.Trait).Method;
                            var bin          = method.MethodBody.Code;
                            var byteCode     = new ByteCode(bin, abc);
                            var instructions = byteCode.GetInstructions();

                            for (var count = 0; count < instructions.Count; count++)
                            {
                                if (instructions[count] is As3PushShort port &&
                                    443 == port.Short)
                                {
                                    var index = constantPool.IntArrayLength;
                                    constantPool.SetIntAt(localPort, index);
                                    instructions[count] = new As3PushInt(index);
                                }
                            }

                            method.MethodBody.Code = byteCode.GetBytes();
                        }
                    }
                }
            }

            return(swf.Compile());
        }