コード例 #1
0
        internal CorFlags GetCorHeaderFlags()
        {
            CorFlags result = 0;

            if (ILOnly)
            {
                result |= CorFlags.ILOnly;
            }

            if (Requires32bits)
            {
                result |= CorFlags.Requires32Bit;
            }

            if (StrongNameSigned)
            {
                result |= CorFlags.StrongNameSigned;
            }

            if (TrackDebugData)
            {
                result |= CorFlags.TrackDebugData;
            }

            if (Prefers32Bit)
            {
                result |= CorFlags.Requires32Bit | CorFlags.Prefers32Bit;
            }

            return(result);
        }
コード例 #2
0
        public sealed override void GetPEKind(out PortableExecutableKinds peKind, out ImageFileMachine machine)
        {
            PEHeaders peHeaders   = PEReader.PEHeaders;
            PEMagic   peMagic     = peHeaders.PEHeader.Magic;
            Machine   coffMachine = peHeaders.CoffHeader.Machine;
            CorFlags  corFlags    = peHeaders.CorHeader.Flags;

            peKind = default;
            if ((corFlags & CorFlags.ILOnly) != 0)
            {
                peKind |= PortableExecutableKinds.ILOnly;
            }

            if ((corFlags & CorFlags.Prefers32Bit) != 0)
            {
                peKind |= PortableExecutableKinds.Preferred32Bit;
            }
            else if ((corFlags & CorFlags.Requires32Bit) != 0)
            {
                peKind |= PortableExecutableKinds.Required32Bit;
            }

            if (peMagic == PEMagic.PE32Plus)
            {
                peKind |= PortableExecutableKinds.PE32Plus;
            }

            machine = (ImageFileMachine)coffMachine;
        }
コード例 #3
0
 internal void SetDefaults(string name)
 {
     Contract.Requires(name != null);
     fromExisting = false;
     isDLL        = name.EndsWith(".dll") || name.EndsWith(".DLL");
     if (isDLL)
     {
         characteristics = FileImage.dllCharacteristics;
     }
     else
     {
         characteristics = FileImage.exeCharacteristics;
     }
     lMajor       = MetaData.LMajors[0];
     lMinor       = 0;
     fileAlign    = FileImage.minFileAlign;
     osMajor      = 4;
     osMinor      = 0;
     userMajor    = 0;
     userMinor    = 0;
     subSysMajor  = 4;
     subSysMinor  = 0;
     subSystem    = SubSystem.Windows_CUI;
     DLLFlags     = FileImage.DLLFlags;
     cliMajVer    = 2;
     cliMinVer    = 0;
     corFlags     = CorFlags.CF_IL_ONLY;
     mdMajVer     = 1;
     mdMinVer     = 1; // MetaData Minor Version  ECMA = 0, PEFiles = 1
     netVersion   = NetVersion.Everett;
     netVerString = MetaData.versions[0];
     tsMajVer     = 1;
     tsMinVer     = 0;
 }
コード例 #4
0
 private CorFlagsReader(ushort majorRuntimeVersion, ushort minorRuntimeVersion, CorFlags corflags, PEFormat peFormat)
 {
     this.majorRuntimeVersion = majorRuntimeVersion;
     this.minorRuntimeVersion = minorRuntimeVersion;
     this.corflags            = corflags;
     this.peFormat            = peFormat;
 }
コード例 #5
0
ファイル: CorHeader.cs プロジェクト: tang7526/roslyn
 public CorHeader(
     CorFlags flags,
     DirectoryEntry metadataDirectory,
     int entryPointTokenOrRelativeVirtualAddress = 0,
     ushort majorRuntimeVersion                      = 2,
     ushort minorRuntimeVersion                      = 5,
     DirectoryEntry resourcesDirectory               = default(DirectoryEntry),
     DirectoryEntry strongNameSignatureDirectory     = default(DirectoryEntry),
     DirectoryEntry codeManagerTableDirectory        = default(DirectoryEntry),
     DirectoryEntry vtableFixupsDirectory            = default(DirectoryEntry),
     DirectoryEntry exportAddressTableJumpsDirectory = default(DirectoryEntry),
     DirectoryEntry managedNativeHeaderDirectory     = default(DirectoryEntry))
 {
     MajorRuntimeVersion = majorRuntimeVersion;
     MinorRuntimeVersion = minorRuntimeVersion;
     MetadataDirectory   = metadataDirectory;
     Flags = flags;
     EntryPointTokenOrRelativeVirtualAddress = entryPointTokenOrRelativeVirtualAddress;
     ResourcesDirectory               = resourcesDirectory;
     StrongNameSignatureDirectory     = strongNameSignatureDirectory;
     CodeManagerTableDirectory        = codeManagerTableDirectory;
     VtableFixupsDirectory            = vtableFixupsDirectory;
     ExportAddressTableJumpsDirectory = exportAddressTableJumpsDirectory;
     ManagedNativeHeaderDirectory     = managedNativeHeaderDirectory;
 }
コード例 #6
0
ファイル: ExtendedPEBuilder.cs プロジェクト: belav/roslyn
 public ExtendedPEBuilder(
     PEHeaderBuilder header,
     MetadataRootBuilder metadataRootBuilder,
     BlobBuilder ilStream,
     BlobBuilder mappedFieldData,
     BlobBuilder managedResources,
     ResourceSectionBuilder nativeResources,
     DebugDirectoryBuilder debugDirectoryBuilder,
     int strongNameSignatureSize,
     MethodDefinitionHandle entryPoint,
     CorFlags flags,
     Func <IEnumerable <Blob>, BlobContentId> deterministicIdProvider,
     bool withMvidSection
     )
     : base(
         header,
         metadataRootBuilder,
         ilStream,
         mappedFieldData,
         managedResources,
         nativeResources,
         debugDirectoryBuilder,
         strongNameSignatureSize,
         entryPoint,
         flags,
         deterministicIdProvider
         )
 {
     _withMvidSection = withMvidSection;
 }
コード例 #7
0
        public ManagedPEBuilder(
            PEHeaderBuilder header,
            TypeSystemMetadataSerializer metadataSerializer,
            BlobBuilder ilStream,
            BlobBuilder mappedFieldData,
            BlobBuilder managedResourceData,
            Action <BlobBuilder, SectionLocation> nativeResourceSectionSerializer, // opt
            int strongNameSignatureSize,
            MethodDefinitionHandle entryPoint,
            string pdbPathOpt,              // TODO: DebugTableBuilder
            ContentId nativePdbContentId,   // TODO: DebugTableBuilder
            ContentId portablePdbContentId, // TODO: DebugTableBuilder
            CorFlags corFlags,
            Func <IEnumerable <Blob>, ContentId> deterministicIdProvider = null)
            : base(header, deterministicIdProvider)
        {
            _metadataSerializer  = metadataSerializer;
            _ilStream            = ilStream;
            _mappedFieldData     = mappedFieldData;
            _managedResourceData = managedResourceData;
            _nativeResourceSectionSerializerOpt = nativeResourceSectionSerializer;
            _strongNameSignatureSize            = strongNameSignatureSize;
            _entryPoint           = entryPoint;
            _pdbPathOpt           = pdbPathOpt;
            _nativePdbContentId   = nativePdbContentId;
            _portablePdbContentId = portablePdbContentId;
            _corFlags             = corFlags;

            _peDirectoriesBuilder = new PEDirectoriesBuilder();
        }
コード例 #8
0
 public CorHeader(
     CorFlags flags,
     DirectoryEntry metadataDirectory,
     int entryPointTokenOrRelativeVirtualAddress = 0,
     ushort majorRuntimeVersion = 2,
     ushort minorRuntimeVersion = 5,
     DirectoryEntry resourcesDirectory = default(DirectoryEntry),
     DirectoryEntry strongNameSignatureDirectory = default(DirectoryEntry),
     DirectoryEntry codeManagerTableDirectory = default(DirectoryEntry),
     DirectoryEntry vtableFixupsDirectory = default(DirectoryEntry),
     DirectoryEntry exportAddressTableJumpsDirectory = default(DirectoryEntry),
     DirectoryEntry managedNativeHeaderDirectory = default(DirectoryEntry))
 {
     MajorRuntimeVersion = majorRuntimeVersion;
     MinorRuntimeVersion = minorRuntimeVersion;
     MetadataDirectory = metadataDirectory;
     Flags = flags;
     EntryPointTokenOrRelativeVirtualAddress = entryPointTokenOrRelativeVirtualAddress;
     ResourcesDirectory = resourcesDirectory;
     StrongNameSignatureDirectory = strongNameSignatureDirectory;
     CodeManagerTableDirectory = codeManagerTableDirectory;
     VtableFixupsDirectory = vtableFixupsDirectory;
     ExportAddressTableJumpsDirectory = exportAddressTableJumpsDirectory;
     ManagedNativeHeaderDirectory = managedNativeHeaderDirectory;
 }
