Пример #1
0
 public XbfProperty(XbfReader xbf, BinaryReader reader)
 {
     Flags = (XbfPropertyFlags)reader.ReadInt32();
     int typeID = reader.ReadInt32();
     Type = xbf.TypeTable[typeID];
     int nameID = reader.ReadInt32();
     Name = xbf.StringTable[nameID];
 }
Пример #2
0
 public XbfType(XbfReader xbf, BinaryReader reader)
 {
     Flags = (XbfTypeFlags)reader.ReadInt32();
     int namespaceID = reader.ReadInt32();
     Namespace = xbf.TypeNamespaceTable[namespaceID];
     int nameID = reader.ReadInt32();
     Name = xbf.StringTable[nameID];
 }
Пример #3
0
        public XbfPreviewViewModel(byte[] data)
        {
            using (MemoryStream memoryStream = new MemoryStream(data))
            {
                XbfReader xbfReader = new XbfReader(memoryStream);

                if (xbfReader.Header.MajorFileVersion != 2)
                {
                    throw new Exception("Only XBF2 files can be decompiled.");
                }

                Xaml = xbfReader.RootObject.ToString();
            }
        }
Пример #4
0
        static void Main(string[] args)
        {
            var reader = new XbfReader();

            reader.ReadModel(@"D:\_CODE\C#\LSRutil.NET\Examples\ReadRF\bin\Debug\netcoreapp3.1\extract-old\worlds\city\ctrack\ctchican\ctchican.xbf");
        }
Пример #5
0
        private void ProcessFile(string path)
        {
            LogBoldLine();
            LogMessage("File: " + path);

            try
            {
                var xbf = new XbfReader(path);

                // Header info
                LogMessage("File version: {0}.{1}", xbf.Header.MajorFileVersion, xbf.Header.MinorFileVersion);
                LogMessage("Metadata Size: {0} (0x{0:X})", xbf.Header.MetadataSize);
                LogMessage("Node Size: {0} (0x{0:X})", xbf.Header.NodeSize);
                // The offset values seem to be off by 12 bytes compared to the actual positions of these elements in the XBF files.
                // Displaying these as adjusted values to make external analysis easier.
                LogMessage("Adjusted String Table Offset: {0} (0x{0:X})", xbf.Header.StringTableOffset + 12);
                LogMessage("Adjusted Assembly Table Offset: {0} (0x{0:X})", xbf.Header.AssemblyTableOffset + 12);
                LogMessage("Adjusted Type Namespace Table Offset: {0} (0x{0:X})", xbf.Header.TypeNamespaceTableOffset + 12);
                LogMessage("Adjusted Type Table Offset: {0} (0x{0:X})", xbf.Header.TypeTableOffset + 12);
                LogMessage("Adjusted Property Table Offset: {0} (0x{0:X})", xbf.Header.PropertyTableOffset + 12);
                LogMessage("Adjusted XML Namespace Table Offset: {0} (0x{0:X})", xbf.Header.XmlNamespaceTableOffset + 12);
                LogMessage();

                // String table
                LogLine();
                LogMessage("String table:");
                for (int i = 0; i < xbf.StringTable.Length; i++)
                    LogHexAddressMessage(i, xbf.StringTable[i]);
                LogMessage();

                // Assembly table
                LogLine();
                LogMessage("Assembly table:");
                for (int i = 0; i < xbf.AssemblyTable.Length; i++)
                {
                    var assembly = xbf.AssemblyTable[i];
                    LogHexAddressMessage(i, "{0} (Kind: {1})", assembly.Name, assembly.Kind);
                }
                LogMessage();

                // Type namespace table
                LogLine();
                LogMessage("Type namespace table:");
                for (int i = 0; i < xbf.TypeNamespaceTable.Length; i++)
                {
                    var typeNamespace = xbf.TypeNamespaceTable[i];
                    LogHexAddressMessage(i, "{0} (Assembly: {1})", typeNamespace.Name, typeNamespace.Assembly.Name);
                }
                LogMessage();

                // Type table
                LogLine();
                LogMessage("Type table:");
                for (int i = 0; i < xbf.TypeTable.Length; i++)
                {
                    var type = xbf.TypeTable[i];
                    LogHexAddressMessage(i, "{0} (Namespace: {1}, Flags: {2})", type.Name, type.Namespace.Name, type.Flags);
                }
                LogMessage();

                // Property table
                LogLine();
                LogMessage("Property table:");
                for (int i = 0; i < xbf.PropertyTable.Length; i++)
                {
                    var property = xbf.PropertyTable[i];
                    LogHexAddressMessage(i, "{0} (Type: {1}, Flags: {2})", property.Name, property.Type.Name, property.Flags);
                }
                LogMessage();

                // XML namespace table
                LogLine();
                LogMessage("XML namespace table:");
                for (int i = 0; i < xbf.XmlNamespaceTable.Length; i++)
                    LogHexAddressMessage(i, xbf.XmlNamespaceTable[i]);
                LogMessage();

                // Nodes
                LogLine();
                if (xbf.Header.MajorFileVersion < 2)
                {
                    LogMessage("Parsing XBF v1 nodes is not currently supported.");
                }
                else
                {
                    LogMessage("XAML objects:");
                    if (!string.IsNullOrEmpty(xbf.NodeParserError))
                    {
                        LogMessage(xbf.NodeParserError);
                        LogMessage();
                        LogMessage("Partial node results:");
                    }
                    LogMessage(xbf.NodeResultString);
                }
            }
            catch (Exception ex)
            {
                LogMessage("Error: " + ex.ToString());
            }
        }
