コード例 #1
0
ファイル: fClass.cs プロジェクト: TheCrazyT/FlashABCRead
 public static void AddClass(fClass c)
 {
     foreach (cProp p in c.properties)
     {
         propertyTypes.Add(c.name + "." + p.name, p.type);
     }
     FoundClasses.Add(c);
 }
コード例 #2
0
ファイル: ItemEntry.cs プロジェクト: TheCrazyT/DSO_Economic
 public CItemEntry(fClass c)
 {
     _ID = (uint)(last_ID + 1);
     last_ID = (int)_ID;
     this.cls = c;
     if (_ID < Global.itemnames.Count)
         _Name = Global.itemnames[(int)_ID];
     else
         _Name = "";
 }
コード例 #3
0
ファイル: fClass.cs プロジェクト: TheCrazyT/FlashABCRead
        private fClass getC(string property, string type)
        {
            string[] steps = property.Split('.');
            long     pos   = classStream.Position;

            if (steps.Length == 1)
            {
                BinaryReader br = new BinaryReader(classStream);
                classStream.Seek(Offset(type + "." + property), SeekOrigin.Current);
                classStream.Seek(br.ReadInt32(), SeekOrigin.Begin);
                fClass c = new fClass(classStream, this.getType(property));
                classStream.Seek(pos, SeekOrigin.Begin);
                return(c);
            }
            else
            {
                BinaryReader br = new BinaryReader(classStream);
                classStream.Seek(Offset(type + "." + steps[0]), SeekOrigin.Current);
                int i = br.ReadInt32();
                classStream.Seek(i, SeekOrigin.Begin);
                property = "";
                int x;
                for (x = 1; x < steps.Length - 1; x++)
                {
                    property += steps[x] + ".";
                }
                property += steps[x];

                string t         = this.getType(steps[0]);
                string main_name = this.name;
                this.name = t;
                fClass c = null;
                try
                {
                    c = getC(property, t);
                }
                finally
                {
                    this.name = main_name;
                    classStream.Seek(pos, SeekOrigin.Begin);
                }
                return(c);
            }
        }