コード例 #9
0
        public static void Set32BitPreferredSRM(string filePath, bool prefer32Bit)
        {
            using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite))
            {
                PEReader reader = new PEReader(stream);

                CorFlags attributes = reader.PEHeaders.CorHeader.Flags;

                var old = (attributes & CorFlags.Prefers32Bit) == CorFlags.Prefers32Bit;
                if (old != prefer32Bit)
                {
                    if (prefer32Bit)
                    {
                        attributes = attributes | CorFlags.Prefers32Bit;
                    }
                    else
                    {
                        attributes = attributes & ~CorFlags.Prefers32Bit;
                        attributes = attributes & ~CorFlags.Requires32Bit;
                    }

                    var offset = reader.PEHeaders.CorHeaderStartOffset;
                    offset         += 0x10; // flags offset
                    stream.Position = offset;
                    int value = (int)attributes;
                    stream.WriteByte((byte)(value & 0xFF));
                    stream.WriteByte((byte)(value & 0xFF00));
                    stream.WriteByte((byte)(value & 0xFF0000));
                    stream.WriteByte((byte)(value & 0xFF000000));
                }
            }
        }
コード例 #10
0
ファイル: AssemblyMetadata.cs プロジェクト: soelske/mbunit-v3
 private AssemblyMetadata(ushort majorRuntimeVersion, ushort minorRuntimeVersion, CorFlags corflags, PEFormat peFormat,
                          AssemblyName assemblyName, IList <AssemblyName> assemblyReferences, string runtimeVersion)
 {
     this.majorRuntimeVersion = majorRuntimeVersion;
     this.minorRuntimeVersion = minorRuntimeVersion;
     this.corflags            = corflags;
     this.peFormat            = peFormat;
     this.assemblyName        = assemblyName;
     this.assemblyReferences  = assemblyReferences;
     this.runtimeVersion      = runtimeVersion;
 }
コード例 #11
0
 private AssemblyMetadata(ushort majorRuntimeVersion, ushort minorRuntimeVersion, CorFlags corflags, PEFormat peFormat,
     AssemblyName assemblyName, IList<AssemblyName> assemblyReferences, string runtimeVersion)
 {
     this.majorRuntimeVersion = majorRuntimeVersion;
     this.minorRuntimeVersion = minorRuntimeVersion;
     this.corflags = corflags;
     this.peFormat = peFormat;
     this.assemblyName = assemblyName;
     this.assemblyReferences = assemblyReferences;
     this.runtimeVersion = runtimeVersion;
 }