Пример #6
0
        private void ProcessFile(string path)
        {
            LogBoldLine();
            LogMessage("File: " + path);

            try
            {
                var xbf = new XbfReader(path);

                // Header info
                LogMessage("File version: {0}.{1}", xbf.Header.MajorFileVersion, xbf.Header.MinorFileVersion);
                LogMessage("Metadata Size: {0} (0x{0:X})", xbf.Header.MetadataSize);
                LogMessage("Node Size: {0} (0x{0:X})", xbf.Header.NodeSize);
                // The offset values seem to be off by 12 bytes compared to the actual positions of these elements in the XBF files.
                // Displaying these as adjusted values to make external analysis easier.
                LogMessage("Adjusted String Table Offset: {0} (0x{0:X})", xbf.Header.StringTableOffset + 12);
                LogMessage("Adjusted Assembly Table Offset: {0} (0x{0:X})", xbf.Header.AssemblyTableOffset + 12);
                LogMessage("Adjusted Type Namespace Table Offset: {0} (0x{0:X})", xbf.Header.TypeNamespaceTableOffset + 12);
                LogMessage("Adjusted Type Table Offset: {0} (0x{0:X})", xbf.Header.TypeTableOffset + 12);
                LogMessage("Adjusted Property Table Offset: {0} (0x{0:X})", xbf.Header.PropertyTableOffset + 12);
                LogMessage("Adjusted XML Namespace Table Offset: {0} (0x{0:X})", xbf.Header.XmlNamespaceTableOffset + 12);
                LogMessage();

                // String table
                LogLine();
                LogMessage("String table:");
                for (int i = 0; i < xbf.StringTable.Length; i++)
                {
                    LogHexAddressMessage(i, xbf.StringTable[i]);
                }
                LogMessage();

                // Assembly table
                LogLine();
                LogMessage("Assembly table:");
                for (int i = 0; i < xbf.AssemblyTable.Length; i++)
                {
                    var assembly = xbf.AssemblyTable[i];
                    LogHexAddressMessage(i, "{0} (Kind: {1})", assembly.Name, assembly.Kind);
                }
                LogMessage();

                // Type namespace table
                LogLine();
                LogMessage("Type namespace table:");
                for (int i = 0; i < xbf.TypeNamespaceTable.Length; i++)
                {
                    var typeNamespace = xbf.TypeNamespaceTable[i];
                    LogHexAddressMessage(i, "{0} (Assembly: {1})", typeNamespace.Name, typeNamespace.Assembly.Name);
                }
                LogMessage();

                // Type table
                LogLine();
                LogMessage("Type table:");
                for (int i = 0; i < xbf.TypeTable.Length; i++)
                {
                    var type = xbf.TypeTable[i];
                    LogHexAddressMessage(i, "{0} (Namespace: {1}, Flags: {2})", type.Name, type.Namespace.Name, type.Flags);
                }
                LogMessage();

                // Property table
                LogLine();
                LogMessage("Property table:");
                for (int i = 0; i < xbf.PropertyTable.Length; i++)
                {
                    var property = xbf.PropertyTable[i];
                    LogHexAddressMessage(i, "{0} (Type: {1}, Flags: {2})", property.Name, property.Type.Name, property.Flags);
                }
                LogMessage();

                // XML namespace table
                LogLine();
                LogMessage("XML namespace table:");
                for (int i = 0; i < xbf.XmlNamespaceTable.Length; i++)
                {
                    LogHexAddressMessage(i, xbf.XmlNamespaceTable[i]);
                }
                LogMessage();

                if (xbf.Header.MajorFileVersion < 2)
                {
                    LogMessage("Parsing XBF v1 nodes is not currently supported.");
                }
                else
                {
                    // Node section table
                    LogLine();
                    LogMessage("Node section table:");
                    for (int i = 0; i < xbf.NodeSectionTable.Length; i++)
                    {
                        LogHexAddressMessage(i, "Node offset: {0} (0x{0:X}) Positional offset: {1} (0x{1:X})", xbf.NodeSectionTable[i].NodeOffset, xbf.NodeSectionTable[i].PositionalOffset);
                    }
                    LogMessage();

                    // Nodes
                    LogLine();
                    string xaml = xbf.RootObject.ToString();
                    LogMessage("XAML objects:");
                    LogMessage(xaml);
                }
            }
            catch (Exception ex)
            {
                LogMessage("Error: " + ex.ToString());
            }

            ShowLog();
        }
Пример #7
0
 public XbfAssembly(XbfReader xbf, BinaryReader reader)
 {
     Kind = (XbfAssemblyKind)reader.ReadInt32();
     int stringID = reader.ReadInt32();
     Name = xbf.StringTable[stringID];
 }