Beispiel #1
0
        /// <summary>
        /// Returns true if the PE file meets all of the pre-conditions to be Open Source Signed.
        /// Returns false and logs msbuild errors otherwise.
        /// </summary>
        private bool Validate(PEReader peReader)
        {
            if (!peReader.HasMetadata)
            {
                LogError("PE file is not a managed module.");
                return(false);
            }

            var mdReader = peReader.GetMetadataReader();

            if (!mdReader.IsAssembly)
            {
                LogError("PE file is not an assembly.");
                return(false);
            }

            CorHeader header = peReader.PEHeaders.CorHeader;

            if ((header.Flags & CorFlags.StrongNameSigned) == CorFlags.StrongNameSigned)
            {
                LogError("PE file is already strong-name signed.");
                return(false);
            }

            if ((header.StrongNameSignatureDirectory.Size <= 0) || mdReader.GetAssemblyDefinition().PublicKey.IsNil)
            {
                LogError("PE file is not a delay-signed assembly.");
                return(false);
            }

            return(true);
        }
        public unsafe static MetadataScope Load(PEImage pe, out CorHeader corHeader)
        {
            var dd = pe.Directories[DataDirectories.CLIHeader];

            if (dd.IsNull)
            {
                throw new BadImageFormatException(string.Format(SR.MetadataImageNotValid, pe.Location));
            }

            var metadata = new MetadataScope();

            using (var accessor = pe.OpenImageToSectionData(dd.RVA))
            {
                fixed(byte *pBuff = accessor.ReadBytes(sizeof(CorHeader)))
                {
                    corHeader = *(CorHeader *)pBuff;
                }

                if (corHeader.Cb != MetadataConstants.CorHeaderSignature)
                {
                    throw new BadImageFormatException(string.Format(SR.MetadataImageNotValid, pe.Location));
                }

                accessor.Position = pe.ResolvePositionToSectionData(corHeader.Metadata.RVA);
                metadata.Read(accessor);
            }

            return(metadata);
        }
Beispiel #3
0
        FileType InferType(string fileRelativePath, Stream file)
        {
            if (fileRelativePath.Equals(DepsJson))
            {
                return(FileType.DepsJson);
            }

            if (fileRelativePath.Equals(RuntimeConfigJson))
            {
                return(FileType.RuntimeConfigJson);
            }

            try
            {
                PEReader  peReader  = new PEReader(file);
                CorHeader corHeader = peReader.PEHeaders.CorHeader;
                if ((corHeader != null) && ((corHeader.Flags & CorFlags.ILOnly) != 0))
                {
                    return(FileType.Assembly);
                }
            }
            catch (BadImageFormatException)
            {
            }

            return(FileType.Extract);
        }
Beispiel #4
0
        internal MethodInfo ComputeEntryPoint(bool fileRefEntryPointAllowed)
        {
            PEHeaders peHeaders = PEReader.PEHeaders;
            CorHeader corHeader = peHeaders.CorHeader;

            if ((corHeader.Flags & CorFlags.NativeEntryPoint) != 0)
            {
                return(null);
            }

            int    entryPointToken = corHeader.EntryPointTokenOrRelativeVirtualAddress;
            Handle handle          = entryPointToken.ToHandle();

            if (handle.IsNil)
            {
                return(null);
            }

            HandleKind kind = handle.Kind;

            switch (kind)
            {
            case HandleKind.MethodDefinition:
            {
                MethodDefinitionHandle mdh = (MethodDefinitionHandle)handle;
                return(mdh.ResolveMethod <MethodInfo>(this, default));
            }

            case HandleKind.AssemblyFile:
            {
                if (!fileRefEntryPointAllowed)
                {
                    throw new BadImageFormatException();
                }

                MetadataReader reader     = Reader;
                string         moduleName = ((AssemblyFileHandle)handle).GetAssemblyFile(reader).Name.GetString(reader);
                EcmaModule     roModule   = (EcmaModule)(Assembly.GetModule(moduleName));
                return(roModule.ComputeEntryPoint(fileRefEntryPointAllowed: false));
            }

            default:
                throw new BadImageFormatException();
            }
        }