コード例 #12
0
        static bool CheckFiles(List <string> files)
        {
            foreach (var file in files)
            {
                if (!CorFlags.IsAnycpuOrX64(file))
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #13
0
        static bool CheckDllOrExe(List <string> filesList)
        {
            bool result = true;

            foreach (var file in filesList)
            {
                if (!CorFlags.IsAnycpuOrX64(file))
                {
                    Console.WriteLine(file);
                    result = false;
                }
            }

            return(result);
        }
コード例 #14
0
    private CorFlagsReader(ushort majorRuntimeVersion, ushort minorRuntimeVersion, CorFlags corflags, PEFormat peFormat)
    {
        MajorRuntimeVersion = majorRuntimeVersion;
        MinorRuntimeVersion = minorRuntimeVersion;

        IsPureIL    = (corflags & CorFlags.ILOnly) == CorFlags.ILOnly;
        Is32BitReq  = (corflags & CorFlags.Requires32Bit) == CorFlags.Requires32Bit;
        Is32BitPref = (corflags & CorFlags.Prefers32Bit) == CorFlags.Prefers32Bit;
        IsSigned    = (corflags & CorFlags.StrongNameSigned) == CorFlags.StrongNameSigned;

        ProcessorArchitecture = peFormat == PEFormat.PE32Plus
                ? ProcessorArchitecture.Amd64
                : (corflags & CorFlags.Requires32Bit) == CorFlags.Requires32Bit || !IsPureIL
                    ? ProcessorArchitecture.X86
                    : ProcessorArchitecture.MSIL;
    }
コード例 #15
0
ファイル: SectionBuilder.cs プロジェクト: z1c0/corert
        public CorHeaderBuilder(ref BlobReader reader)
        {
            // byte count
            CorHeaderSize = reader.ReadInt32();

            MajorRuntimeVersion = reader.ReadUInt16();
            MinorRuntimeVersion = reader.ReadUInt16();
            MetadataDirectory   = ReadDirectoryEntry(ref reader);
            Flags = (CorFlags)reader.ReadUInt32();
            EntryPointTokenOrRelativeVirtualAddress = reader.ReadInt32();
            ResourcesDirectory               = ReadDirectoryEntry(ref reader);
            StrongNameSignatureDirectory     = ReadDirectoryEntry(ref reader);
            CodeManagerTableDirectory        = ReadDirectoryEntry(ref reader);
            VtableFixupsDirectory            = ReadDirectoryEntry(ref reader);
            ExportAddressTableJumpsDirectory = ReadDirectoryEntry(ref reader);
            ManagedNativeHeaderDirectory     = ReadDirectoryEntry(ref reader);
        }
コード例 #16
0
ファイル: ManagedPEBuilder.cs プロジェクト: stark-lang/stark
        public ManagedPEBuilder(
            PEHeaderBuilder header,
            MetadataRootBuilder metadataRootBuilder,
            BlobBuilder ilStream,
            BlobBuilder mappedFieldData                 = null,
            BlobBuilder managedResources                = null,
            ResourceSectionBuilder nativeResources      = null,
            DebugDirectoryBuilder debugDirectoryBuilder = null,
            int strongNameSignatureSize                 = DefaultStrongNameSignatureSize,
            MethodDefinitionHandle entryPoint           = default(MethodDefinitionHandle),
            CorFlags flags = CorFlags.ILOnly,
            Func <IEnumerable <Blob>, BlobContentId> deterministicIdProvider = null)
            : base(header, deterministicIdProvider)
        {
            if (header == null)
            {
                Throw.ArgumentNull(nameof(header));
            }

            if (metadataRootBuilder == null)
            {
                Throw.ArgumentNull(nameof(metadataRootBuilder));
            }

            if (ilStream == null)
            {
                Throw.ArgumentNull(nameof(ilStream));
            }

            if (strongNameSignatureSize < 0)
            {
                Throw.ArgumentOutOfRange(nameof(strongNameSignatureSize));
            }

            _metadataRootBuilder      = metadataRootBuilder;
            _ilStream                 = ilStream;
            _mappedFieldDataOpt       = mappedFieldData;
            _managedResourcesOpt      = managedResources;
            _nativeResourcesOpt       = nativeResources;
            _strongNameSignatureSize  = strongNameSignatureSize;
            _entryPointOpt            = entryPoint;
            _debugDirectoryBuilderOpt = debugDirectoryBuilder ?? CreateDefaultDebugDirectoryBuilder();
            _corFlags                 = flags;

            _peDirectoriesBuilder = new PEDirectoriesBuilder();
        }
コード例 #17
0
ファイル: ManagedPEBuilder.cs プロジェクト: ChuangYang/corefx
        public ManagedPEBuilder(
            PEHeaderBuilder header,
            MetadataRootBuilder metadataRootBuilder,
            BlobBuilder ilStream,
            BlobBuilder mappedFieldData = null,
            BlobBuilder managedResources = null,
            ResourceSectionBuilder nativeResources = null,
            DebugDirectoryBuilder debugDirectoryBuilder = null,
            int strongNameSignatureSize = DefaultStrongNameSignatureSize,
            MethodDefinitionHandle entryPoint = default(MethodDefinitionHandle),
            CorFlags flags = CorFlags.ILOnly,
            Func<IEnumerable<Blob>, BlobContentId> deterministicIdProvider = null)
            : base(header, deterministicIdProvider)
        {
            if (header == null)
            {
                Throw.ArgumentNull(nameof(header));
            }

            if (metadataRootBuilder == null)
            {
                Throw.ArgumentNull(nameof(metadataRootBuilder));
            }

            if (ilStream == null)
            {
                Throw.ArgumentNull(nameof(ilStream));
            }

            if (strongNameSignatureSize < 0)
            {
                Throw.ArgumentOutOfRange(nameof(strongNameSignatureSize));
            }

            _metadataRootBuilder = metadataRootBuilder;
            _ilStream = ilStream;
            _mappedFieldDataOpt = mappedFieldData;
            _managedResourcesOpt = managedResources;
            _nativeResourcesOpt = nativeResources;
            _strongNameSignatureSize = strongNameSignatureSize;
            _entryPointOpt = entryPoint;
            _debugDirectoryBuilderOpt = debugDirectoryBuilder ?? CreateDefaultDebugDirectoryBuilder();
            _corFlags = flags;

            _peDirectoriesBuilder = new PEDirectoriesBuilder();
        }
コード例 #18
0
        static bool CheckNuget(List <string> filesList)
        {
            bool result = true;

            foreach (var packageFile in filesList)
            {
                var tempDir = Path.GetTempPath() + Path.GetRandomFileName();
                try
                {
                    ZipFile.ExtractToDirectory(packageFile, tempDir);

                    var files = new List <string>();
                    FileOperation.GetFiles(tempDir, "*.dll", ref files);

                    foreach (var file in files)
                    {
                        if (!CorFlags.IsAnycpuOrX64(file))
                        {
                            var x32File = packageFile + " " + file.Replace(tempDir, "");
                            Console.WriteLine(x32File);
                            result = false;
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(packageFile + " " + e);
                    result = false;
                }

                try
                {
                    DirectoryInfo di = new DirectoryInfo(tempDir);
                    di.Delete(true);
                }
                catch (Exception e)
                {
                }
            }

            return(result);
        }
コード例 #19
0
        static void Main(string[] args)
        {
            string file32     = @"C:\Work\NugetCheck\x32\bin\Debug\x32.dll";
            string file64     = @"C:\Work\NugetCheck\x64\bin\Debug\x64.dll";
            string fileanycpu = @"C:\Work\NugetCheck\anycpu\bin\Debug\anycpu.dll";

            var c1 = CorFlags.IsAnycpuOrX64(file32);
            var c2 = CorFlags.IsAnycpuOrX64(file64);
            var c3 = CorFlags.IsAnycpuOrX64(fileanycpu);

            var a1 = Check.GetCharacteristics(file32);
            var a2 = Check.GetCharacteristics(file64);
            var a3 = Check.GetCharacteristics(fileanycpu);

            var b1 = Check.IsAnycpuOrX64(file32);
            var b2 = Check.IsAnycpuOrX64(file64);
            var b3 = Check.IsAnycpuOrX64(fileanycpu);

            Console.ReadKey();
        }
コード例 #20
0
        internal ModulePropertiesForSerialization(
            Guid persistentIdentifier,
            CorFlags corFlags,
            int fileAlignment,
            int sectionAlignment,
            string targetRuntimeVersion,
            Machine machine,
            ulong baseAddress,
            ulong sizeOfHeapReserve,
            ulong sizeOfHeapCommit,
            ulong sizeOfStackReserve,
            ulong sizeOfStackCommit,
            DllCharacteristics dllCharacteristics,
            Characteristics imageCharacteristics,
            Subsystem subsystem,
            ushort majorSubsystemVersion,
            ushort minorSubsystemVersion,
            byte linkerMajorVersion,
            byte linkerMinorVersion
            )
        {
            this.PersistentIdentifier = persistentIdentifier;
            this.FileAlignment        = fileAlignment;
            this.SectionAlignment     = sectionAlignment;
            this.TargetRuntimeVersion = targetRuntimeVersion;
            this.Machine               = machine;
            this.BaseAddress           = baseAddress;
            this.SizeOfHeapReserve     = sizeOfHeapReserve;
            this.SizeOfHeapCommit      = sizeOfHeapCommit;
            this.SizeOfStackReserve    = sizeOfStackReserve;
            this.SizeOfStackCommit     = sizeOfStackCommit;
            this.LinkerMajorVersion    = linkerMajorVersion;
            this.LinkerMinorVersion    = linkerMinorVersion;
            this.MajorSubsystemVersion = majorSubsystemVersion;
            this.MinorSubsystemVersion = minorSubsystemVersion;
            this.ImageCharacteristics  = imageCharacteristics;
            this.Subsystem             = subsystem;

            this.DllCharacteristics = dllCharacteristics;
            this.CorFlags           = corFlags;
        }
コード例 #21
0
ファイル: CorHeader.cs プロジェクト: retahc/old-code
        public void Read(BinaryReader reader)
        {
            // Header versioning
            cb = reader.ReadUInt32();

            runtimeMaj = reader.ReadInt16();
            runtimeMin = reader.ReadInt16();


            // Symbol table and startup information.
            meta     = new DataDir(reader);
            flags    = (CorFlags)reader.ReadUInt32();
            entryTok = reader.ReadUInt32();

            // Binding information.
            rsrc      = new DataDir(reader);
            strongSig = new DataDir(reader);

            // Regular fixup and binding information.
            codeManTab = new DataDir(reader);
            vtab       = new DataDir(reader);
            jumps      = new DataDir(reader);

            // Managed Native Code.
            eeInfo    = new DataDir(reader);
            helper    = new DataDir(reader);
            dynInfo   = new DataDir(reader);
            delayInfo = new DataDir(reader);
            modImg    = new DataDir(reader);
            extFixups = new DataDir(reader);
            ridMap    = new DataDir(reader);
            dbgMap    = new DataDir(reader);

            // obsolete?
            ipMap = new DataDir(reader);
        }
コード例 #22
0
        /// <summary>
        /// Serializes .text section data into a specified <paramref name="builder"/>.
        /// </summary>
        /// <param name="builder">An empty builder to serialize section data to.</param>
        /// <param name="relativeVirtualAddess">Relative virtual address of the section within the containing PE file.</param>
        /// <param name="entryPointTokenOrRelativeVirtualAddress">Entry point token or RVA (<see cref="CorHeader.EntryPointTokenOrRelativeVirtualAddress"/>)</param>
        /// <param name="corFlags">COR Flags (<see cref="CorHeader.Flags"/>).</param>
        /// <param name="baseAddress">Base address of the PE image.</param>
        /// <param name="metadataBuilder"><see cref="BlobBuilder"/> containing metadata. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="ilBuilder"><see cref="BlobBuilder"/> containing IL stream. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="mappedFieldDataBuilder"><see cref="BlobBuilder"/> containing mapped field data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="resourceBuilder"><see cref="BlobBuilder"/> containing managed resource data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="debugTableBuilderOpt"><see cref="BlobBuilder"/> containing debug table data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        public void Serialize(
            BlobBuilder builder,
            int relativeVirtualAddess,
            int entryPointTokenOrRelativeVirtualAddress,
            CorFlags corFlags,
            ulong baseAddress,
            BlobBuilder metadataBuilder,
            BlobBuilder ilBuilder,
            BlobBuilder mappedFieldDataBuilder,
            BlobBuilder resourceBuilder,
            BlobBuilder debugTableBuilderOpt)
        {
            Debug.Assert(builder.Count == 0);
            Debug.Assert(metadataBuilder.Count == MetadataSize);
            Debug.Assert(metadataBuilder.Count % 4 == 0);
            Debug.Assert(ilBuilder.Count == ILStreamSize);
            Debug.Assert(mappedFieldDataBuilder.Count == MappedFieldDataSize);
            Debug.Assert(resourceBuilder.Count == ResourceDataSize);
            Debug.Assert(resourceBuilder.Count % 4 == 0);

            // TODO: avoid recalculation
            int importTableRva        = GetImportTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;
            int importAddressTableRva = GetImportAddressTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;

            if (RequiresStartupStub)
            {
                WriteImportAddressTable(builder, importTableRva);
            }

            WriteCorHeader(builder, relativeVirtualAddess, entryPointTokenOrRelativeVirtualAddress, corFlags);

            // IL:
            ilBuilder.Align(4);
            builder.LinkSuffix(ilBuilder);

            // metadata:
            builder.LinkSuffix(metadataBuilder);

            // managed resources:
            builder.LinkSuffix(resourceBuilder);

            // strong name signature:
            builder.WriteBytes(0, StrongNameSignatureSize);

            if (debugTableBuilderOpt != null)
            {
                builder.LinkSuffix(debugTableBuilderOpt);
            }

            if (RequiresStartupStub)
            {
                WriteImportTable(builder, importTableRva, importAddressTableRva);
                WriteNameTable(builder);
                WriteRuntimeStartupStub(builder, importAddressTableRva, baseAddress);
            }

            // mapped field data:
            builder.LinkSuffix(mappedFieldDataBuilder);

            Debug.Assert(builder.Count == ComputeSizeOfTextSection());
        }
コード例 #23
0
        /// <summary>
        /// Serializes .text section data into a specified <paramref name="builder"/>.
        /// </summary>
        /// <param name="builder">An empty builder to serialize section data to.</param>
        /// <param name="relativeVirtualAddess">Relative virtual address of the section within the containing PE file.</param>
        /// <param name="entryPointTokenOrRelativeVirtualAddress">Entry point token or RVA (<see cref="CorHeader.EntryPointTokenOrRelativeVirtualAddress"/>)</param>
        /// <param name="corFlags">COR Flags (<see cref="CorHeader.Flags"/>).</param>
        /// <param name="baseAddress">Base address of the PE image.</param>
        /// <param name="metadataBuilder"><see cref="BlobBuilder"/> containing metadata. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="ilBuilder"><see cref="BlobBuilder"/> containing IL stream. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="mappedFieldDataBuilderOpt"><see cref="BlobBuilder"/> containing mapped field data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="resourceBuilderOpt"><see cref="BlobBuilder"/> containing managed resource data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="debugDataBuilderOpt"><see cref="BlobBuilder"/> containing PE debug table and data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="strongNameSignature">Blob reserved in the <paramref name="builder"/> for strong name signature.</param>
        public void Serialize(
            BlobBuilder builder,
            int relativeVirtualAddess,
            int entryPointTokenOrRelativeVirtualAddress,
            CorFlags corFlags,
            ulong baseAddress,
            BlobBuilder metadataBuilder,
            BlobBuilder ilBuilder,
            BlobBuilder mappedFieldDataBuilderOpt,
            BlobBuilder resourceBuilderOpt,
            BlobBuilder debugDataBuilderOpt,
            out Blob strongNameSignature)
        {
            Debug.Assert(builder.Count == 0);
            Debug.Assert(metadataBuilder.Count == MetadataSize);
            Debug.Assert(metadataBuilder.Count % 4 == 0);
            Debug.Assert(ilBuilder.Count == ILStreamSize);
            Debug.Assert((mappedFieldDataBuilderOpt?.Count ?? 0) == MappedFieldDataSize);
            Debug.Assert((resourceBuilderOpt?.Count ?? 0) == ResourceDataSize);
            Debug.Assert((resourceBuilderOpt?.Count ?? 0) % 4 == 0);

            // TODO: avoid recalculation
            int importTableRva        = GetImportTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;
            int importAddressTableRva = GetImportAddressTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;

            if (RequiresStartupStub)
            {
                WriteImportAddressTable(builder, importTableRva);
            }

            WriteCorHeader(builder, relativeVirtualAddess, entryPointTokenOrRelativeVirtualAddress, corFlags);

            // IL:
            ilBuilder.Align(4);
            builder.LinkSuffix(ilBuilder);

            // metadata:
            builder.LinkSuffix(metadataBuilder);

            // managed resources:
            if (resourceBuilderOpt != null)
            {
                builder.LinkSuffix(resourceBuilderOpt);
            }

            // strong name signature:
            strongNameSignature = builder.ReserveBytes(StrongNameSignatureSize);

            // The bytes are required to be 0 for the purpose of calculating hash of the PE content
            // when strong name signing.
            new BlobWriter(strongNameSignature).WriteBytes(0, StrongNameSignatureSize);

            // debug directory and data:
            if (debugDataBuilderOpt != null)
            {
                builder.LinkSuffix(debugDataBuilderOpt);
            }

            if (RequiresStartupStub)
            {
                WriteImportTable(builder, importTableRva, importAddressTableRva);
                WriteNameTable(builder);
                WriteRuntimeStartupStub(builder, importAddressTableRva, baseAddress);
            }

            // mapped field data:
            if (mappedFieldDataBuilderOpt != null)
            {
                builder.LinkSuffix(mappedFieldDataBuilderOpt);
            }

            Debug.Assert(builder.Count == ComputeSizeOfTextSection());
        }
コード例 #24
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);
        }
コード例 #25
0
ファイル: CorHeader.cs プロジェクト: emtees/old-code
		public void Read(BinaryReader reader)
		{
			// Header versioning
			cb = reader.ReadUInt32 ();
			
			runtimeMaj = reader.ReadInt16 ();
			runtimeMin = reader.ReadInt16 ();
	
			
			// Symbol table and startup information.
			meta = new DataDir (reader);
			flags = (CorFlags) reader.ReadUInt32 ();
			entryTok = reader.ReadUInt32 ();

			// Binding information.
			rsrc  = new DataDir (reader);
			strongSig = new DataDir (reader);
		
			// Regular fixup and binding information.
			codeManTab = new DataDir (reader);
			vtab = new DataDir (reader);
			jumps = new DataDir (reader);

			// Managed Native Code.
			eeInfo = new DataDir (reader);
			helper = new DataDir (reader);
			dynInfo = new DataDir (reader);
			delayInfo = new DataDir (reader);
			modImg = new DataDir (reader);
			extFixups = new DataDir (reader);
			ridMap = new DataDir (reader);
			dbgMap = new DataDir (reader);

			// obsolete?
			ipMap = new DataDir (reader);
		}
コード例 #26
0
        public static void AddManagedSections(
            this PEBuilder peBuilder,
            PEDirectoriesBuilder peDirectoriesBuilder,
            TypeSystemMetadataSerializer metadataSerializer,
            BlobBuilder ilStream,
            BlobBuilder mappedFieldData,
            BlobBuilder managedResourceData,
            Action <BlobBuilder, PESectionLocation> nativeResourceSectionSerializer, // opt
            int strongNameSignatureSize,                                             // TODO
            MethodDefinitionHandle entryPoint,
            string pdbPathOpt,                                                       // TODO
            ContentId nativePdbContentId,                                            // TODO
            ContentId portablePdbContentId,                                          // TODO
            CorFlags corFlags)
        {
            int entryPointAddress = 0;

            // .text
            peBuilder.AddSection(".text", SectionCharacteristics.MemRead | SectionCharacteristics.MemExecute | SectionCharacteristics.ContainsCode, location =>
            {
                var sectionBuilder  = new BlobBuilder();
                var metadataBuilder = new BlobBuilder();

                var metadataSizes = metadataSerializer.MetadataSizes;

                var textSection = new ManagedTextSection(
                    metadataSizes.MetadataSize,
                    ilStreamSize: ilStream.Count,
                    mappedFieldDataSize: mappedFieldData.Count,
                    resourceDataSize: managedResourceData.Count,
                    strongNameSignatureSize: strongNameSignatureSize,
                    imageCharacteristics: peBuilder.ImageCharacteristics,
                    machine: peBuilder.Machine,
                    pdbPathOpt: pdbPathOpt,
                    isDeterministic: peBuilder.IsDeterministic);

                int methodBodyStreamRva      = location.RelativeVirtualAddress + textSection.OffsetToILStream;
                int mappedFieldDataStreamRva = location.RelativeVirtualAddress + textSection.CalculateOffsetToMappedFieldDataStream();
                metadataSerializer.SerializeMetadata(metadataBuilder, methodBodyStreamRva, mappedFieldDataStreamRva);

                BlobBuilder debugTableBuilderOpt;
                if (pdbPathOpt != null || peBuilder.IsDeterministic)
                {
                    debugTableBuilderOpt = new BlobBuilder();
                    textSection.WriteDebugTable(debugTableBuilderOpt, location, nativePdbContentId, portablePdbContentId);
                }
                else
                {
                    debugTableBuilderOpt = null;
                }

                entryPointAddress = textSection.GetEntryPointAddress(location.RelativeVirtualAddress);

                textSection.Serialize(
                    sectionBuilder,
                    location.RelativeVirtualAddress,
                    entryPoint.IsNil ? 0 : MetadataTokens.GetToken(entryPoint),
                    corFlags,
                    peBuilder.ImageBase,
                    metadataBuilder,
                    ilStream,
                    mappedFieldData,
                    managedResourceData,
                    debugTableBuilderOpt);

                peDirectoriesBuilder.AddressOfEntryPoint = entryPointAddress;
                peDirectoriesBuilder.DebugTable          = textSection.GetDebugDirectoryEntry(location.RelativeVirtualAddress);
                peDirectoriesBuilder.ImportAddressTable  = textSection.GetImportAddressTableDirectoryEntry(location.RelativeVirtualAddress);
                peDirectoriesBuilder.ImportTable         = textSection.GetImportTableDirectoryEntry(location.RelativeVirtualAddress);
                peDirectoriesBuilder.CorHeaderTable      = textSection.GetCorHeaderDirectoryEntry(location.RelativeVirtualAddress);

                return(sectionBuilder);
            });

            // .rsrc
            if (nativeResourceSectionSerializer != null)
            {
                peBuilder.AddSection(".rsrc", SectionCharacteristics.MemRead | SectionCharacteristics.ContainsInitializedData, location =>
                {
                    var sectionBuilder = new BlobBuilder();
                    nativeResourceSectionSerializer(sectionBuilder, location);
                    peDirectoriesBuilder.ResourceTable = new DirectoryEntry(location.RelativeVirtualAddress, sectionBuilder.Count);
                    return(sectionBuilder);
                });
            }

            // .reloc
            if (peBuilder.Machine == Machine.I386 || peBuilder.Machine == 0)
            {
                peBuilder.AddSection(".reloc", SectionCharacteristics.MemRead | SectionCharacteristics.MemDiscardable | SectionCharacteristics.ContainsInitializedData, location =>
                {
                    var sectionBuilder = new BlobBuilder();
                    WriteRelocSection(sectionBuilder, peBuilder.Machine, entryPointAddress);

                    peDirectoriesBuilder.BaseRelocationTable = new DirectoryEntry(location.RelativeVirtualAddress, sectionBuilder.Count);
                    return(sectionBuilder);
                });
            }
        }
コード例 #27
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 /// <summary>
 /// Set the flags (.corflags)
 /// </summary>
 /// <param name="flags">the flags value</param>
 public void SetCorFlags(CorFlags flags)
 {
     versionInfo.corFlags = flags;
 }
コード例 #28
0
ファイル: AssemblyReader.cs プロジェクト: JohanLarsson/nunit
        private void CalcHeaderOffsets()
        {
            this.fs = new FileStream( assemblyPath, FileMode.Open, FileAccess.Read );
            this.rdr = new BinaryReader( fs );
            dos_magic = rdr.ReadUInt16();
            if ( dos_magic == 0x5a4d )
            {
                fs.Position = 0x3c;
                peHeader = rdr.ReadUInt32();
                fileHeader = peHeader + 4;
                optionalHeader = fileHeader + 20;

                fs.Position = optionalHeader;
                peType = (PEType)rdr.ReadUInt16();

                dataDirectory = peType == PEType.PE32Plus
                    ? optionalHeader + 112
                    : optionalHeader + 96;

                fs.Position = dataDirectory - 4;
                numDataDirectoryEntries = rdr.ReadUInt32();

                fs.Position = peHeader;
                pe_signature = rdr.ReadUInt32();
                rdr.ReadUInt16(); // machine
                numberOfSections = rdr.ReadUInt16();
                fs.Position += 12;
                optionalHeaderSize = rdr.ReadUInt16();
                dataSections = optionalHeader + optionalHeaderSize;

                sections = new DataSection[numberOfSections];
                fs.Position = dataSections;
                for( int i = 0; i < numberOfSections; i++ )
                {
                    fs.Position += 8;
                    sections[i].VirtualSize = rdr.ReadUInt32();
                    sections[i].VirtualAddress = rdr.ReadUInt32();
                    uint rawDataSize = rdr.ReadUInt32();
                    sections[i].FileOffset = rdr.ReadUInt32();
                    if ( sections[i].VirtualSize == 0 )
                        sections[i].VirtualSize = rawDataSize;

                    fs.Position += 16;
                }

                if (IsDotNetFile)
                {
                    uint rva = DataDirectoryRva(14);
                    if (rva != 0)
                    {
                        fs.Position = RvaToLfa(rva) + 8;
                        uint metadata = rdr.ReadUInt32();
                        fs.Position = RvaToLfa(metadata);
                        if (rdr.ReadUInt32() == 0x424a5342)
                        {
                            // Copy string representing runtime version
                            fs.Position += 12;
                            StringBuilder sb = new StringBuilder();
                            char c;
                            while ((c = rdr.ReadChar()) != '\0')
                                sb.Append(c);

                            if (sb[0] == 'v') // Last sanity check
                                ImageRuntimeVersion = sb.ToString();

                            // Could do fixups here for bad values in older files
                            // like 1.x86, 1.build, etc. But we are only using
                            // the major version anyway

                            // Jump back and find the CorFlags
                            fs.Position = RvaToLfa(rva) + 16;
                            corFlags = (CorFlags)rdr.ReadUInt32();
                        }
                    }
                }
            }
        }
コード例 #29
0
ファイル: ManagedTextSection.cs プロジェクト: nbilling/corefx
        private void WriteCorHeader(BlobBuilder builder, int textSectionRva, int entryPointTokenOrRva, CorFlags corFlags)
        {
            const ushort majorRuntimeVersion = 2;
            const ushort minorRuntimeVersion = 5;

            int metadataRva = textSectionRva + ComputeOffsetToMetadata();
            int resourcesRva = metadataRva + MetadataSize;
            int signatureRva = resourcesRva + ResourceDataSize;

            int start = builder.Count;

            // Size:
            builder.WriteUInt32(CorHeaderSize);

            // Version:
            builder.WriteUInt16(majorRuntimeVersion);
            builder.WriteUInt16(minorRuntimeVersion);

            // MetadataDirectory:
            builder.WriteUInt32((uint)metadataRva);
            builder.WriteUInt32((uint)MetadataSize);

            // COR Flags:
            builder.WriteUInt32((uint)corFlags);

            // EntryPoint:
            builder.WriteUInt32((uint)entryPointTokenOrRva);

            // ResourcesDirectory:
            builder.WriteUInt32((uint)(ResourceDataSize == 0 ? 0 : resourcesRva)); // 28
            builder.WriteUInt32((uint)ResourceDataSize);

            // StrongNameSignatureDirectory:
            builder.WriteUInt32((uint)(StrongNameSignatureSize == 0 ? 0 : signatureRva)); // 36
            builder.WriteUInt32((uint)StrongNameSignatureSize);

            // CodeManagerTableDirectory (not supported):
            builder.WriteUInt32(0);
            builder.WriteUInt32(0);

            // VtableFixupsDirectory (not supported):
            builder.WriteUInt32(0);
            builder.WriteUInt32(0);

            // ExportAddressTableJumpsDirectory (not supported):
            builder.WriteUInt32(0);
            builder.WriteUInt32(0);

            // ManagedNativeHeaderDirectory (not supported):
            builder.WriteUInt32(0);
            builder.WriteUInt32(0);

            Debug.Assert(builder.Count - start == CorHeaderSize);
            Debug.Assert(builder.Count % 4 == 0);
        }
コード例 #30
0
ファイル: ManagedTextSection.cs プロジェクト: nbilling/corefx
        /// <summary>
        /// Serializes .text section data into a specified <paramref name="builder"/>.
        /// </summary>
        /// <param name="builder">An empty builder to serialize section data to.</param>
        /// <param name="relativeVirtualAddess">Relative virtual address of the section within the containing PE file.</param>
        /// <param name="entryPointTokenOrRelativeVirtualAddress">Entry point token or RVA (<see cref="CorHeader.EntryPointTokenOrRelativeVirtualAddress"/>)</param>
        /// <param name="corFlags">COR Flags (<see cref="CorHeader.Flags"/>).</param>
        /// <param name="baseAddress">Base address of the PE image.</param>
        /// <param name="metadataBuilder"><see cref="BlobBuilder"/> containing metadata. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="ilBuilder"><see cref="BlobBuilder"/> containing IL stream. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="mappedFieldDataBuilder"><see cref="BlobBuilder"/> containing mapped field data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="resourceBuilder"><see cref="BlobBuilder"/> containing managed resource data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="debugTableBuilderOpt"><see cref="BlobBuilder"/> containing debug table data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        public void Serialize(
            BlobBuilder builder,
            int relativeVirtualAddess,
            int entryPointTokenOrRelativeVirtualAddress,
            CorFlags corFlags,
            ulong baseAddress,
            BlobBuilder metadataBuilder,
            BlobBuilder ilBuilder,
            BlobBuilder mappedFieldDataBuilder,
            BlobBuilder resourceBuilder,
            BlobBuilder debugTableBuilderOpt)
        {
            Debug.Assert(builder.Count == 0);
            Debug.Assert(metadataBuilder.Count == MetadataSize);
            Debug.Assert(metadataBuilder.Count % 4 == 0);
            Debug.Assert(ilBuilder.Count == ILStreamSize);
            Debug.Assert(mappedFieldDataBuilder.Count == MappedFieldDataSize);
            Debug.Assert(resourceBuilder.Count == ResourceDataSize);
            Debug.Assert(resourceBuilder.Count % 4 == 0);

            // TODO: avoid recalculation
            int importTableRva = GetImportTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;
            int importAddressTableRva = GetImportAddressTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;

            if (RequiresStartupStub)
            {
                WriteImportAddressTable(builder, importTableRva);
            }

            WriteCorHeader(builder, relativeVirtualAddess, entryPointTokenOrRelativeVirtualAddress, corFlags);

            // IL:
            ilBuilder.Align(4);
            builder.LinkSuffix(ilBuilder);

            // metadata:
            builder.LinkSuffix(metadataBuilder);

            // managed resources:
            builder.LinkSuffix(resourceBuilder);

            // strong name signature:
            builder.WriteBytes(0, StrongNameSignatureSize);

            if (debugTableBuilderOpt != null)
            {
                builder.LinkSuffix(debugTableBuilderOpt);
            }

            if (RequiresStartupStub)
            {
                WriteImportTable(builder, importTableRva, importAddressTableRva);
                WriteNameTable(builder);
                WriteRuntimeStartupStub(builder, importAddressTableRva, baseAddress);
            }

            // mapped field data:            
            builder.LinkSuffix(mappedFieldDataBuilder);

            Debug.Assert(builder.Count == ComputeSizeOfTextSection());
        }
