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; }
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); } } }
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; }
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); }