Beispiel #5
0
            /// <summary>
            /// Returns true if the PE file meets all of the pre-conditions to be Open Source Signed.
            /// Returns false and logs msbuild errors otherwise.
            /// </summary>
            private static bool IsPublicSigned(PEReader peReader)
            {
                if (!peReader.HasMetadata)
                {
                    return(false);
                }

                var mdReader = peReader.GetMetadataReader();

                if (!mdReader.IsAssembly)
                {
                    return(false);
                }

                CorHeader header = peReader.PEHeaders.CorHeader;

                return((header.Flags & CorFlags.StrongNameSigned) == CorFlags.StrongNameSigned);
            }
Beispiel #6
0
        /// <summary>
        /// Returns true if the PE file meets all of the pre-conditions to be Open Source Signed.
        /// Returns false and logs msbuild errors otherwise.
        /// </summary>
        private static bool Validate(PEReader peReader, MetadataReader mdReader, bool unSign)
        {
            CorHeader header = peReader.PEHeaders.CorHeader;
            var       expectedStrongNameFlag = unSign ? CorFlags.StrongNameSigned : 0;
            var       actualStrongNameFlag   = header.Flags & CorFlags.StrongNameSigned;

            if (expectedStrongNameFlag != actualStrongNameFlag)
            {
                Console.Error.WriteLine($"PE file is {(unSign ? "not" : "already")} strong-name signed.");
                return(false);
            }

            if ((header.StrongNameSignatureDirectory.Size <= 0) || mdReader.GetAssemblyDefinition().PublicKey.IsNil)
            {
                Console.Error.WriteLine("PE file is not a delay-signed assembly.");
                return(false);
            }

            return(true);
        }
Beispiel #7
0
        private bool IsAssembly(string path, out bool isPE)
        {
            isPE = false;

            using (FileStream file = File.OpenRead(path))
            {
                try
                {
                    PEReader  peReader  = new PEReader(file);
                    CorHeader corHeader = peReader.PEHeaders.CorHeader;

                    isPE = true; // If peReader.PEHeaders doesn't throw, it is a valid PEImage
                    return(corHeader != null);
                }
                catch (BadImageFormatException)
                {
                }
            }

            return(false);
        }
		public static MemoryMappedMetadata Load(PEImage pe, out CorHeader corHeader)
		{
			var dd = pe.Directories[DataDirectories.CLIHeader];
			if (dd.IsNull)
			{
				throw new BadImageFormatException(string.Format(SR.MetadataImageNotValid, pe.Location));
			}

			MemoryMappedMetadata metadata;
			using (var accessor = pe.OpenImageToSectionData(dd.RVA))
			{
				corHeader = CorHeader.Read(accessor, pe.Location);

				if (corHeader.Metadata.IsNull)
				{
					throw new BadImageFormatException(string.Format(SR.MetadataImageNotValid, pe.Location));
				}

				long position = pe.ResolvePositionToSectionData(corHeader.Metadata.RVA);
				metadata = new MemoryMappedMetadata(accessor.Map(position, corHeader.Metadata.Size));
			}

			return metadata;
		}
Beispiel #9
0
        private static void WriteCorHeader(Stream peStream, CorHeader corHeader)
        {
            var writer = new BlobBuilder(CorHeaderSize);
            writer.WriteUInt32(CorHeaderSize);
            writer.WriteUInt16(corHeader.MajorRuntimeVersion);
            writer.WriteUInt16(corHeader.MinorRuntimeVersion); 
            writer.WriteUInt32((uint)corHeader.MetadataDirectory.RelativeVirtualAddress); 
            writer.WriteUInt32((uint)corHeader.MetadataDirectory.Size);
            writer.WriteUInt32((uint)corHeader.Flags);
            writer.WriteUInt32((uint)corHeader.EntryPointTokenOrRelativeVirtualAddress);
            writer.WriteUInt32((uint)(corHeader.ResourcesDirectory.Size == 0 ? 0 : corHeader.ResourcesDirectory.RelativeVirtualAddress)); // 28
            writer.WriteUInt32((uint)corHeader.ResourcesDirectory.Size);
            writer.WriteUInt32((uint)(corHeader.StrongNameSignatureDirectory.Size == 0 ? 0 : corHeader.StrongNameSignatureDirectory.RelativeVirtualAddress)); // 36
            writer.WriteUInt32((uint)corHeader.StrongNameSignatureDirectory.Size);
            writer.WriteUInt32((uint)corHeader.CodeManagerTableDirectory.RelativeVirtualAddress); 
            writer.WriteUInt32((uint)corHeader.CodeManagerTableDirectory.Size); 
            writer.WriteUInt32((uint)corHeader.VtableFixupsDirectory.RelativeVirtualAddress); 
            writer.WriteUInt32((uint)corHeader.VtableFixupsDirectory.Size); 
            writer.WriteUInt32((uint)corHeader.ExportAddressTableJumpsDirectory.RelativeVirtualAddress);
            writer.WriteUInt32((uint)corHeader.ExportAddressTableJumpsDirectory.Size);
            writer.WriteUInt64(0);
            Debug.Assert(writer.Count == CorHeaderSize);
            Debug.Assert(writer.Count % 4 == 0);

            writer.WriteContentTo(peStream);
        }
