コード例 #1
0
 /// <summary>
 /// Creates a new managed PE file builder context.
 /// </summary>
 /// <param name="image">The image to build.</param>
 public ManagedPEBuilderContext(IPEImage image)
 {
     ImportDirectory      = new ImportDirectoryBuffer(image.PEKind == OptionalHeaderMagic.Pe32);
     ExportDirectory      = new ExportDirectoryBuffer();
     DotNetSegment        = new DotNetSegmentBuffer(image.DotNetDirectory);
     ResourceDirectory    = new ResourceDirectoryBuffer();
     RelocationsDirectory = new RelocationsDirectoryBuffer();
     FieldRvaDataReader   = new FieldRvaDataReader();
     Bootstrapper         = CreateBootstrapper(image);
 }
コード例 #2
0
        public CompactNetTextContents(WindowsAssembly assembly)
        {
            ImportBuffer = new ImportDirectoryBuffer(assembly);

            // IAT
            Segments.Add(ImportBuffer.AddressTables);

            // .NET Directory
            Segments.Add(NetDirectory = assembly.NetDirectory);

            // Method bodies.
            Segments.Add(MethodBodyTable = new MethodBodyTableBuffer());

            // Manifest resource data.
            if (assembly.NetDirectory.ResourcesManifest != null)
            {
                Segments.Add(assembly.NetDirectory.ResourcesManifest);
            }

            // Field data (FieldRVAs).
            Segments.Add(FieldDataTable = new SimpleFileSegmentBuilder());

            // Metadata directory header.
            Segments.Add(MetadataDirectory = new MetadataDirectoryBuffer(assembly.NetDirectory.MetadataHeader));

            // Debug directory.
            if (assembly.DebugDirectory != null)
            {
                Segments.Add(DebugDirectory = assembly.DebugDirectory);
                Segments.Add(assembly.DebugDirectory.Data);
            }

            // Strong name.
            if (NetDirectory.StrongNameData != null)
            {
                Segments.Add(NetDirectory.StrongNameData);
            }

            // VTables.
            if (NetDirectory.VTablesDirectory != null)
            {
                VTableFixups = new VTableFixupsBuffer(NetDirectory.VTablesDirectory);
                Segments.Add(VTableFixups.Directory);
                Segments.Add(VTableFixups.EntriesTable);
            }

            // Export directory.
            if (assembly.ExportDirectory != null)
            {
                Segments.Add(ExportDirectory = new ExportDirectoryBuffer(assembly.ExportDirectory, assembly));
            }

            // Remaining bits of the import tables.
            _importDirectory.Segments.Add(ImportBuffer.ModuleImportTable);
            _importDirectory.Segments.Add(ImportBuffer.LookupTables);
            _importDirectory.Segments.Add(ImportBuffer.NameTable);
            Segments.Add(_importDirectory);

            // Bootstrapper (Call to _CorExeMain / _CorDllMain).
            Segments.Add(Bootstrapper = new BootstrapperSegment());

            var tableStream = assembly.NetDirectory.MetadataHeader.GetStream <TableStream>();

            // Initialize field data segment.
            foreach (var fieldRva in tableStream.GetTable <FieldRvaTable>())
            {
                if (fieldRva.Column1 != null)
                {
                    FieldDataTable.Segments.Add(fieldRva.Column1);
                }
            }

            // Initialize method body table.
            foreach (var method in tableStream.GetTable <MethodDefinitionTable>())
            {
                if (method.Column1 != null)
                {
                    MethodBodyTable.Segments.Add(method.Column1);
                }
            }
        }