コード例 #31
0
        /// <summary>
        /// Read the PE file
        /// </summary>
        /// <param name="stream">PE file stream to read from.</param>
        /// <returns>null if the PE file was not valid.
        ///          an instance of the CorFlagsReader class containing the requested data.</returns>
        public static CorFlagsReader ReadAssemblyMetadata(Stream stream)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }

            long length = stream.Length;

            if (length < 0x40)
            {
                return(null);
            }

            BinaryReader reader = new BinaryReader(stream);

            // Read the pointer to the PE header.
            stream.Position = 0x3c;
            uint peHeaderPtr = reader.ReadUInt32();

            if (peHeaderPtr == 0)
            {
                peHeaderPtr = 0x80;
            }

            // Ensure there is at least enough room for the following structures:
            //     24 byte PE Signature & Header
            //     28 byte Standard Fields         (24 bytes for PE32+)
            //     68 byte NT Fields               (88 bytes for PE32+)
            // >= 128 byte Data Dictionary Table
            if (peHeaderPtr > length - 256)
            {
                return(null);
            }

            // Check the PE signature.  Should equal 'PE\0\0'.
            stream.Position = peHeaderPtr;
            uint peSignature = reader.ReadUInt32();

            if (peSignature != 0x00004550)
            {
                return(null);
            }

            // Read PE header fields.
            ushort machine            = reader.ReadUInt16();
            ushort numberOfSections   = reader.ReadUInt16();
            uint   timeStamp          = reader.ReadUInt32();
            uint   symbolTablePtr     = reader.ReadUInt32();
            uint   numberOfSymbols    = reader.ReadUInt32();
            ushort optionalHeaderSize = reader.ReadUInt16();
            ushort characteristics    = reader.ReadUInt16();

            // Read PE magic number from Standard Fields to determine format.
            PEFormat peFormat = (PEFormat)reader.ReadUInt16();

            if (peFormat != PEFormat.PE32 && peFormat != PEFormat.PE32Plus)
            {
                return(null);
            }

            // Read the 15th Data Dictionary RVA field which contains the CLI header RVA.
            // When this is non-zero then the file contains CLI data otherwise not.
            stream.Position = peHeaderPtr + (peFormat == PEFormat.PE32 ? 232 : 248);
            uint cliHeaderRva = reader.ReadUInt32();

            if (cliHeaderRva == 0)
            {
                return(new CorFlagsReader(0, 0, 0, peFormat));
            }

            // Read section headers.  Each one is 40 bytes.
            //    8 byte Name
            //    4 byte Virtual Size
            //    4 byte Virtual Address
            //    4 byte Data Size
            //    4 byte Data Pointer
            //  ... total of 40 bytes
            uint sectionTablePtr = peHeaderPtr + 24 + optionalHeaderSize;

            Section[] sections = new Section[numberOfSections];
            for (int i = 0; i < numberOfSections; i++)
            {
                stream.Position = sectionTablePtr + i * 40 + 8;

                Section section = new Section();
                section.VirtualSize    = reader.ReadUInt32();
                section.VirtualAddress = reader.ReadUInt32();
                reader.ReadUInt32();
                section.Pointer = reader.ReadUInt32();

                sections[i] = section;
            }

            // Read parts of the CLI header.
            uint cliHeaderPtr = ResolveRva(sections, cliHeaderRva);

            if (cliHeaderPtr == 0)
            {
                return(null);
            }

            stream.Position = cliHeaderPtr + 4;
            ushort   majorRuntimeVersion = reader.ReadUInt16();
            ushort   minorRuntimeVersion = reader.ReadUInt16();
            uint     metadataRva         = reader.ReadUInt32();
            uint     metadataSize        = reader.ReadUInt32();
            CorFlags corflags            = (CorFlags)reader.ReadUInt32();

            // Done.
            return(new CorFlagsReader(majorRuntimeVersion, minorRuntimeVersion, corflags, peFormat));
        }
