示例#1
0
        public override void SetupByOffset()
        {
            for (int i = 0; i < Selectors.Length; i++)
            {
                ShortElement c   = (ShortElement)Selectors[i];
                var          val = c.Value;

                var target = _script.GetElement(val);
                if (target != null && target is StringConst) //  || (target is StringPart)
                {
                    var r = new RefToElement(_script, c.Address, c.Value)
                    {
                        Source = this
                    };
                    c.ReplaceBy(r);
                    Selectors[i] = r;
                    r.SetupByOffset();
                }
            }

            {
                if (Selectors[3] is ShortElement s)
                {
                    StringPart p = _script.GetStringPart(s.Value);
                    if (p != null)
                    {
                        _script.Register(p);
                        var r = new RefToElement(_script, s.Address, s.Value)
                        {
                            Source = this
                        };
                        s.ReplaceBy(r);
                        Selectors[3] = r;
                        r.SetupByOffset();
                    }
                }
            }

            var nameRef = (Selectors[3] as RefToElement)?.Reference;

            if (nameRef != null)
            {
                if (nameRef is StringConst s)
                {
                    Name          = s.Value;
                    s.IsClassName = true;
                }
                else if (nameRef is StringPart p)
                {
                    Name = p.String;
                    p.OrigString.IsClassName = true;
                }
            }

            foreach (var r in FuncCode)
            {
                r.SetupByOffset();
            }
        }
示例#2
0
        private short GenerateShort(ShortElement shortElement)
        {
            var min = (BigInteger)shortElement.MinValue;
            var max = (BigInteger)shortElement.MaxValue;

            var b = RandomBigIntegerBetween(min, max, shortElement.ExcludeZero);

            return((short)b);
        }
示例#3
0
        public override void Read(byte[] data, ushort offset, int length)
        {
            var magic = ReadShortBE(data, ref offset);

            if (magic != 0x1234)
            {
                throw new System.Exception("Wrong class magic");
            }

            var varOffset = ReadShortBE(data, ref offset);

            if (varOffset != 0)
            {
                throw new System.Exception("Wrong class var offset");
            }

            funcList = ReadShortBE(data, ref offset);
            int selectorsCount = ReadShortBE(data, ref offset);

            Selectors = new BaseElement[selectorsCount];
            for (int i = 0; i < selectorsCount; i++)
            {
                var addr = offset;
                var val  = ReadShortBE(data, ref offset);
                Selectors[i] = new ShortElement(_script, addr, val);
            }

            if (Type == SectionType.Class)
            {
                varselectors = new ushort[selectorsCount];
                for (int i = 0; i < selectorsCount; i++)
                {
                    varselectors[i] = ReadShortBE(data, ref offset);
                }
            }

            int fs = ReadShortBE(data, ref offset);

            FuncNames = new ushort[fs];
            for (int i = 0; i < fs; i++)
            {
                FuncNames[i] = ReadShortBE(data, ref offset);
            }

            offset += 2;

            FuncCode = new FuncRef[fs];
            for (int i = 0; i < fs; i++)
            {
                var addr = offset;
                FuncCode[i] = new FuncRef(_script, addr, ReadShortBE(data, ref offset))
                {
                    Source = this
                };
            }
        }