Beispiel #10
0
        private string GetProcessorArchitecture()
        {
            string processorArchitecture = "unknown";

            if (_peReader.PEHeaders == null ||
                _peReader.PEHeaders.CoffHeader == null)
            {
                return(processorArchitecture);
            }

            Machine   machine   = _peReader.PEHeaders.CoffHeader.Machine;
            CorHeader corHeader = _peReader.PEHeaders.CorHeader;

            if (corHeader != null)
            {
                CorFlags corFlags = corHeader.Flags;
                if ((corFlags & CorFlags.ILLibrary) != 0)
                {
                    processorArchitecture = "msil";
                }
                else
                {
                    switch (machine)
                    {
                    case Machine.I386:
                        // "x86" only if corflags "requires" but not "prefers" x86
                        if ((corFlags & CorFlags.Requires32Bit) != 0 &&
                            (corFlags & CorFlags.Prefers32Bit) == 0)
                        {
                            processorArchitecture = "x86";
                        }
                        else
                        {
                            processorArchitecture = "msil";
                        }
                        break;

                    case Machine.IA64:
                        processorArchitecture = "ia64";
                        break;

                    case Machine.Amd64:
                        processorArchitecture = "amd64";
                        break;

                    case Machine.Arm:
                        processorArchitecture = "arm";
                        break;

                    case Machine.Arm64:
                        processorArchitecture = "arm64";
                        break;

                    default:
                        break;
                    }
                }
            }

            return(processorArchitecture);
        }
Beispiel #11
0
        private CorHeader CreateCorHeader(MetadataSizes metadataSizes, int entryPointToken)
        {
            CorHeader corHeader = new CorHeader();
            corHeader.CodeManagerTable.RelativeVirtualAddress = 0;
            corHeader.CodeManagerTable.Size = 0;
            corHeader.EntryPointToken = (uint)entryPointToken;
            corHeader.ExportAddressTableJumps.RelativeVirtualAddress = 0;
            corHeader.ExportAddressTableJumps.Size = 0;
            corHeader.Flags = this.GetCorHeaderFlags();
            corHeader.MajorRuntimeVersion = 2;
            corHeader.MetadataDirectory.RelativeVirtualAddress = _textSection.RelativeVirtualAddress + (uint)ComputeOffsetToMetadata(metadataSizes.ILStreamSize);
            corHeader.MetadataDirectory.Size = (uint)metadataSizes.MetadataSize;
            corHeader.MinorRuntimeVersion = 5;
            corHeader.Resources.RelativeVirtualAddress = corHeader.MetadataDirectory.RelativeVirtualAddress + corHeader.MetadataDirectory.Size;
            corHeader.Resources.Size = (uint)metadataSizes.ResourceDataSize;
            corHeader.StrongNameSignature.RelativeVirtualAddress = corHeader.Resources.RelativeVirtualAddress + corHeader.Resources.Size;
            corHeader.StrongNameSignature.Size = (uint)ComputeStrongNameSignatureSize();
            corHeader.VTableFixups.RelativeVirtualAddress = 0;
            corHeader.VTableFixups.Size = 0;

            return corHeader;
        }
