예제 #1
0
 public DotNetHeadersImpl(PeHeaders peHeaders, DotNetCor20Data cor20, DotNetMetadataHeaders metadataHeaders, VirtualArrayData <ByteData> strongNameSignature, DotNetMethodProvider methodProvider, DotNetResourceProvider resourceProvider)
 {
     if (peHeaders == null)
     {
         throw new ArgumentNullException(nameof(peHeaders));
     }
     if (cor20 == null)
     {
         throw new ArgumentNullException(nameof(cor20));
     }
     if (methodProvider == null)
     {
         throw new ArgumentNullException(nameof(methodProvider));
     }
     if (resourceProvider == null)
     {
         throw new ArgumentNullException(nameof(resourceProvider));
     }
     PeHeaders           = peHeaders;
     Cor20               = cor20;
     MetadataHeaders     = metadataHeaders;
     StrongNameSignature = strongNameSignature;
     MethodProvider      = methodProvider;
     ResourceProvider    = resourceProvider;
 }
예제 #2
0
        HexSpan?GetFieldReferenceSpan(HexBufferFile file, DotNetCor20Data cor20, HexPosition position)
        {
            HexSpan?span;

            if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.Metadata.Data, position)) != null)
            {
                return(span);
            }
            if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.Resources.Data, position)) != null)
            {
                return(span);
            }
            if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.StrongNameSignature.Data, position)) != null)
            {
                return(span);
            }
            if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.CodeManagerTable.Data, position)) != null)
            {
                return(span);
            }
            if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.VTableFixups.Data, position)) != null)
            {
                return(span);
            }
            if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.ExportAddressTableJumps.Data, position)) != null)
            {
                return(span);
            }
            if ((span = DataDirectoryDataUtils.TryGetSpan(file, cor20.ManagedNativeHeader.Data, position)) != null)
            {
                return(span);
            }

            if (cor20.EntryPointTokenOrRVA.Data.Span.Span.Contains(position))
            {
                uint value = cor20.EntryPointTokenOrRVA.Data.ReadValue();
                if (value == 0)
                {
                    return(null);
                }
                if ((cor20.Flags.Data.ReadValue() & 0x10) != 0)
                {
                    var peHeaders = file.GetHeaders <PeHeaders>();
                    if (peHeaders == null)
                    {
                        return(null);
                    }
                    return(new HexSpan(peHeaders.RvaToBufferPosition(value), 0));
                }
                else
                {
                    return(TryGetTokenSpan(file, value));
                }
            }

            return(null);
        }
예제 #3
0
        public override bool Initialize()
        {
            HexSpan?resourcesSpan = null;
            var     peHeaders     = file.GetHeaders <PeHeaders>();

            if (peHeaders != null)
            {
                if (peHeaders.OptionalHeader.DataDirectory.Data.FieldCount < 15)
                {
                    return(false);
                }
                var cor20Span = Read(peHeaders, peHeaders.OptionalHeader.DataDirectory.Data[14].Data);
                if (cor20Span == null)
                {
                    return(false);
                }
                cor20 = DotNetCor20DataImpl.TryCreate(file, cor20Span.Value.Start);
                if (cor20 == null)
                {
                    return(false);
                }

                var mdSpan = Read(peHeaders, cor20.MetaData.Data);
                resourcesSpan = Read(peHeaders, cor20.Resources.Data);
                var snSpan = Read(peHeaders, cor20.StrongNameSignature.Data);

                ReadDotNetMetadataHeader(peHeaders, mdSpan);
                ReadStrongNameSignature(peHeaders, snSpan);
            }
            else
            {
                // Could be a portable PDB file (or a metadata only file)
                ReadDotNetMetadataHeader(file.Span);
            }

            if (mdHeader != null && dotNetHeaps != null)
            {
                dotNetMetadataHeaders = new DotNetMetadataHeadersImpl(metadataSpan, mdHeader, dotNetHeaps);
            }
            if (peHeaders != null && cor20 != null)
            {
                dotNetMethodProvider   = new DotNetMethodProviderImpl(file, peHeaders, dotNetMetadataHeaders?.TablesStream);
                dotNetResourceProvider = new DotNetResourceProviderImpl(file, peHeaders, dotNetMetadataHeaders, resourcesSpan);
                dotNetHeaders          = new DotNetHeadersImpl(peHeaders, cor20, dotNetMetadataHeaders, strongNameSignature, dotNetMethodProvider, dotNetResourceProvider);
            }
            return(cor20 != null || !metadataSpan.IsEmpty);
        }
예제 #4
0
        public ImageCor20HeaderVM(HexBuffer buffer, DotNetCor20Data cor20)
            : base(cor20.Span)
        {
            Name = cor20.Name;
            CbVM = new UInt32HexField(cor20.Cb);
            MajorRuntimeVersionVM = new UInt16HexField(cor20.MajorRuntimeVersion, true);
            MinorRuntimeVersionVM = new UInt16HexField(cor20.MinorRuntimeVersion, true);
            MetaDataVM            = new DataDirectoryVM(cor20.MetaData);
            FlagsVM = new UInt32FlagsHexField(cor20.Flags);
            FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_IL_Only, 0));
            FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_32BitReqd, 1));
            FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_ILLibrary, 2));
            FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_StrongNameSigned, 3));
            FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_NativeEntryPoint, 4));
            FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_TrackDebugData, 16));
            FlagsVM.Add(new BooleanHexBitField(dnSpy_AsmEditor_Resources.HexNode_Cor20Header_Flags_32BitPref, 17));
            EntryPointTokenRVAVM      = new UInt32HexField(cor20.EntryPointTokenOrRVA);
            ResourcesVM               = new DataDirectoryVM(cor20.Resources);
            StrongNameSignatureVM     = new DataDirectoryVM(cor20.StrongNameSignature);
            CodeManagerTableVM        = new DataDirectoryVM(cor20.CodeManagerTable);
            VTableFixupsVM            = new DataDirectoryVM(cor20.VTableFixups);
            ExportAddressTableJumpsVM = new DataDirectoryVM(cor20.ExportAddressTableJumps);
            ManagedNativeHeaderVM     = new DataDirectoryVM(cor20.ManagedNativeHeader);

            hexFields = new HexField[] {
                CbVM,
                MajorRuntimeVersionVM,
                MinorRuntimeVersionVM,
                MetaDataVM.RVAVM,
                MetaDataVM.SizeVM,
                FlagsVM,
                EntryPointTokenRVAVM,
                ResourcesVM.RVAVM,
                ResourcesVM.SizeVM,
                StrongNameSignatureVM.RVAVM,
                StrongNameSignatureVM.SizeVM,
                CodeManagerTableVM.RVAVM,
                CodeManagerTableVM.SizeVM,
                VTableFixupsVM.RVAVM,
                VTableFixupsVM.SizeVM,
                ExportAddressTableJumpsVM.RVAVM,
                ExportAddressTableJumpsVM.SizeVM,
                ManagedNativeHeaderVM.RVAVM,
                ManagedNativeHeaderVM.SizeVM,
            };
        }