コード例 #32
0
ファイル: AssemblyMetadata.cs プロジェクト: soelske/mbunit-v3
        internal static AssemblyMetadata ReadAssemblyMetadata(Stream stream, AssemblyMetadataFields fields)
        {
            long length = stream.Length;

            if (length < 0x40)
            {
                return(null);
            }

            BinaryReader reader = new BinaryReader(stream);

            // Read the pointer to the PE header.
            stream.Position = 0x3c;
            uint peHeaderPtr = reader.ReadUInt32();

            if (peHeaderPtr == 0)
            {
                peHeaderPtr = 0x80;
            }

            // Ensure there is at least enough room for the following structures:
            //     24 byte PE Signature & Header
            //     28 byte Standard Fields         (24 bytes for PE32+)
            //     68 byte NT Fields               (88 bytes for PE32+)
            // >= 128 byte Data Dictionary Table
            if (peHeaderPtr > length - 256)
            {
                return(null);
            }

            // Check the PE signature.  Should equal 'PE\0\0'.
            stream.Position = peHeaderPtr;
            uint peSignature = reader.ReadUInt32();

            if (peSignature != 0x00004550)
            {
                return(null);
            }

            // Read PE header fields.
            ushort machine            = reader.ReadUInt16();
            ushort numberOfSections   = reader.ReadUInt16();
            uint   timeStamp          = reader.ReadUInt32();
            uint   symbolTablePtr     = reader.ReadUInt32();
            uint   numberOfSymbols    = reader.ReadUInt32();
            ushort optionalHeaderSize = reader.ReadUInt16();
            ushort characteristics    = reader.ReadUInt16();

            // Read PE magic number from Standard Fields to determine format.
            PEFormat peFormat = (PEFormat)reader.ReadUInt16();

            if (peFormat != PEFormat.PE32 && peFormat != PEFormat.PE32Plus)
            {
                return(null);
            }

            // Read the 15th Data Dictionary RVA field which contains the CLI header RVA.
            // When this is non-zero then the file contains CLI data otherwise not.
            stream.Position = peHeaderPtr + (peFormat == PEFormat.PE32 ? 232 : 248);
            uint cliHeaderRva = reader.ReadUInt32();

            if (cliHeaderRva == 0)
            {
                return(null);
            }

            // Read section headers.  Each one is 40 bytes.
            //    8 byte Name
            //    4 byte Virtual Size
            //    4 byte Virtual Address
            //    4 byte Data Size
            //    4 byte Data Pointer
            //  ... total of 40 bytes
            uint sectionTablePtr = peHeaderPtr + 24 + optionalHeaderSize;

            Section[] sections = new Section[numberOfSections];
            for (int i = 0; i < numberOfSections; i++)
            {
                stream.Position = sectionTablePtr + i * 40 + 8;

                Section section = new Section();
                section.VirtualSize    = reader.ReadUInt32();
                section.VirtualAddress = reader.ReadUInt32();
                reader.ReadUInt32();
                section.Pointer = reader.ReadUInt32();

                sections[i] = section;
            }

            // Read parts of the CLI header.
            uint cliHeaderPtr = ResolveRva(sections, cliHeaderRva);

            if (cliHeaderPtr == 0)
            {
                return(null);
            }

            stream.Position = cliHeaderPtr + 4;
            ushort   majorRuntimeVersion = reader.ReadUInt16();
            ushort   minorRuntimeVersion = reader.ReadUInt16();
            uint     metadataRva         = reader.ReadUInt32();
            uint     metadataSize        = reader.ReadUInt32();
            CorFlags corflags            = (CorFlags)reader.ReadUInt32();

            // Read optional fields.
            AssemblyName         assemblyName       = null;
            IList <AssemblyName> assemblyReferences = null;
            string runtimeVersion = null;

            if ((fields & AssemblyMetadataFields.RuntimeVersion) != 0)
            {
                uint metadataPtr = ResolveRva(sections, metadataRva);
                stream.Position = metadataPtr + 12;

                int    paddedRuntimeVersionLength = reader.ReadInt32();
                byte[] runtimeVersionBytes        = reader.ReadBytes(paddedRuntimeVersionLength);

                int runtimeVersionLength = 0;
                while (runtimeVersionLength < paddedRuntimeVersionLength &&
                       runtimeVersionBytes[runtimeVersionLength] != 0)
                {
                    runtimeVersionLength += 1;
                }

                runtimeVersion = Encoding.UTF8.GetString(runtimeVersionBytes, 0, runtimeVersionLength);
            }

            if ((fields & (AssemblyMetadataFields.AssemblyName | AssemblyMetadataFields.AssemblyReferences)) != 0)
            {
                // Using Cecil.
                stream.Position = 0;
                var imageReader = new ImageReader(stream);

                if ((fields & AssemblyMetadataFields.AssemblyName) != 0)
                {
                    assemblyName = imageReader.GetAssemblyName();
                }

                if ((fields & AssemblyMetadataFields.AssemblyReferences) != 0)
                {
                    assemblyReferences = imageReader.GetAssemblyReferences();
                }
            }

            // Done.
            return(new AssemblyMetadata(majorRuntimeVersion, minorRuntimeVersion, corflags, peFormat,
                                        assemblyName, assemblyReferences, runtimeVersion));
        }
