Esempio n. 1
0
        void LoadMetaDataStreams()
        {
            int add = 0;

            parent._streams = new MetaDataStream[metadataHeader2.NumberOfStreams];
            for (int i = 0; i < metadataHeader2.NumberOfStreams; i++)
            {
                long offset = metadataStreamOffset + add + (i * 4);

                Structures.METADATA_STREAM_HEADER streamHeader = ntHeader._assembly._peImage.ReadStructure <Structures.METADATA_STREAM_HEADER>(offset);

                long   stringOffset = offset + 8;
                string name         = ntHeader._assembly._peImage.ReadASCIIString(stringOffset).Replace("\0", "");

                if (name.Length >= 8)
                {
                    add += 16;
                }
                else if (name.Length >= 4)
                {
                    add += 12;
                }
                else
                {
                    add += 8;
                }

                parent._streams[i] = GetHeap(ntHeader._assembly._netHeader, (int)offset, streamHeader, name);
            }

            foreach (MetaDataStream stream in parent._streams)
            {
                stream.Initialize();
            }
        }
Esempio n. 2
0
        internal MetaDataStream(NETHeader netheader, int headeroffset, Structures.METADATA_STREAM_HEADER rawHeader, string name)
        {
            this.headeroffset = headeroffset;
            this.netheader    = netheader;
            this.streamHeader = rawHeader;
            this.name         = name;
            this.indexsize    = 2;

            byte[] contents = netheader.assembly.peImage.ReadBytes(StreamOffset, (int)StreamSize);
            mainStream = new MemoryStream();
            binReader  = new BinaryReader(mainStream);
            binWriter  = new BinaryWriter(mainStream);
            mainStream.Write(contents, 0, contents.Length);
            mainStream.Seek(0, SeekOrigin.Begin);
        }
Esempio n. 3
0
        private MetaDataStream GetHeap(NETHeader netheader, int headeroffset, Structures.METADATA_STREAM_HEADER rawHeader, string name)
        {
            switch (name)
            {
            case "#~":
            case "#-":
                return(new TablesHeap(netheader, headeroffset, rawHeader, name));

            case "#Strings":
                return(new StringsHeap(netheader, headeroffset, rawHeader, name));

            case "#US":
                return(new UserStringsHeap(netheader, headeroffset, rawHeader, name));

            case "#GUID":
                return(new GuidHeap(netheader, headeroffset, rawHeader, name));

            case "#Blob":
                return(new BlobHeap(netheader, headeroffset, rawHeader, name));

            default:
                return(new MetaDataStream(netheader, headeroffset, rawHeader, name));
            }
        }
Esempio n. 4
0
 internal UserStringsHeap(NETHeader netheader, int headeroffset, Structures.METADATA_STREAM_HEADER rawHeader, string name)
     : base(netheader, headeroffset, rawHeader, name)
 {
 }