Ejemplo n.º 1
0
        public NSO(Stream stream, float version, long maxMetadataUsages) : base(stream, version, maxMetadataUsages)
        {
            header             = new NSOHeader();
            header.Magic       = ReadUInt32();
            header.Version     = ReadUInt32();
            header.Reserved    = ReadUInt32();
            header.Flags       = ReadUInt32();
            isTextCompressed   = (header.Flags & 1) != 0;
            isRoDataCompressed = (header.Flags & 2) != 0;
            isDataCompressed   = (header.Flags & 4) != 0;
            header.TextSegment = new NSOSegmentHeader
            {
                FileOffset       = ReadUInt32(),
                MemoryOffset     = ReadUInt32(),
                DecompressedSize = ReadUInt32()
            };
            segments.Add(header.TextSegment);
            header.ModuleOffset  = ReadUInt32();
            header.RoDataSegment = new NSOSegmentHeader
            {
                FileOffset       = ReadUInt32(),
                MemoryOffset     = ReadUInt32(),
                DecompressedSize = ReadUInt32()
            };
            segments.Add(header.RoDataSegment);
            header.ModuleFileSize = ReadUInt32();
            header.DataSegment    = new NSOSegmentHeader
            {
                FileOffset       = ReadUInt32(),
                MemoryOffset     = ReadUInt32(),
                DecompressedSize = ReadUInt32()
            };
            segments.Add(header.DataSegment);
            header.BssSize              = ReadUInt32();
            header.DigestBuildID        = ReadBytes(0x20);
            header.TextCompressedSize   = ReadUInt32();
            header.RoDataCompressedSize = ReadUInt32();
            header.DataCompressedSize   = ReadUInt32();
            header.Padding              = ReadBytes(0x1C);
            header.APIInfo              = new NSORelativeExtent
            {
                RegionRoDataOffset = ReadUInt32(),
                RegionSize         = ReadUInt32()
            };
            header.DynStr = new NSORelativeExtent
            {
                RegionRoDataOffset = ReadUInt32(),
                RegionSize         = ReadUInt32()
            };
            header.DynSym = new NSORelativeExtent
            {
                RegionRoDataOffset = ReadUInt32(),
                RegionSize         = ReadUInt32()
            };
            header.TextHash   = ReadBytes(0x20);
            header.RoDataHash = ReadBytes(0x20);
            header.DataHash   = ReadBytes(0x20);

            if (!isCompressed)
            {
                Position = header.TextSegment.FileOffset + 4;
                var modOffset = ReadUInt32();
                Position = header.TextSegment.FileOffset + modOffset + 8;
                var bssStart = ReadUInt32();
                var bssEnd   = ReadUInt32();
                header.BssSegment = new NSOSegmentHeader
                {
                    FileOffset       = bssStart,
                    MemoryOffset     = bssStart,
                    DecompressedSize = bssEnd - bssStart
                };
            }
        }
Ejemplo n.º 2
0
        public NSO(Stream stream) : base(stream)
        {
            header             = new NSOHeader();
            header.Magic       = ReadUInt32();
            header.Version     = ReadUInt32();
            header.Reserved    = ReadUInt32();
            header.Flags       = ReadUInt32();
            isTextCompressed   = (header.Flags & 1) != 0;
            isRoDataCompressed = (header.Flags & 2) != 0;
            isDataCompressed   = (header.Flags & 4) != 0;
            header.TextSegment = new NSOSegmentHeader
            {
                FileOffset       = ReadUInt32(),
                MemoryOffset     = ReadUInt32(),
                DecompressedSize = ReadUInt32()
            };
            segments.Add(header.TextSegment);
            header.ModuleOffset  = ReadUInt32();
            header.RoDataSegment = new NSOSegmentHeader
            {
                FileOffset       = ReadUInt32(),
                MemoryOffset     = ReadUInt32(),
                DecompressedSize = ReadUInt32()
            };
            segments.Add(header.RoDataSegment);
            header.ModuleFileSize = ReadUInt32();
            header.DataSegment    = new NSOSegmentHeader
            {
                FileOffset       = ReadUInt32(),
                MemoryOffset     = ReadUInt32(),
                DecompressedSize = ReadUInt32()
            };
            segments.Add(header.DataSegment);
            header.BssSize              = ReadUInt32();
            header.DigestBuildID        = ReadBytes(0x20);
            header.TextCompressedSize   = ReadUInt32();
            header.RoDataCompressedSize = ReadUInt32();
            header.DataCompressedSize   = ReadUInt32();
            header.Padding              = ReadBytes(0x1C);
            header.APIInfo              = new NSORelativeExtent
            {
                RegionRoDataOffset = ReadUInt32(),
                RegionSize         = ReadUInt32()
            };
            header.DynStr = new NSORelativeExtent
            {
                RegionRoDataOffset = ReadUInt32(),
                RegionSize         = ReadUInt32()
            };
            header.DynSym = new NSORelativeExtent
            {
                RegionRoDataOffset = ReadUInt32(),
                RegionSize         = ReadUInt32()
            };
            header.TextHash   = ReadBytes(0x20);
            header.RoDataHash = ReadBytes(0x20);
            header.DataHash   = ReadBytes(0x20);

            if (!isCompressed)
            {
                Position = header.TextSegment.FileOffset + 4;
                var modOffset = ReadUInt32();
                Position = header.TextSegment.FileOffset + modOffset + 4;
                var dynamicOffset = ReadUInt32() + modOffset;
                var bssStart      = ReadUInt32();
                var bssEnd        = ReadUInt32();
                header.BssSegment = new NSOSegmentHeader
                {
                    FileOffset       = bssStart,
                    MemoryOffset     = bssStart,
                    DecompressedSize = bssEnd - bssStart
                };
                var maxSize = (header.DataSegment.MemoryOffset + header.DataSegment.DecompressedSize - dynamicOffset) / 16;
                Position = MapVATR(dynamicOffset);
                for (int i = 0; i < maxSize; i++)
                {
                    var dynamic = ReadClass <Elf64_Dyn>();
                    if (dynamic.d_tag == 0)
                    {
                        break;
                    }
                    else
                    {
                        dynamicSection.Add(dynamic);
                    }
                }
                ReadSymbol();
                RelocationProcessing();
            }
        }