コード例 #33
0
 /// <summary>
 /// Set the flags (.corflags)
 /// </summary>
 /// <param name="flags">the flags value</param>
 public void SetCorFlags(CorFlags flags)
 {
     versionInfo.corFlags = flags;
 }
コード例 #34
0
ファイル: PERWAPI.cs プロジェクト: nomit007/f4
 internal void SetDefaults(string name)
 {
     fromExisting = false;
     isDLL = name.EndsWith(".dll") || name.EndsWith(".DLL");
     if (isDLL) {
         characteristics = FileImage.dllCharacteristics;
     } else {
         characteristics = FileImage.exeCharacteristics;
     }
     lMajor = MetaData.LMajors[0];
     lMinor = 0;
     fileAlign = FileImage.minFileAlign;
     osMajor = 4;
     osMinor = 0;
     userMajor = 0;
     userMinor = 0;
     subSysMajor = 4;
     subSysMinor = 0;
     subSystem = SubSystem.Windows_CUI;
     DLLFlags = FileImage.DLLFlags;
     cliMajVer = 2;
     cliMinVer = 0;
     corFlags = CorFlags.CF_IL_ONLY ;
     mdMajVer = 1;
     mdMinVer = 1; // MetaData Minor Version  ECMA = 0, PEFiles = 1
     netVersion = NetVersion.Everett;
     netVerString = MetaData.versions[0];
     tsMajVer = 1;
     tsMinVer = 0;
 }
