Esempio n. 1
0
 private byte[] LoadStream(StreamParser parser, long metaRootPosition, string key, Dictionary<string, CLRStreamHeader> shByName)
 {
     CLRStreamHeader header = null;
     if (!shByName.TryGetValue(key, out header))
         throw new ParseFailedException("Missing metadata stream " + shByName);
     parser.Seek(metaRootPosition + header.Offset);
     byte[] bytes = new byte[header.Size];
     parser.Read(bytes, 0, header.Size);
     return bytes;
 }
Esempio n. 2
0
        public CLRAssembly(StreamParser parser)
        {
            PEAssembly peAssembly = new PE.PEAssembly(parser);

            RvaAndSize importAddressDD = peAssembly.DataDirectory[12];
            RvaAndSize importTableDD = peAssembly.DataDirectory[1];
            RvaAndSize clrHeaderDD = peAssembly.DataDirectory[14];

            PE.PESectionHeader textSection = null;
            for (int i = 0; i < peAssembly.SectionHeaders.Length; i++)
            {
                PE.PESectionHeader sheader = peAssembly.SectionHeaders[i];
                if (sheader.Name == ".text")
                    textSection = sheader;
            }
            if (textSection == null)
                throw new ParseFailedException("PE missing text section");

            parser.Seek(textSection.PointerToRawData);

            CLRHeader clrHeader = new CLRHeader(parser);

            // Parse metadata
            parser.Seek(peAssembly.ResolveRva(clrHeader.MetaData.RelativeVirtualAddress));

            MetaData = new CLRMetaData(parser, this);

            // Parse methods
            ICLRTable methodDefTable = MetaData.MetaDataTables.GetTable((int)CLRMetaDataTables.TableIndex.MethodDef);
            for (uint i = 0; i < methodDefTable.NumRows; i++)
            {
                CLRMethodDefRow methodDef = (CLRMethodDefRow)methodDefTable.GetRow(i);
                if (methodDef.RVA != 0)
                {
                    parser.Seek(peAssembly.ResolveRva(methodDef.RVA));
                    methodDef.DigestMethod(MetaData.MetaDataTables.MetaDataParser);
                }
            }
        }
Esempio n. 3
0
        public PEAssembly(StreamParser parser)
        {
            DOSHeader dosHeader = new DOSHeader(parser);
            parser.Seek(dosHeader.PEHeaderOffset);
            PEHeader peHeader = new PEHeader(parser);
            if (peHeader.SizeOfOptionalHeader == 0)
                throw new ParseFailedException("PE missing NT header");
            PEOptionalHeader peOptionalHeader = new PEOptionalHeader(parser);
            PESectionHeader[] sectionHeaders = new PESectionHeader[peHeader.NumberOfSections];
            for (int i = 0; i < peHeader.NumberOfSections; i++)
                sectionHeaders[i] = new PESectionHeader(parser);

            SectionHeaders = sectionHeaders;
            DataDirectory = peOptionalHeader.DataDirectory;
        }
Esempio n. 4
0
        public CLRMetaData(StreamParser parser, CLRAssembly assembly)
        {
            Assembly = assembly;

            long metaRootPosition = parser.Position;
            uint magic = parser.ReadU32();
            if (magic != 0x424a5342)
                throw new ParseFailedException("Bad metadata magic");
            MajorVersion = parser.ReadU16();
            MinorVersion = parser.ReadU16();
            parser.Skip(4);     // Reserved
            uint versionLength = parser.ReadU32();
            if (versionLength > 255)
                throw new ParseFailedException("Oversized section length");
            uint paddedLength = versionLength + 3;
            paddedLength -= paddedLength % 4;
            Version = parser.ReadUTF8String((int)versionLength);
            parser.Skip(paddedLength - versionLength);
            Flags = parser.ReadU16();

            ushort nStreams = parser.ReadU16();
            StreamHeaders = new CLRStreamHeader[nStreams];
            Dictionary<string, CLRStreamHeader> streamHeadersByName = new Dictionary<string, CLRStreamHeader>();
            for (int i = 0; i < nStreams; i++)
            {
                CLRStreamHeader sh = new CLRStreamHeader(parser);
                if (streamHeadersByName.ContainsKey(sh.Name))
                    throw new ParseFailedException("Duplicate metadata stream");
                streamHeadersByName[sh.Name] = sh;
            }

            // Strings US GUID Blob
            CLRMetaStreamBinaryData binData = new CLRMetaStreamBinaryData(parser, metaRootPosition, streamHeadersByName);

            // Parse metadata tables
            parser.Seek(streamHeadersByName["#~"].Offset + metaRootPosition);
            MetaDataTables = new CLRMetaDataTables(parser, this, binData);
        }