Esempio n. 1
0
 internal ImageSectionInfo(ImageSectionHeader struc, int number, IntPtr address)
 {
     Number          = number;
     Name            = struc.Name;
     Address         = address;
     Size            = (int)struc.VirtualSize;
     Characteristics = struc.Characteristics;
 }
        internal ImageSection(ImageSectionHeader header, bool mapped_as_image, IntPtr base_ptr)
        {
            Name = header.GetName();
            int data_offset = mapped_as_image ? header.VirtualAddress : header.PointerToRawData;
            int data_size   = mapped_as_image ? header.VirtualSize : header.SizeOfRawData;

            Data = new SafeHGlobalBuffer(base_ptr + data_offset, data_size, false);
            RelativeVirtualAddress = header.VirtualAddress;
            Characteristics        = (ImageSectionCharacteristics)(uint)header.Characteristics;
            Characteristics       &= ImageSectionCharacteristics.Code | ImageSectionCharacteristics.Execute | ImageSectionCharacteristics.InitiailizedData
                                     | ImageSectionCharacteristics.Read | ImageSectionCharacteristics.Shared | ImageSectionCharacteristics.UninitializedData | ImageSectionCharacteristics.Write;
        }
Esempio n. 3
0
        public void Read(ReaderContext ctxt, BlobReader reader)
        {
            var name = reader.ReadAsciiZeroPaddedString(8);
            if (string.IsNullOrEmpty(name))
                throw new PEException("invalid SectionHeader.Name");
            if (name.Equals(".text", StringComparison.Ordinal))
                Section = Section.Text;
            else if (name.Equals(".rsrc", StringComparison.Ordinal))
                Section = Section.Rsrc;
            else if (name.Equals(".reloc", StringComparison.Ordinal))
                Section = Section.Reloc;
            else
                throw new PEException("invalid SectionHeader.Name");

            VirtualSize = reader.ReadUInt32();
            VirtualAddress = reader.ReadUInt32();
            SizeOfRawData = reader.ReadUInt32();
            // NOTE: Virtual size may be less than raw data size
            if (VirtualSize > SizeOfRawData)
                // Need to support readers with implicit zero padding at end
                throw new NotImplementedException();
            PointerToRawData.Read(reader);
            PointerToRelocations = reader.ReadUInt32();
            var actualPointerToLinenumbers = reader.ReadUInt32();
            if (actualPointerToLinenumbers != pointerToLinenumbers)
                throw new PEException("invalid SectionHeader.PointerToLinenumbers");
            NumberOfRelocations = reader.ReadUInt16();
            var actualNumberOfLinenumbers = reader.ReadUInt16();
            if (actualNumberOfLinenumbers != numberOfLinenumbers)
                throw new PEException("invalid SectionHeader.NumberOfLinenumbers");
            Characteristics = (ImageSectionCharacteristics)reader.ReadUInt32();

            if (ctxt.Tracer != null)
            {
                ctxt.Tracer.AppendLine("SectionHeader {");
                ctxt.Tracer.Indent();
                ctxt.Tracer.AppendLine(String.Format("Name: {0}", Section.ToString()));
                ctxt.Tracer.AppendLine(String.Format("VirtualSize: {0:x8}", VirtualSize));
                ctxt.Tracer.AppendLine(String.Format("VirtualAddress: {0:x8}", VirtualAddress));
                ctxt.Tracer.AppendLine(String.Format("SizeOfRawData: {0:x8}", SizeOfRawData));
                PointerToRawData.Append(ctxt, "PointerToRawData");
                ctxt.Tracer.Outdent();
                ctxt.Tracer.AppendLine("}");
            }
        }