private DevirtualisationContext CreateDevirtualisationContext(DevirtualisationOptions options) { // Open target file. Logger.Log(Tag, $"Opening target file {options.InputFile}..."); var assembly = WindowsAssembly.FromFile(options.InputFile); var header = assembly.NetDirectory?.MetadataHeader; if (header == null) { throw new BadImageFormatException("Assembly does not contain a valid .NET header."); } // Hook into md stream parser. var parser = new KoiVmAwareStreamParser(options.KoiStreamName, Logger); if (options.OverrideKoiStreamData) { string path = Path.IsPathRooted(options.KoiStreamDataFile) ? options.KoiStreamDataFile : Path.Combine(Path.GetDirectoryName(options.InputFile), options.KoiStreamDataFile); Logger.Log(Tag, $"Opening external Koi stream data file {path}..."); parser.ReplacementData = File.ReadAllBytes(path); var streamHeader = header.StreamHeaders.FirstOrDefault(h => h.Name == options.KoiStreamName); if (streamHeader == null) { streamHeader = new MetadataStreamHeader(options.KoiStreamName) { Stream = KoiStream.FromReadingContext( new ReadingContext() { Reader = new MemoryStreamReader(parser.ReplacementData) }, Logger) }; header.StreamHeaders.Add(streamHeader); } } header.StreamParser = parser; // Ignore invalid / encrypted method bodies when specified. if (options.IgnoreInvalidMethodBodies) { var table = header.GetStream <TableStream>().GetTable <MethodDefinitionTable>(); table.MethodBodyReader = new DefaultMethodBodyReader { ThrowOnInvalidMethodBody = false }; } // Lock image and set custom md resolver. var image = header.LockMetadata(); image.MetadataResolver = new DefaultMetadataResolver( new DefaultNetAssemblyResolver(Path.GetDirectoryName(options.InputFile))); var runtimeImage = ResolveRuntimeImage(options, image); return(new DevirtualisationContext(options, image, runtimeImage, Logger)); }
public void WhenIReadTheMetadataStreamHeaders() { var fileName = ScenarioContext.Current.Get <string>("FileName"); var filePath = string.Format(@".\TestArtifacts\{0}", fileName); if (!File.Exists(filePath)) { filePath = string.Format(@".\{0}", fileName); Console.WriteLine(string.Format(@"File not Found: .\TestArtifacts\{0}", fileName)); } using (FileStream inputFile = File.OpenRead(filePath)) { var generalMetadataHeader = ScenarioContext.Current.Get <GeneralMetadataHeader>("GeneralMetadataHeader"); var metadataStorageHeader = ScenarioContext.Current.Get <MetadataStorageHeader>("MetadataStorageHeader"); Dictionary <string, MetadataStreamHeader> streams = new Dictionary <string, MetadataStreamHeader>(); if (metadataStorageHeader.iStreams > 0) { var metadataStreamHeader = new MetadataStreamHeader(generalMetadataHeader, inputFile); streams.Add(metadataStreamHeader.rcName, metadataStreamHeader); for (int i = 1; i < metadataStorageHeader.iStreams; i++) { MetadataStreamHeader streamHeader = new MetadataStreamHeader(inputFile); streams.Add(streamHeader.rcName, streamHeader); } } ScenarioContext.Current.Add("MetadataStreamHeaders", streams); } }
internal MetadataStream() { m_header = new MetadataStreamHeader(this); }
internal MetadataStream() { m_header = new MetadataStreamHeader (this); }
public IMetadataStream ReadStream(MetadataStreamHeader header, IBinaryStreamReader reader) { return(header.Name == KoiStreamName ? new KoiStream(KoiStreamName, new DataSegment(reader.ReadToEnd()), Logger) : _reader.ReadStream(header, reader)); }
public IMetadataStream ReadStream(PEReaderContext context, MetadataStreamHeader header, ref BinaryStreamReader reader) { return(header.Name == KoiStreamName ? new KoiStream(KoiStreamName, new DataSegment(reader.ReadToEnd()), Logger) : _reader.ReadStream(context, header, ref reader)); }