Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
 internal MetadataStream()
 {
     m_header = new MetadataStreamHeader(this);
 }
Esempio n. 4
0
 internal MetadataStream()
 {
     m_header = new MetadataStreamHeader (this);
 }
Esempio n. 5
0
 public IMetadataStream ReadStream(MetadataStreamHeader header, IBinaryStreamReader reader)
 {
     return(header.Name == KoiStreamName
         ? new KoiStream(KoiStreamName, new DataSegment(reader.ReadToEnd()), Logger)
         : _reader.ReadStream(header, reader));
 }
Esempio n. 6
0
 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));
 }