Beispiel #12
0
 private static void WriteCorHeader(Stream peStream, CorHeader corHeader)
 {
     var writer = new BlobWriter(72);
     writer.WriteUint(72); // Number of bytes in this header  4
     writer.WriteUshort(corHeader.MajorRuntimeVersion); // 6 
     writer.WriteUshort(corHeader.MinorRuntimeVersion); // 8
     writer.WriteUint(corHeader.MetadataDirectory.RelativeVirtualAddress); // 12
     writer.WriteUint(corHeader.MetadataDirectory.Size); // 16
     writer.WriteUint((uint)corHeader.Flags); // 20
     writer.WriteUint(corHeader.EntryPointToken); // 24
     writer.WriteUint(corHeader.Resources.Size == 0 ? 0u : corHeader.Resources.RelativeVirtualAddress); // 28
     writer.WriteUint(corHeader.Resources.Size); // 32
     writer.WriteUint(corHeader.StrongNameSignature.Size == 0 ? 0u : corHeader.StrongNameSignature.RelativeVirtualAddress); // 36
     writer.WriteUint(corHeader.StrongNameSignature.Size); // 40
     writer.WriteUint(corHeader.CodeManagerTable.RelativeVirtualAddress); // 44
     writer.WriteUint(corHeader.CodeManagerTable.Size); // 48
     writer.WriteUint(corHeader.VTableFixups.RelativeVirtualAddress); // 52
     writer.WriteUint(corHeader.VTableFixups.Size); // 56
     writer.WriteUint(corHeader.ExportAddressTableJumps.RelativeVirtualAddress); // 60
     writer.WriteUint(corHeader.ExportAddressTableJumps.Size); // 64
     writer.WriteUlong(0); // 72
     writer.WriteTo(peStream);
 }
Beispiel #13
0
        private void WriteTextSection(
            Stream peStream,
            CorHeader corHeader,
            BlobWriter metadataWriter,
            BlobWriter ilStream,
            BlobWriter mappedFieldDataWriter,
            BlobWriter managedResourceWriter,
            MetadataSizes metadataSizes,
            ContentId pdbContentId,
            out long metadataPosition)
        {
            peStream.Position = _textSection.PointerToRawData;
            if (_emitRuntimeStartupStub)
            {
                this.WriteImportAddressTable(peStream);
            }

            WriteCorHeader(peStream, corHeader);
            WriteIL(peStream, ilStream);

            metadataPosition = peStream.Position;
            WriteMetadata(peStream, metadataWriter);

            WriteManagedResources(peStream, managedResourceWriter);
            WriteSpaceForHash(peStream, (int)corHeader.StrongNameSignature.Size);
            WriteDebugTable(peStream, pdbContentId, metadataSizes);

            if (_emitRuntimeStartupStub)
            {
                WriteImportTable(peStream);
                WriteNameTable(peStream);
                WriteRuntimeStartupStub(peStream);
            }

            WriteMappedFieldData(peStream, mappedFieldDataWriter);
        }
Beispiel #14
0
        private void WriteTextSection(
            Stream peStream,
            CorHeader corHeader,
            MemoryStream metadataStream,
            MemoryStream ilStream,
            MemoryStream mappedFieldDataStream,
            MemoryStream managedResourceStream,
            out long startOfMetadata,
            out long positionOfTimestamp)
        {
            peStream.Position = _textSection.PointerToRawData;
            if (_emitRuntimeStartupStub)
            {
                this.WriteImportAddressTable(peStream);
            }

            WriteCorHeader(peStream, corHeader);
            WriteIL(peStream, ilStream);

            startOfMetadata = peStream.Position;
            WriteMetadata(peStream, metadataStream);

            this.WriteManagedResources(peStream, managedResourceStream);
            WriteSpaceForHash(peStream, (int)corHeader.StrongNameSignature.Size);
            this.WriteDebugTable(peStream, out positionOfTimestamp);

            if (_emitRuntimeStartupStub)
            {
                this.WriteImportTable(peStream);
                this.WriteNameTable(peStream);
                this.WriteRuntimeStartupStub(peStream);
            }

            WriteMappedFieldData(peStream, mappedFieldDataStream);
        }