コード例 #4
0
ファイル: FlashABC.cs プロジェクト: TheCrazyT/FlashABCRead
        public void FindClasses(List <String> classes)
        {
            Stream s = this.stream;

            start = s.Position;
            BinaryReader br = new BinaryReader(s);

            flags = br.ReadUInt16();
            ushort unkn = br.ReadUInt16();
            int    c;
            string name = "";

            while ((char)(c = br.ReadChar()) != '\0')
            {
                name += (char)c;
            }
            Debug.Print("{0}", name);
            minor_version = br.ReadUInt16();
            minor_version = br.ReadUInt16();

            ulong cnt;

            Debug.Print("IS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            intStart = br.BaseStream.Position;
            cnt      = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                skipS32(br.BaseStream);
            }

            Debug.Print("UIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            uintStart = br.BaseStream.Position;
            cnt       = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                skipU32(br.BaseStream);
            }

            Debug.Print("DS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            doubleStart = br.BaseStream.Position;
            cnt         = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                br.ReadDouble();
            }

            Debug.Print("SS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            stringStart = br.BaseStream.Position;
            cnt         = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                //Debug.Print("{0}",readString(br.BaseStream));
                skipString(br.BaseStream);
            }

            Debug.Print("NSS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            namespaceStart = br.BaseStream.Position;
            cnt            = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                switch (br.ReadByte())
                {
                case 8:
                case 5:
                case 22:
                case 23:
                case 24:
                case 25:
                case 26:
                    skipU32(br.BaseStream);
                    break;

                default:
                    Debugger.Break();
                    break;
                }
            }

            Debug.Print("NSSS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            namespacesetStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                ulong cnt2 = getU32(br.BaseStream);
                for (ulong m = 0; m < cnt2; m++)
                {
                    skipU32(br.BaseStream);
                }
            }

            Debug.Print("MNS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            multinameStart = br.BaseStream.Position;
            cnt            = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                short kind = br.ReadByte();
                switch (kind)
                {
                case 7:
                case 13:
                case 9:
                case 14:
                    skipU32(br.BaseStream);    //namespace
                    skipU32(br.BaseStream);    //name
                    break;

                case 15:
                case 16:
                case 27:
                    skipU32(br.BaseStream);
                    break;

                case 17:
                case 18:
                    break;


                case 29:    //experimental,GENERIC
                    skipU32(br.BaseStream);
                    ulong param_count = getU32(br.BaseStream);
                    skipU32(br.BaseStream);
                    if (param_count != 1)
                    {
                        Debugger.Break();
                    }
                    break;

                case 28:    //experimental,Multiname_LA
                    skipU32(br.BaseStream);
                    break;

                default:
                    Debug.Print("MNS Error {0:x} {1:x} kind:{2}\n", br.BaseStream.Position, len + start, kind);
                    return;
                    //break;
                }
            }

            Debug.Print("MIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            methodinfoStart = br.BaseStream.Position;
            cnt             = getU30(br.BaseStream);
            for (ulong n = 0; n < cnt; n++)
            {
                ulong param_count = getU32(br.BaseStream);
                skipU32(br.BaseStream);
                for (ulong m = 0; m < param_count; m++)
                {
                    skipU32(br.BaseStream);
                }
                ulong name_index = getU32(br.BaseStream);
                uint  mis_flags  = br.ReadByte();
                if ((mis_flags & 8) != 0)
                {
                    ulong optional_count = getU32(br.BaseStream);
                    for (ulong m = param_count - optional_count; m < param_count; ++m)
                    {
                        skipU32(br.BaseStream);
                        br.ReadByte();
                    }
                }
                if ((mis_flags & 128) != 0)
                {
                    for (uint m = 0; m < param_count; ++m)
                    {
                        skipU32(br.BaseStream);
                    }
                }
            }

            Debug.Print("MDIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            metadatainfoStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 0; n < cnt; n++)
            {
                skipU32(br.BaseStream);
                ulong cnt2 = getU32(br.BaseStream);
                for (ulong m = 0; m < cnt2; m++)
                {
                    skipU32(br.BaseStream);
                    skipU32(br.BaseStream);
                }
            }

            Debug.Print("IIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            instanceinfoStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            bool[] classfound = new bool[cnt];
            for (ulong n = 0; n < cnt; n++)
            {
                string instanceName = getLabel(getU32(br.BaseStream));
                string superclass   = getLabel(getU32(br.BaseStream));

                if ((br.ReadByte() & 8) != 0)
                {
                    skipU32(br.BaseStream);
                }
                ulong cnt2 = getU30(br.BaseStream);
                for (ulong m = 0; m < cnt2; m++)
                {
                    skipU32(br.BaseStream);
                }

                skipU32(br.BaseStream);

                if (!classes.Contains(instanceName))
                {
                    skipTraits(br);
                }
                else
                {
                    fClass instance = new fClass();
                    instance.name       = instanceName;
                    instance.superclass = superclass;
                    Debug.Print("Instance:{0} found!", instanceName);
                    List <cProp> prop = new List <cProp>();
                    getTraits(br, out prop);
                    instance.properties = prop;
                    fClass.AddClass(instance);
                    //if (fClass.Count == classes.Count) return;
                    classfound[n] = true;
                }
            }


            Debug.Print("CIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            classinfoStart = br.BaseStream.Position;
            int cpos = 0;

            for (ulong n = 0; n < cnt; n++)
            {
                if (!classfound[n])
                {
                    skipU32(br.BaseStream);
                    skipTraits(br);
                }
                else
                {
                    List <cProp> prop = new List <cProp>();
                    skipU32(br.BaseStream);
                    Debug.Print("Additional info for Instance:{0} found!", fClass.GetClassName(cpos));
                    getTraits(br, out prop);
                    fClass instance = new fClass();
                    instance.name       = "static " + fClass.GetClassName(cpos);
                    instance.properties = prop;
                    fClass.AddClass(instance);
                    //fClass.AddStaticPropertiesToClass(cpos, prop);
                    cpos++;
                }
            }

            /*Debug.Print("SIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
             * scriptinfoStart = br.BaseStream.Position;
             * cnt = getU30(br.BaseStream);
             * for (ulong n = 0; n < cnt; n++)
             * {
             *  skipU32(br.BaseStream);
             *  skipTraits(br);
             * }
             *
             * Debug.Print("MBS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
             * methodbodyStart = br.BaseStream.Position;
             *
             * cnt = getU30(br.BaseStream);
             * for (ulong n = 0; n < cnt; n++)
             * {
             *  ulong minfo = getU32(br.BaseStream);
             *  ulong max_stack = getU32(br.BaseStream);
             *  ulong max_regs = getU32(br.BaseStream);
             *  ulong scope_depth = getU32(br.BaseStream);
             *  ulong max_scope = getU32(br.BaseStream);
             *  ulong code_length = getU32(br.BaseStream);
             *
             *  byte[] buf = new byte[code_length];
             *  br.Read(buf, 0, (int)code_length);
             *  parseCode(buf);
             *
             *  ulong ex_count = getU32(br.BaseStream);
             *  for (ulong m = 0; m < ex_count; m++)
             *  {
             *      skipU32(br.BaseStream);
             *      skipU32(br.BaseStream);
             *      skipU32(br.BaseStream);
             *      skipU32(br.BaseStream);
             *      skipU32(br.BaseStream);
             *  }
             *
             *  skipTraits(br);
             * }*/
            Debug.Print("End parse {0:x} {1:x}\n", br.BaseStream.Position, len + start);
        }
コード例 #5
0
ファイル: fClass.cs プロジェクト: TheCrazyT/FlashABCRead
 public static void AddClass(fClass c)
 {
     foreach (cProp p in c.properties)
         propertyTypes.Add(c.name + "." + p.name, p.type);
     FoundClasses.Add(c);
 }
コード例 #6
0
ファイル: fClass.cs プロジェクト: TheCrazyT/FlashABCRead
        private fClass getObject(string property, string type, uint index,string type2)
        {
            string[] steps = property.Split('.');
            long pos = classStream.Position;
            if (steps.Length == 1)
            {
                BinaryReader br = new BinaryReader(classStream);
                classStream.Seek(Offset(type + "." + property), SeekOrigin.Current);
                uint off = br.ReadUInt32();
                classStream.Seek(off & 0xFFFFFFF8, SeekOrigin.Begin);
                classStream.Seek(0x10, SeekOrigin.Current);

                uint list = (br.ReadUInt32() & 0xFFFFFFF8);
                short cnt = br.ReadInt16();
                //07.10.2011 ... + 0xC
                classStream.Seek(list+0xC, SeekOrigin.Begin);
                uint gotopos = 0;
                for (int i = 0; i < cnt; i++)
                {
                    uint idx = br.ReadUInt32();
                    if(idx==0){cnt++;continue;}
                    uint p   = br.ReadUInt32();
                    if ((idx - 6) / 8 == index)
                    {
                        gotopos = p & 0xFFFFFFF8;
                        break;
                    }
                }
                fClass c = null;
                if (gotopos != 0)
                {
                    classStream.Seek(gotopos, SeekOrigin.Begin);
                    c = new fClass(classStream, type2);
                }

                classStream.Seek(pos, SeekOrigin.Begin);
                return c;
            }
            else
            {
                BinaryReader br = new BinaryReader(classStream);
                classStream.Seek(Offset(type + "." + steps[0]), SeekOrigin.Current);
                int i = br.ReadInt32();
                classStream.Seek(i, SeekOrigin.Begin);
                property = "";
                int x;
                for (x = 1; x < steps.Length - 1; x++)
                    property += steps[x] + ".";
                property += steps[x];

                string t = this.getType(steps[0]);
                string main_name = this.name;
                this.name = t;
                fClass c = null;
                try
                {
                    c = getObject(property, t,index,type2);
                }
                finally
                {
                    this.name = main_name;
                    classStream.Seek(pos, SeekOrigin.Begin);
                }
                return c;
            }
        }
コード例 #7
0
ファイル: fClass.cs プロジェクト: TheCrazyT/FlashABCRead
        private fClass getC(string property, string type)
        {
            string[] steps = property.Split('.');
            long pos = classStream.Position;
            if (steps.Length == 1)
            {
                BinaryReader br = new BinaryReader(classStream);
                classStream.Seek(Offset(type + "." + property), SeekOrigin.Current);
                classStream.Seek(br.ReadInt32(),SeekOrigin.Begin);
                fClass c = new fClass(classStream, this.getType(property));
                classStream.Seek(pos, SeekOrigin.Begin);
                return c;
            }
            else
            {
                BinaryReader br = new BinaryReader(classStream);
                classStream.Seek(Offset(type + "." + steps[0]), SeekOrigin.Current);
                int i = br.ReadInt32();
                classStream.Seek(i, SeekOrigin.Begin);
                property = "";
                int x;
                for (x = 1; x < steps.Length - 1; x++)
                    property += steps[x] + ".";
                property += steps[x];

                string t = this.getType(steps[0]);
                string main_name = this.name;
                this.name = t;
                fClass c = null;
                try
                {
                    c = getC(property, t);
                }
                finally
                {
                    this.name = main_name;
                    classStream.Seek(pos, SeekOrigin.Begin);
                }
                return c;
            }
        }
コード例 #8
0
ファイル: fClass.cs プロジェクト: TheCrazyT/FlashABCRead
        private fClass getObject(string property, string type, uint index, string type2)
        {
            string[] steps = property.Split('.');
            long     pos   = classStream.Position;

            if (steps.Length == 1)
            {
                BinaryReader br = new BinaryReader(classStream);
                classStream.Seek(Offset(type + "." + property), SeekOrigin.Current);
                uint off = br.ReadUInt32();
                classStream.Seek(off & 0xFFFFFFF8, SeekOrigin.Begin);
                classStream.Seek(0x10, SeekOrigin.Current);

                uint  list = (br.ReadUInt32() & 0xFFFFFFF8);
                short cnt  = br.ReadInt16();
                //07.10.2011 ... + 0xC
                classStream.Seek(list + 0xC, SeekOrigin.Begin);
                uint gotopos = 0;
                for (int i = 0; i < cnt; i++)
                {
                    uint idx = br.ReadUInt32();
                    if (idx == 0)
                    {
                        cnt++; continue;
                    }
                    uint p = br.ReadUInt32();
                    if ((idx - 6) / 8 == index)
                    {
                        gotopos = p & 0xFFFFFFF8;
                        break;
                    }
                }
                fClass c = null;
                if (gotopos != 0)
                {
                    classStream.Seek(gotopos, SeekOrigin.Begin);
                    c = new fClass(classStream, type2);
                }

                classStream.Seek(pos, SeekOrigin.Begin);
                return(c);
            }
            else
            {
                BinaryReader br = new BinaryReader(classStream);
                classStream.Seek(Offset(type + "." + steps[0]), SeekOrigin.Current);
                int i = br.ReadInt32();
                classStream.Seek(i, SeekOrigin.Begin);
                property = "";
                int x;
                for (x = 1; x < steps.Length - 1; x++)
                {
                    property += steps[x] + ".";
                }
                property += steps[x];

                string t         = this.getType(steps[0]);
                string main_name = this.name;
                this.name = t;
                fClass c = null;
                try
                {
                    c = getObject(property, t, index, type2);
                }
                finally
                {
                    this.name = main_name;
                    classStream.Seek(pos, SeekOrigin.Begin);
                }
                return(c);
            }
        }
コード例 #9
0
ファイル: Global.cs プロジェクト: TheCrazyT/DSO_Economic
        /*private static void findItemsClass(IntPtr handle, RemoteMemoryStream rms, uint start, uint size)
        {
            rms.InitCache(start, start + size);
            Application.DoEvents();
            try
            {
                uint i = 0;
                uint v;
                uint w;
                BinaryReader binr = new BinaryReader(rms);
                for (i = 0; i < size - 0x5C; i += 4)
                {
                    rms.Seek(start + i, SeekOrigin.Begin);
                    //v = mem[(i) / 4];
                    v = binr.ReadUInt32();
                    if (v != SwfClassToken)
                        continue;

                    rms.Seek(start + i, SeekOrigin.Begin);
                    fClass economic = new fClass(rms, "mResources_vector");

                    fClass items = economic.gC("mResources_vector");
                    itemEntries = new List<CItemEntry>();
                    CItemEntry.reset();
                    foreach (fClass it in items.getClassList("dResourceDefaultDefinition"))
                    {
                        string n = it.gSTR("resourceName_string");
                        Debug.Print("{0} {1}", it.gINT("amount"), n);
                        if ((n != "Population") && (n != "HardCurrency"))
                            itemEntries.Add(new CItemEntry(it));
                    }
                }
            }
            catch (EndOfStreamException e)
            {
                return;
            }
        }*/
        private static void findMainClass(IntPtr handle, RemoteMemoryStream rms, Int64 start, Int64 size)
        {
            rms.InitCache(start, start + size);
            Application.DoEvents();
            try
            {
                uint i = 0;
                uint v;
                uint w;
                uint swftoken;
                BinaryReader binr = new BinaryReader(rms);
                for (i = 0; i < size - 0x5C; i += 4)
                {
                    rms.Seek(start + i, SeekOrigin.Begin);
                    //v = mem[(i) / 4];
                    v = binr.ReadUInt32();
                    if ((v < (uint)npswf.BaseAddress) || (v > (uint)((uint)npswf.BaseAddress + npswf.ModuleMemorySize)))
                        continue;
                    swftoken = v;

                    rms.Seek(start+i, SeekOrigin.Begin);
                    fClass player = new fClass(rms, "cPlayerData");

                    /*if (start + i > 0xBEF0000)
                    {
                        v = binr.ReadUInt32();
                        v = binr.ReadUInt32();
                        if ((v & 0xFFFF) == 4)
                        {
                            string s = player.getClassName();
                            if (s != "")
                                Debug.Print("{0:x} Classname {1}",start+i, s);
                        }
                    }*/

                    if (player.gUINT("mGeologistsAmount") > 25) continue;
                    if (player.gUINT("mExplorersAmount") > 25) continue;
                    if (player.gUINT("mPlayerId") == 0) continue;
                    if (player.gUINT("mPlayerLevel") > 50) continue;
                    if (player.gUINT("mPlayerLevel") == 0) continue;
                    //Debug.Print("P level {0}", player.gUINT("mPlayerLevel"));
                    if (player.gUINT("mGeneralsAmount") > 25) continue;
                    v = player.gUINT("mCurrentBuildingsCountAll");
                    w = player.gUINT("mCurrentMaximumBuildingsCountAll");
                    if (w < v) continue;
                    if (v == 0) continue;
                    if (v > 1000) continue;
                    if (w > 1000) continue;
                    if (w == 0) continue;
                    Debug.Print("Main class at?: {0:x}", start + i);
                    Debug.Print("Buildings {0}/{1}", w, v);

                    //if (w == 135) Debugger.Break();
                    fClass resources = player.gO("mGeneralInterface.mCurrentPlayerZone.map_PlayerID_Resources", player.gUINT("mPlayerId"), "cResources");
                    if (resources == null) continue;
                    fClass items = resources.gC("mResources_vector");
                    Debug.Print("mResources_vector: {0:x}", resources.gUINT("mResources_vector"));
                    itemEntries = new List<CItemEntry>();
                    CItemEntry.reset();
                    foreach (fClass it in items.getClassList("dResource"))
                    {
                        string n=it.gSTR("name_string");
                        Debug.Print("{0} {1}", it.gINT("amount"), n);
                        if((n!="Population")&&(n!="HardCurrency"))
                            itemEntries.Add(new CItemEntry(it));
                    }

                    MainClass = start + i;

                    fClass fdeposits = player.gC("mGeneralInterface.mCurrentPlayerZone.mStreetDataMap.mDeposits_vector");
                    Debug.Print("Deposits at?: {0:x}", fdeposits.getOffset());

                    foreach (fClass r in fdeposits.getClassList("cDeposit"))
                    {
                        CResourceEntry RE = new CResourceEntry(r);
                        Debug.Print("{0}", RE.Name);
                        if (!(((RE.Name == "Wood") || (RE.Name == "RealWood")) && !Params.trees))
                            resourceEntries.Add(RE);
                    }

                    DbConnection3.Open();
                    fClass fbuildings = player.gC("mGeneralInterface.mCurrentPlayerZone.mStreetDataMap.mBuildings_vector");
                    Buildings = new Dictionary<String, uint>();
                    buildingEntries = new List<CBuildingEntry>();
                    Debug.Print("Buildings at?: {0:x}", fbuildings.getOffset());
                    foreach (fClass b in fbuildings.getClassList("cBuilding"))
                    {
                        CBuildingEntry BE = new CBuildingEntry(b);
                        Debug.Print("{0} {1} {2}", BE.Name, BE.X, BE.Y);
                        Debug.Print("{0}", BE.wayTime1);
                        Debug.Print("{0}", BE.wayTime2);
                        if (!Buildings.ContainsKey(BE.Name))
                            Buildings.Add(BE.Name, 1);
                        else
                            Buildings[BE.Name]++;
                        buildingEntries.Add(BE);
                    }
                    DbConnection3.Close();

                    MainClass = start + i;
                    SwfClassToken = swftoken;
                    Debug.Print("Main class at: {0:x}", start + i);

                    Debug.Print("{0:x}", player.gC("mGeneralInterface.mCurrentPlayerZone").getOffset());
                    rms.RemoveCache();
                }
            }
            catch (EndOfStreamException e)
            {
                return;
            }
            return;
        }
コード例 #10
0
ファイル: FlashABC.cs プロジェクト: TheCrazyT/FlashABCRead
        public void FindClasses(List<String> classes)
        {
            Stream s=this.stream;
            start=s.Position;
            BinaryReader br = new BinaryReader(s);
            flags = br.ReadUInt16();
            ushort unkn = br.ReadUInt16();
            int c;
            string name="";

            while((char)(c=br.ReadChar())!='\0')
                name += (char)c;
            Debug.Print("{0}", name);
            minor_version = br.ReadUInt16();
            minor_version = br.ReadUInt16();

            ulong cnt;
            Debug.Print("IS {0:x} {1:x}\n", br.BaseStream.Position, len+start);
            intStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++) skipS32(br.BaseStream);

            Debug.Print("UIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            uintStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++) skipU32(br.BaseStream);

            Debug.Print("DS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            doubleStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++) br.ReadDouble();

            Debug.Print("SS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            stringStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                //Debug.Print("{0}",readString(br.BaseStream));
                skipString(br.BaseStream);
            }

            Debug.Print("NSS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            namespaceStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                switch (br.ReadByte())
                {
                    case 8:
                    case 5:
                    case 22:
                    case 23:
                    case 24:
                    case 25:
                    case 26:
                        skipU32(br.BaseStream);
                        break;
                    default:
                        Debugger.Break();
                        break;
                }
            }

            Debug.Print("NSSS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            namespacesetStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                ulong cnt2 = getU32(br.BaseStream);
                for (ulong m = 0; m < cnt2; m++)
                    skipU32(br.BaseStream);
            }

            Debug.Print("MNS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            multinameStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 1; n < cnt; n++)
            {
                short kind = br.ReadByte();
                switch (kind)
                {
                    case 7:
                    case 13:
                    case 9:
                    case 14:
                        skipU32(br.BaseStream);//namespace
                        skipU32(br.BaseStream);//name
                        break;
                    case 15:
                    case 16:
                    case 27:
                        skipU32(br.BaseStream);
                        break;
                    case 17:
                    case 18:
                        break;

                    case 29://experimental,GENERIC
                        skipU32(br.BaseStream);
                        ulong param_count = getU32(br.BaseStream);
                        skipU32(br.BaseStream);
                        if (param_count != 1) Debugger.Break();
                        break;
                    case 28://experimental,Multiname_LA
                        skipU32(br.BaseStream);
                        break;

                    default:
                        Debug.Print("MNS Error {0:x} {1:x} kind:{2}\n", br.BaseStream.Position, len + start,kind);
                        return;
                        //break;
                }
            }

            Debug.Print("MIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            methodinfoStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 0; n < cnt; n++)
            {
                ulong param_count = getU32(br.BaseStream);
                skipU32(br.BaseStream);
                for (ulong m = 0; m < param_count; m++)
                    skipU32(br.BaseStream);
                ulong name_index = getU32(br.BaseStream);
                uint mis_flags=br.ReadByte();
                if ((mis_flags & 8) != 0)
                {
                    ulong optional_count = getU32(br.BaseStream);
                    for (ulong m = param_count - optional_count; m < param_count; ++m)
                    {
                        skipU32(br.BaseStream);
                        br.ReadByte();
                    }
                }
                if ((mis_flags & 128) != 0)
                    for(uint m = 0; m< param_count; ++m)
                        skipU32(br.BaseStream);
            }

            Debug.Print("MDIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            metadatainfoStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 0; n < cnt; n++)
            {
                skipU32(br.BaseStream);
                ulong cnt2 = getU32(br.BaseStream);
                for (ulong m = 0; m < cnt2; m++)
                {
                    skipU32(br.BaseStream);
                    skipU32(br.BaseStream);
                }
            }

            Debug.Print("IIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            instanceinfoStart=br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            bool[] classfound=new bool[cnt];
            for (ulong n = 0; n < cnt; n++)
            {
                string instanceName = getLabel(getU32(br.BaseStream));
                string superclass = getLabel(getU32(br.BaseStream));

                if((br.ReadByte() & 8)!=0)
                    skipU32(br.BaseStream);
                ulong cnt2 = getU30(br.BaseStream);
                for (ulong m = 0; m < cnt2; m++)
                    skipU32(br.BaseStream);

                skipU32(br.BaseStream);

                if(!classes.Contains(instanceName))
                    skipTraits(br);
                else
                {
                    fClass instance=new fClass();
                    instance.name=instanceName;
                    instance.superclass = superclass;
                    Debug.Print("Instance:{0} found!", instanceName);
                    List<cProp> prop = new List<cProp>();
                    getTraits(br,out prop);
                    instance.properties = prop;
                    fClass.AddClass(instance);
                    //if (fClass.Count == classes.Count) return;
                    classfound[n] = true;
                }
            }

            Debug.Print("CIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            classinfoStart = br.BaseStream.Position;
            int cpos = 0;
            for (ulong n = 0; n < cnt; n++)
            {
                if (!classfound[n])
                {
                    skipU32(br.BaseStream);
                    skipTraits(br);
                }
                else
                {
                    List<cProp> prop = new List<cProp>();
                    skipU32(br.BaseStream);
                    Debug.Print("Additional info for Instance:{0} found!", fClass.GetClassName(cpos));
                    getTraits(br, out prop);
                    fClass instance = new fClass();
                    instance.name = "static " + fClass.GetClassName(cpos);
                    instance.properties = prop;
                    fClass.AddClass(instance);
                    //fClass.AddStaticPropertiesToClass(cpos, prop);
                    cpos++;
                }
            }

            /*Debug.Print("SIS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            scriptinfoStart = br.BaseStream.Position;
            cnt = getU30(br.BaseStream);
            for (ulong n = 0; n < cnt; n++)
            {
                skipU32(br.BaseStream);
                skipTraits(br);
            }

            Debug.Print("MBS {0:x} {1:x}\n", br.BaseStream.Position, len + start);
            methodbodyStart = br.BaseStream.Position;

            cnt = getU30(br.BaseStream);
            for (ulong n = 0; n < cnt; n++)
            {
                ulong minfo = getU32(br.BaseStream);
                ulong max_stack = getU32(br.BaseStream);
                ulong max_regs = getU32(br.BaseStream);
                ulong scope_depth = getU32(br.BaseStream);
                ulong max_scope = getU32(br.BaseStream);
                ulong code_length = getU32(br.BaseStream);

                byte[] buf = new byte[code_length];
                br.Read(buf, 0, (int)code_length);
                parseCode(buf);

                ulong ex_count = getU32(br.BaseStream);
                for (ulong m = 0; m < ex_count; m++)
                {
                    skipU32(br.BaseStream);
                    skipU32(br.BaseStream);
                    skipU32(br.BaseStream);
                    skipU32(br.BaseStream);
                    skipU32(br.BaseStream);
                }

                skipTraits(br);
            }*/
            Debug.Print("End parse {0:x} {1:x}\n", br.BaseStream.Position, len + start);
        }
コード例 #11
0
 public CBuildingEntry(fClass c)
 {
     this.cls = c;
     Name = cls.gSTR("mBuildingName_string");
 }