コード例 #35
0
        private void WriteCorHeader(BlobBuilder builder, int textSectionRva, int entryPointTokenOrRva, CorFlags corFlags)
        {
            const ushort majorRuntimeVersion = 2;
            const ushort minorRuntimeVersion = 5;

            int metadataRva  = textSectionRva + ComputeOffsetToMetadata();
            int resourcesRva = metadataRva + MetadataSize;
            int signatureRva = resourcesRva + ResourceDataSize;

            int start = builder.Count;

            // Size:
            builder.WriteUInt32(CorHeaderSize);

            // Version:
            builder.WriteUInt16(majorRuntimeVersion);
            builder.WriteUInt16(minorRuntimeVersion);

            // MetadataDirectory:
            builder.WriteUInt32((uint)metadataRva);
            builder.WriteUInt32((uint)MetadataSize);

            // COR Flags:
            builder.WriteUInt32((uint)corFlags);

            // EntryPoint:
            builder.WriteUInt32((uint)entryPointTokenOrRva);

            // ResourcesDirectory:
            builder.WriteUInt32((uint)(ResourceDataSize == 0 ? 0 : resourcesRva)); // 28
            builder.WriteUInt32((uint)ResourceDataSize);

            // StrongNameSignatureDirectory:
            builder.WriteUInt32((uint)(StrongNameSignatureSize == 0 ? 0 : signatureRva)); // 36
            builder.WriteUInt32((uint)StrongNameSignatureSize);

            // CodeManagerTableDirectory (not supported):
            builder.WriteUInt32(0);
            builder.WriteUInt32(0);

            // VtableFixupsDirectory (not supported):
            builder.WriteUInt32(0);
            builder.WriteUInt32(0);

            // ExportAddressTableJumpsDirectory (not supported):
            builder.WriteUInt32(0);
            builder.WriteUInt32(0);

            // ManagedNativeHeaderDirectory (not supported):
            builder.WriteUInt32(0);
            builder.WriteUInt32(0);

            Debug.Assert(builder.Count - start == CorHeaderSize);
            Debug.Assert(builder.Count % 4 == 0);
        }
コード例 #36
0
        /// <summary>
        /// Serializes .text section data into a specified <paramref name="builder"/>.
        /// </summary>
        /// <param name="builder">An empty builder to serialize section data to.</param>
        /// <param name="relativeVirtualAddess">Relative virtual address of the section within the containing PE file.</param>
        /// <param name="entryPointTokenOrRelativeVirtualAddress">Entry point token or RVA (<see cref="CorHeader.EntryPointTokenOrRelativeVirtualAddress"/>)</param>
        /// <param name="corFlags">COR Flags (<see cref="CorHeader.Flags"/>).</param>
        /// <param name="baseAddress">Base address of the PE image.</param>
        /// <param name="metadataBuilder"><see cref="BlobBuilder"/> containing metadata. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="ilBuilder"><see cref="BlobBuilder"/> containing IL stream. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="mappedFieldDataBuilderOpt"><see cref="BlobBuilder"/> containing mapped field data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="resourceBuilderOpt"><see cref="BlobBuilder"/> containing managed resource data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="debugDataBuilderOpt"><see cref="BlobBuilder"/> containing PE debug table and data. Must be populated with data. Linked into the <paramref name="builder"/> and can't be expanded afterwards.</param>
        /// <param name="strongNameSignature">Blob reserved in the <paramref name="builder"/> for strong name signature.</param>
        public void Serialize(
            BlobBuilder builder,
            int relativeVirtualAddess,
            int entryPointTokenOrRelativeVirtualAddress,
            CorFlags corFlags,
            ulong baseAddress,
            BlobBuilder metadataBuilder,
            BlobBuilder ilBuilder,
            BlobBuilder mappedFieldDataBuilderOpt,
            BlobBuilder resourceBuilderOpt,
            BlobBuilder debugDataBuilderOpt,
            out Blob strongNameSignature)
        {
            Debug.Assert(builder.Count == 0);
            Debug.Assert(metadataBuilder.Count == MetadataSize);
            Debug.Assert(metadataBuilder.Count % 4 == 0);
            Debug.Assert(ilBuilder.Count == ILStreamSize);
            Debug.Assert((mappedFieldDataBuilderOpt?.Count ?? 0) == MappedFieldDataSize);
            Debug.Assert((resourceBuilderOpt?.Count ?? 0) == ResourceDataSize);
            Debug.Assert((resourceBuilderOpt?.Count ?? 0) % 4 == 0);

            // TODO: avoid recalculation
            int importTableRva = GetImportTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;
            int importAddressTableRva = GetImportAddressTableDirectoryEntry(relativeVirtualAddess).RelativeVirtualAddress;

            if (RequiresStartupStub)
            {
                WriteImportAddressTable(builder, importTableRva);
            }

            WriteCorHeader(builder, relativeVirtualAddess, entryPointTokenOrRelativeVirtualAddress, corFlags);

            // IL:
            ilBuilder.Align(4);
            builder.LinkSuffix(ilBuilder);

            // metadata:
            builder.LinkSuffix(metadataBuilder);

            // managed resources:
            if (resourceBuilderOpt != null)
            {
                builder.LinkSuffix(resourceBuilderOpt);
            }

            // strong name signature:
            strongNameSignature = builder.ReserveBytes(StrongNameSignatureSize);

            // The bytes are required to be 0 for the purpose of calculating hash of the PE content
            // when strong name signing.
            new BlobWriter(strongNameSignature).WriteBytes(0, StrongNameSignatureSize);

            // debug directory and data:
            if (debugDataBuilderOpt != null)
            {
                builder.LinkSuffix(debugDataBuilderOpt);
            }

            if (RequiresStartupStub)
            {
                WriteImportTable(builder, importTableRva, importAddressTableRva);
                WriteNameTable(builder);
                WriteRuntimeStartupStub(builder, importAddressTableRva, baseAddress);
            }

            // mapped field data:
            if (mappedFieldDataBuilderOpt != null)
            {
                builder.LinkSuffix(mappedFieldDataBuilderOpt);
            }

            Debug.Assert(builder.Count == ComputeSizeOfTextSection());
        }
コード例 #37
0
ファイル: ManagedPEBuilder.cs プロジェクト: Rookieek/roslyn
        public static void AddManagedSections(
            this PEBuilder peBuilder,
            PEDirectoriesBuilder peDirectoriesBuilder,
            TypeSystemMetadataSerializer metadataSerializer,
            BlobBuilder ilStream,
            BlobBuilder mappedFieldData,
            BlobBuilder managedResourceData,
            Action<BlobBuilder, PESectionLocation> nativeResourceSectionSerializer, // opt
            int strongNameSignatureSize, // TODO
            MethodDefinitionHandle entryPoint,
            string pdbPathOpt, // TODO
            ContentId nativePdbContentId, // TODO
            ContentId portablePdbContentId, // TODO
            CorFlags corFlags)
        {
            int entryPointAddress = 0;

            // .text
            peBuilder.AddSection(".text", SectionCharacteristics.MemRead | SectionCharacteristics.MemExecute | SectionCharacteristics.ContainsCode, location =>
            {
                var sectionBuilder = new BlobBuilder();
                var metadataBuilder = new BlobBuilder();

                var metadataSizes = metadataSerializer.MetadataSizes;

                var textSection = new ManagedTextSection(
                    metadataSizes.MetadataSize,
                    ilStreamSize: ilStream.Count,
                    mappedFieldDataSize: mappedFieldData.Count,
                    resourceDataSize: managedResourceData.Count,
                    strongNameSignatureSize: strongNameSignatureSize,
                    imageCharacteristics: peBuilder.ImageCharacteristics,
                    machine: peBuilder.Machine,
                    pdbPathOpt: pdbPathOpt,
                    isDeterministic: peBuilder.IsDeterministic);

                int methodBodyStreamRva = location.RelativeVirtualAddress + textSection.OffsetToILStream;
                int mappedFieldDataStreamRva = location.RelativeVirtualAddress + textSection.CalculateOffsetToMappedFieldDataStream();
                metadataSerializer.SerializeMetadata(metadataBuilder, methodBodyStreamRva, mappedFieldDataStreamRva);

                BlobBuilder debugTableBuilderOpt;
                if (pdbPathOpt != null || peBuilder.IsDeterministic)
                {
                    debugTableBuilderOpt = new BlobBuilder();
                    textSection.WriteDebugTable(debugTableBuilderOpt, location, nativePdbContentId, portablePdbContentId);
                }
                else
                {
                    debugTableBuilderOpt = null;
                }

                entryPointAddress = textSection.GetEntryPointAddress(location.RelativeVirtualAddress);

                textSection.Serialize(
                    sectionBuilder,
                    location.RelativeVirtualAddress,
                    entryPoint.IsNil ? 0 : MetadataTokens.GetToken(entryPoint),
                    corFlags,
                    peBuilder.ImageBase,
                    metadataBuilder,
                    ilStream,
                    mappedFieldData,
                    managedResourceData,
                    debugTableBuilderOpt);

                peDirectoriesBuilder.AddressOfEntryPoint = entryPointAddress;
                peDirectoriesBuilder.DebugTable = textSection.GetDebugDirectoryEntry(location.RelativeVirtualAddress);
                peDirectoriesBuilder.ImportAddressTable = textSection.GetImportAddressTableDirectoryEntry(location.RelativeVirtualAddress);
                peDirectoriesBuilder.ImportTable = textSection.GetImportTableDirectoryEntry(location.RelativeVirtualAddress);
                peDirectoriesBuilder.CorHeaderTable = textSection.GetCorHeaderDirectoryEntry(location.RelativeVirtualAddress);

                return sectionBuilder;
            });

            // .rsrc
            if (nativeResourceSectionSerializer != null)
            {
                peBuilder.AddSection(".rsrc", SectionCharacteristics.MemRead | SectionCharacteristics.ContainsInitializedData, location => 
                {
                    var sectionBuilder = new BlobBuilder();
                    nativeResourceSectionSerializer(sectionBuilder, location);
                    peDirectoriesBuilder.ResourceTable = new DirectoryEntry(location.RelativeVirtualAddress, sectionBuilder.Count);
                    return sectionBuilder;
                });
            }

            // .reloc
            if (peBuilder.Machine == Machine.I386 || peBuilder.Machine == 0)
            {
                peBuilder.AddSection(".reloc", SectionCharacteristics.MemRead | SectionCharacteristics.MemDiscardable | SectionCharacteristics.ContainsInitializedData, location =>
                {
                    var sectionBuilder = new BlobBuilder();
                    WriteRelocSection(sectionBuilder, peBuilder.Machine, entryPointAddress);

                    peDirectoriesBuilder.BaseRelocationTable = new DirectoryEntry(location.RelativeVirtualAddress, sectionBuilder.Count);
                    return sectionBuilder;
                });
            }
        }
コード例 #38
0
        internal ModulePropertiesForSerialization(
            Guid persistentIdentifier,
            CorFlags corFlags,
            int fileAlignment,
            int sectionAlignment,
            string targetRuntimeVersion,
            Machine machine,
            ulong baseAddress,
            ulong sizeOfHeapReserve,
            ulong sizeOfHeapCommit,
            ulong sizeOfStackReserve,
            ulong sizeOfStackCommit,
            DllCharacteristics dllCharacteristics,
            Characteristics imageCharacteristics,
            Subsystem subsystem,
            ushort majorSubsystemVersion,
            ushort minorSubsystemVersion,
            byte linkerMajorVersion,
            byte linkerMinorVersion)
        {
            this.PersistentIdentifier = persistentIdentifier;
            this.FileAlignment = fileAlignment;
            this.SectionAlignment = sectionAlignment;
            this.TargetRuntimeVersion = targetRuntimeVersion;
            this.Machine = machine;
            this.BaseAddress = baseAddress;
            this.SizeOfHeapReserve = sizeOfHeapReserve;
            this.SizeOfHeapCommit = sizeOfHeapCommit;
            this.SizeOfStackReserve = sizeOfStackReserve;
            this.SizeOfStackCommit = sizeOfStackCommit;
            this.LinkerMajorVersion = linkerMajorVersion;
            this.LinkerMinorVersion = linkerMinorVersion;
            this.MajorSubsystemVersion = majorSubsystemVersion;
            this.MinorSubsystemVersion = minorSubsystemVersion;
            this.ImageCharacteristics = imageCharacteristics;
            this.Subsystem = subsystem;

            this.DllCharacteristics = dllCharacteristics;
            this.CorFlags = corFlags;
        }
コード例 #39
0
        private void CalcHeaderOffsets()
        {
            this.fs   = new FileStream(assemblyPath, FileMode.Open, FileAccess.Read);
            this.rdr  = new BinaryReader(fs);
            dos_magic = rdr.ReadUInt16();
            if (dos_magic == 0x5a4d)
            {
                fs.Position    = 0x3c;
                peHeader       = rdr.ReadUInt32();
                fileHeader     = peHeader + 4;
                optionalHeader = fileHeader + 20;

                fs.Position = optionalHeader;
                peType      = (PEType)rdr.ReadUInt16();

                dataDirectory = peType == PEType.PE32Plus
                    ? optionalHeader + 112
                    : optionalHeader + 96;

                fs.Position             = dataDirectory - 4;
                numDataDirectoryEntries = rdr.ReadUInt32();

                fs.Position  = peHeader;
                pe_signature = rdr.ReadUInt32();
                rdr.ReadUInt16(); // machine
                numberOfSections   = rdr.ReadUInt16();
                fs.Position       += 12;
                optionalHeaderSize = rdr.ReadUInt16();
                dataSections       = optionalHeader + optionalHeaderSize;

                sections    = new DataSection[numberOfSections];
                fs.Position = dataSections;
                for (int i = 0; i < numberOfSections; i++)
                {
                    fs.Position               += 8;
                    sections[i].VirtualSize    = rdr.ReadUInt32();
                    sections[i].VirtualAddress = rdr.ReadUInt32();
                    uint rawDataSize = rdr.ReadUInt32();
                    sections[i].FileOffset = rdr.ReadUInt32();
                    if (sections[i].VirtualSize == 0)
                    {
                        sections[i].VirtualSize = rawDataSize;
                    }

                    fs.Position += 16;
                }

                if (IsDotNetFile)
                {
                    uint rva = DataDirectoryRva(14);
                    if (rva != 0)
                    {
                        fs.Position = RvaToLfa(rva) + 8;
                        uint metadata = rdr.ReadUInt32();
                        fs.Position = RvaToLfa(metadata);
                        if (rdr.ReadUInt32() == 0x424a5342)
                        {
                            // Copy string representing runtime version
                            fs.Position += 12;
                            StringBuilder sb = new StringBuilder();
                            char          c;
                            while ((c = rdr.ReadChar()) != '\0')
                            {
                                sb.Append(c);
                            }

                            if (sb[0] == 'v') // Last sanity check
                            {
                                ImageRuntimeVersion = sb.ToString();
                            }

                            // Could do fixups here for bad values in older files
                            // like 1.x86, 1.build, etc. But we are only using
                            // the major version anyway

                            // Jump back and find the CorFlags
                            fs.Position = RvaToLfa(rva) + 16;
                            corFlags    = (CorFlags)rdr.ReadUInt32();
                        }
                    }
                }
            }
        }